@alfalab/core-components-number-input 1.0.5 → 1.0.7
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/Component.js +50 -39
- package/cssm/Component.js +50 -39
- package/cssm/index.js +2 -0
- package/cssm/utils.d.ts +10 -1
- package/cssm/utils.js +25 -0
- package/esm/Component.js +49 -40
- package/esm/utils.d.ts +10 -1
- package/esm/utils.js +23 -1
- package/index.js +2 -0
- package/modern/Component.js +49 -40
- package/modern/utils.d.ts +10 -1
- package/modern/utils.js +22 -1
- package/package.json +2 -2
- package/utils.d.ts +10 -1
- package/utils.js +25 -0
package/Component.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
3
5
|
var tslib = require('tslib');
|
|
4
6
|
var React = require('react');
|
|
5
7
|
var mergeRefs = require('react-merge-refs');
|
|
@@ -24,59 +26,68 @@ var NumberInput = React__default.default.forwardRef(function (_a, ref) {
|
|
|
24
26
|
}
|
|
25
27
|
return parseFloat(valueString);
|
|
26
28
|
};
|
|
27
|
-
var getNumberRegExp = function () {
|
|
28
|
-
var reStr = '[0-9]+';
|
|
29
|
-
if (fractionLength !== 0) {
|
|
30
|
-
reStr = "".concat(reStr, "[").concat(utils.SEPARATORS.map(function (s) { return "\\".concat(s); }).join(''), "]?[0-9]{0,").concat(fractionLength || Number.MAX_SAFE_INTEGER, "}");
|
|
31
|
-
}
|
|
32
|
-
return new RegExp("^".concat(reStr, "$"));
|
|
33
|
-
};
|
|
34
29
|
var restoreCaret = function (target) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
30
|
+
setTimeout(function () {
|
|
31
|
+
var input = target;
|
|
32
|
+
var positionCursor = input.selectionStart || 0;
|
|
33
|
+
var isEndPosition = input.value.length === positionCursor;
|
|
34
|
+
var enteredSign = utils.SIGNS.some(function (s) { return s === input.value[positionCursor - 1]; });
|
|
35
|
+
var enteredSeparator = utils.SEPARATORS.filter(function (s) { return s !== separator; }).some(function (s) { return s === input.value[positionCursor - 1]; });
|
|
36
|
+
var shouldRestore = enteredSeparator || enteredSign;
|
|
37
|
+
if (!isEndPosition && shouldRestore) {
|
|
43
38
|
input.selectionStart = positionCursor;
|
|
44
39
|
input.selectionEnd = positionCursor;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
40
|
+
}
|
|
41
|
+
});
|
|
47
42
|
};
|
|
48
43
|
var handleChange = function (event) {
|
|
49
44
|
var input = event.target;
|
|
50
|
-
var
|
|
51
|
-
var
|
|
52
|
-
|
|
53
|
-
:
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
if (uncontrolled) {
|
|
63
|
-
setValue(newValue);
|
|
64
|
-
}
|
|
65
|
-
restoreCaret(input);
|
|
45
|
+
var newValue = input.value.replace(utils.createSeparatorsRegExp(), separator);
|
|
46
|
+
var allowedValue = utils.getAllowedValue({
|
|
47
|
+
value: newValue,
|
|
48
|
+
fractionLength: fractionLength,
|
|
49
|
+
allowSigns: allowSigns,
|
|
50
|
+
separator: separator,
|
|
51
|
+
});
|
|
52
|
+
if (onChange) {
|
|
53
|
+
onChange(event, {
|
|
54
|
+
value: getNumberValueFromStr(allowedValue),
|
|
55
|
+
valueString: allowedValue,
|
|
56
|
+
});
|
|
66
57
|
}
|
|
58
|
+
if (uncontrolled) {
|
|
59
|
+
setValue(allowedValue);
|
|
60
|
+
}
|
|
61
|
+
restoreCaret(input);
|
|
67
62
|
};
|
|
68
63
|
var handleKeyDown = function (event) {
|
|
69
64
|
var disallowedSymbols = /[/|?!@#$%^&*()_=A-Za-zА-Яа-яЁё ]/;
|
|
70
|
-
var oneKeyPress = !event.altKey && !event.metaKey && !event.ctrlKey
|
|
71
|
-
// Запрещаем вводить неразрешенные символы за исключением
|
|
65
|
+
var oneKeyPress = !event.altKey && !event.metaKey && !event.ctrlKey;
|
|
66
|
+
// Запрещаем вводить неразрешенные символы за исключением комбинаций клавиш
|
|
72
67
|
if (oneKeyPress && event.key.length === 1 && disallowedSymbols.test(event.key)) {
|
|
73
|
-
event.preventDefault();
|
|
68
|
+
return event.preventDefault();
|
|
74
69
|
}
|
|
70
|
+
var val = event.target.value;
|
|
71
|
+
var hasSeparator = (val.match(utils.createSeparatorsRegExp()) || []).length > 0;
|
|
75
72
|
// Запрещаем вводить второй сепаратор
|
|
76
|
-
if (utils.SEPARATORS.some(function (s) { return s === event.key; })
|
|
77
|
-
|
|
78
|
-
|
|
73
|
+
if (hasSeparator && utils.SEPARATORS.some(function (s) { return s === event.key; })) {
|
|
74
|
+
return event.preventDefault();
|
|
75
|
+
}
|
|
76
|
+
// Запрещаем вводить лишний знак
|
|
77
|
+
if ((!allowSigns || utils.SIGNS.some(function (s) { return s === val[0]; })) &&
|
|
78
|
+
utils.SIGNS.some(function (s) { return s === event.key; })) {
|
|
79
|
+
return event.preventDefault();
|
|
80
|
+
}
|
|
81
|
+
var selectionStart = event.target.selectionStart || 0;
|
|
82
|
+
// Запрещаем вводить цифры в дробную часть, если кол-во цифр больше fractionLength
|
|
83
|
+
if (hasSeparator &&
|
|
84
|
+
fractionLength &&
|
|
85
|
+
event.key.length === 1 &&
|
|
86
|
+
selectionStart > val.indexOf(separator) &&
|
|
87
|
+
val.split(separator)[1].length >= fractionLength) {
|
|
88
|
+
return event.preventDefault();
|
|
79
89
|
}
|
|
90
|
+
return undefined;
|
|
80
91
|
};
|
|
81
92
|
var handleBlur = function (event) {
|
|
82
93
|
var valueBlur = event.target.value.replace(new RegExp("\\".concat(separator, "$")), '');
|
package/cssm/Component.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
3
5
|
var tslib = require('tslib');
|
|
4
6
|
var React = require('react');
|
|
5
7
|
var mergeRefs = require('react-merge-refs');
|
|
@@ -24,59 +26,68 @@ var NumberInput = React__default.default.forwardRef(function (_a, ref) {
|
|
|
24
26
|
}
|
|
25
27
|
return parseFloat(valueString);
|
|
26
28
|
};
|
|
27
|
-
var getNumberRegExp = function () {
|
|
28
|
-
var reStr = '[0-9]+';
|
|
29
|
-
if (fractionLength !== 0) {
|
|
30
|
-
reStr = "".concat(reStr, "[").concat(utils.SEPARATORS.map(function (s) { return "\\".concat(s); }).join(''), "]?[0-9]{0,").concat(fractionLength || Number.MAX_SAFE_INTEGER, "}");
|
|
31
|
-
}
|
|
32
|
-
return new RegExp("^".concat(reStr, "$"));
|
|
33
|
-
};
|
|
34
29
|
var restoreCaret = function (target) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
30
|
+
setTimeout(function () {
|
|
31
|
+
var input = target;
|
|
32
|
+
var positionCursor = input.selectionStart || 0;
|
|
33
|
+
var isEndPosition = input.value.length === positionCursor;
|
|
34
|
+
var enteredSign = utils.SIGNS.some(function (s) { return s === input.value[positionCursor - 1]; });
|
|
35
|
+
var enteredSeparator = utils.SEPARATORS.filter(function (s) { return s !== separator; }).some(function (s) { return s === input.value[positionCursor - 1]; });
|
|
36
|
+
var shouldRestore = enteredSeparator || enteredSign;
|
|
37
|
+
if (!isEndPosition && shouldRestore) {
|
|
43
38
|
input.selectionStart = positionCursor;
|
|
44
39
|
input.selectionEnd = positionCursor;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
40
|
+
}
|
|
41
|
+
});
|
|
47
42
|
};
|
|
48
43
|
var handleChange = function (event) {
|
|
49
44
|
var input = event.target;
|
|
50
|
-
var
|
|
51
|
-
var
|
|
52
|
-
|
|
53
|
-
:
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
if (uncontrolled) {
|
|
63
|
-
setValue(newValue);
|
|
64
|
-
}
|
|
65
|
-
restoreCaret(input);
|
|
45
|
+
var newValue = input.value.replace(utils.createSeparatorsRegExp(), separator);
|
|
46
|
+
var allowedValue = utils.getAllowedValue({
|
|
47
|
+
value: newValue,
|
|
48
|
+
fractionLength: fractionLength,
|
|
49
|
+
allowSigns: allowSigns,
|
|
50
|
+
separator: separator,
|
|
51
|
+
});
|
|
52
|
+
if (onChange) {
|
|
53
|
+
onChange(event, {
|
|
54
|
+
value: getNumberValueFromStr(allowedValue),
|
|
55
|
+
valueString: allowedValue,
|
|
56
|
+
});
|
|
66
57
|
}
|
|
58
|
+
if (uncontrolled) {
|
|
59
|
+
setValue(allowedValue);
|
|
60
|
+
}
|
|
61
|
+
restoreCaret(input);
|
|
67
62
|
};
|
|
68
63
|
var handleKeyDown = function (event) {
|
|
69
64
|
var disallowedSymbols = /[/|?!@#$%^&*()_=A-Za-zА-Яа-яЁё ]/;
|
|
70
|
-
var oneKeyPress = !event.altKey && !event.metaKey && !event.ctrlKey
|
|
71
|
-
// Запрещаем вводить неразрешенные символы за исключением
|
|
65
|
+
var oneKeyPress = !event.altKey && !event.metaKey && !event.ctrlKey;
|
|
66
|
+
// Запрещаем вводить неразрешенные символы за исключением комбинаций клавиш
|
|
72
67
|
if (oneKeyPress && event.key.length === 1 && disallowedSymbols.test(event.key)) {
|
|
73
|
-
event.preventDefault();
|
|
68
|
+
return event.preventDefault();
|
|
74
69
|
}
|
|
70
|
+
var val = event.target.value;
|
|
71
|
+
var hasSeparator = (val.match(utils.createSeparatorsRegExp()) || []).length > 0;
|
|
75
72
|
// Запрещаем вводить второй сепаратор
|
|
76
|
-
if (utils.SEPARATORS.some(function (s) { return s === event.key; })
|
|
77
|
-
|
|
78
|
-
|
|
73
|
+
if (hasSeparator && utils.SEPARATORS.some(function (s) { return s === event.key; })) {
|
|
74
|
+
return event.preventDefault();
|
|
75
|
+
}
|
|
76
|
+
// Запрещаем вводить лишний знак
|
|
77
|
+
if ((!allowSigns || utils.SIGNS.some(function (s) { return s === val[0]; })) &&
|
|
78
|
+
utils.SIGNS.some(function (s) { return s === event.key; })) {
|
|
79
|
+
return event.preventDefault();
|
|
80
|
+
}
|
|
81
|
+
var selectionStart = event.target.selectionStart || 0;
|
|
82
|
+
// Запрещаем вводить цифры в дробную часть, если кол-во цифр больше fractionLength
|
|
83
|
+
if (hasSeparator &&
|
|
84
|
+
fractionLength &&
|
|
85
|
+
event.key.length === 1 &&
|
|
86
|
+
selectionStart > val.indexOf(separator) &&
|
|
87
|
+
val.split(separator)[1].length >= fractionLength) {
|
|
88
|
+
return event.preventDefault();
|
|
79
89
|
}
|
|
90
|
+
return undefined;
|
|
80
91
|
};
|
|
81
92
|
var handleBlur = function (event) {
|
|
82
93
|
var valueBlur = event.target.value.replace(new RegExp("\\".concat(separator, "$")), '');
|
package/cssm/index.js
CHANGED
package/cssm/utils.d.ts
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
declare const SIGNS: string[];
|
|
2
2
|
declare const SEPARATORS: string[];
|
|
3
3
|
declare function createSeparatorsRegExp(): RegExp;
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Проверка вводимых значений.
|
|
6
|
+
*/
|
|
7
|
+
declare const getAllowedValue: ({ value, fractionLength, separator, allowSigns, }: {
|
|
8
|
+
value: string;
|
|
9
|
+
fractionLength?: number | undefined;
|
|
10
|
+
separator: string;
|
|
11
|
+
allowSigns: boolean;
|
|
12
|
+
}) => string;
|
|
13
|
+
export { SIGNS, SEPARATORS, createSeparatorsRegExp, getAllowedValue };
|
package/cssm/utils.js
CHANGED
|
@@ -1,11 +1,36 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
3
5
|
var SIGNS = ['-', '+'];
|
|
4
6
|
var SEPARATORS = [',', '.'];
|
|
5
7
|
function createSeparatorsRegExp() {
|
|
6
8
|
return new RegExp("[".concat(SEPARATORS.map(function (s) { return "\\".concat(s); }).join(''), "]"), 'g');
|
|
7
9
|
}
|
|
10
|
+
var getNumberRegExp = function (fractionLength) {
|
|
11
|
+
var reStr = '[0-9]+';
|
|
12
|
+
if (fractionLength !== 0) {
|
|
13
|
+
reStr = "".concat(reStr, "[").concat(SEPARATORS.map(function (s) { return "\\".concat(s); }).join(''), "]?[0-9]{0,").concat(fractionLength || Number.MAX_SAFE_INTEGER, "}");
|
|
14
|
+
}
|
|
15
|
+
return new RegExp("^".concat(reStr, "$"));
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Проверка вводимых значений.
|
|
19
|
+
*/
|
|
20
|
+
var getAllowedValue = function (_a) {
|
|
21
|
+
var _b = _a.value, value = _b === void 0 ? '' : _b, fractionLength = _a.fractionLength, separator = _a.separator, allowSigns = _a.allowSigns;
|
|
22
|
+
var sign = allowSigns && SIGNS.some(function (s) { return s === value[0]; }) ? value[0] : '';
|
|
23
|
+
var testedValue = sign ? value.slice(1) : value;
|
|
24
|
+
if (getNumberRegExp(fractionLength).test(testedValue)) {
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
var _c = testedValue
|
|
28
|
+
.split(separator)
|
|
29
|
+
.map(function (v) { return v.replace(/[^0-9]/g, ''); }), majorPart = _c[0], minorPart = _c[1];
|
|
30
|
+
return "".concat(sign).concat(majorPart).concat(minorPart ? separator + minorPart.slice(0, fractionLength) : '');
|
|
31
|
+
};
|
|
8
32
|
|
|
9
33
|
exports.SEPARATORS = SEPARATORS;
|
|
10
34
|
exports.SIGNS = SIGNS;
|
|
11
35
|
exports.createSeparatorsRegExp = createSeparatorsRegExp;
|
|
36
|
+
exports.getAllowedValue = getAllowedValue;
|
package/esm/Component.js
CHANGED
|
@@ -2,7 +2,7 @@ import { __rest, __assign } from 'tslib';
|
|
|
2
2
|
import React, { useRef, useState } from 'react';
|
|
3
3
|
import mergeRefs from 'react-merge-refs';
|
|
4
4
|
import { Input } from '@alfalab/core-components-input/esm';
|
|
5
|
-
import {
|
|
5
|
+
import { createSeparatorsRegExp, getAllowedValue, SEPARATORS, SIGNS } from './utils.js';
|
|
6
6
|
|
|
7
7
|
var NumberInput = React.forwardRef(function (_a, ref) {
|
|
8
8
|
var propValue = _a.value, onChange = _a.onChange, onBlur = _a.onBlur, _b = _a.allowSigns, allowSigns = _b === void 0 ? true : _b, _c = _a.separator, separator = _c === void 0 ? ',' : _c, fractionLength = _a.fractionLength, defaultValue = _a.defaultValue, restProps = __rest(_a, ["value", "onChange", "onBlur", "allowSigns", "separator", "fractionLength", "defaultValue"]);
|
|
@@ -17,59 +17,68 @@ var NumberInput = React.forwardRef(function (_a, ref) {
|
|
|
17
17
|
}
|
|
18
18
|
return parseFloat(valueString);
|
|
19
19
|
};
|
|
20
|
-
var getNumberRegExp = function () {
|
|
21
|
-
var reStr = '[0-9]+';
|
|
22
|
-
if (fractionLength !== 0) {
|
|
23
|
-
reStr = "".concat(reStr, "[").concat(SEPARATORS.map(function (s) { return "\\".concat(s); }).join(''), "]?[0-9]{0,").concat(fractionLength || Number.MAX_SAFE_INTEGER, "}");
|
|
24
|
-
}
|
|
25
|
-
return new RegExp("^".concat(reStr, "$"));
|
|
26
|
-
};
|
|
27
20
|
var restoreCaret = function (target) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
21
|
+
setTimeout(function () {
|
|
22
|
+
var input = target;
|
|
23
|
+
var positionCursor = input.selectionStart || 0;
|
|
24
|
+
var isEndPosition = input.value.length === positionCursor;
|
|
25
|
+
var enteredSign = SIGNS.some(function (s) { return s === input.value[positionCursor - 1]; });
|
|
26
|
+
var enteredSeparator = SEPARATORS.filter(function (s) { return s !== separator; }).some(function (s) { return s === input.value[positionCursor - 1]; });
|
|
27
|
+
var shouldRestore = enteredSeparator || enteredSign;
|
|
28
|
+
if (!isEndPosition && shouldRestore) {
|
|
36
29
|
input.selectionStart = positionCursor;
|
|
37
30
|
input.selectionEnd = positionCursor;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
31
|
+
}
|
|
32
|
+
});
|
|
40
33
|
};
|
|
41
34
|
var handleChange = function (event) {
|
|
42
35
|
var input = event.target;
|
|
43
|
-
var
|
|
44
|
-
var
|
|
45
|
-
|
|
46
|
-
:
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
if (uncontrolled) {
|
|
56
|
-
setValue(newValue);
|
|
57
|
-
}
|
|
58
|
-
restoreCaret(input);
|
|
36
|
+
var newValue = input.value.replace(createSeparatorsRegExp(), separator);
|
|
37
|
+
var allowedValue = getAllowedValue({
|
|
38
|
+
value: newValue,
|
|
39
|
+
fractionLength: fractionLength,
|
|
40
|
+
allowSigns: allowSigns,
|
|
41
|
+
separator: separator,
|
|
42
|
+
});
|
|
43
|
+
if (onChange) {
|
|
44
|
+
onChange(event, {
|
|
45
|
+
value: getNumberValueFromStr(allowedValue),
|
|
46
|
+
valueString: allowedValue,
|
|
47
|
+
});
|
|
59
48
|
}
|
|
49
|
+
if (uncontrolled) {
|
|
50
|
+
setValue(allowedValue);
|
|
51
|
+
}
|
|
52
|
+
restoreCaret(input);
|
|
60
53
|
};
|
|
61
54
|
var handleKeyDown = function (event) {
|
|
62
55
|
var disallowedSymbols = /[/|?!@#$%^&*()_=A-Za-zА-Яа-яЁё ]/;
|
|
63
|
-
var oneKeyPress = !event.altKey && !event.metaKey && !event.ctrlKey
|
|
64
|
-
// Запрещаем вводить неразрешенные символы за исключением
|
|
56
|
+
var oneKeyPress = !event.altKey && !event.metaKey && !event.ctrlKey;
|
|
57
|
+
// Запрещаем вводить неразрешенные символы за исключением комбинаций клавиш
|
|
65
58
|
if (oneKeyPress && event.key.length === 1 && disallowedSymbols.test(event.key)) {
|
|
66
|
-
event.preventDefault();
|
|
59
|
+
return event.preventDefault();
|
|
67
60
|
}
|
|
61
|
+
var val = event.target.value;
|
|
62
|
+
var hasSeparator = (val.match(createSeparatorsRegExp()) || []).length > 0;
|
|
68
63
|
// Запрещаем вводить второй сепаратор
|
|
69
|
-
if (SEPARATORS.some(function (s) { return s === event.key; })
|
|
70
|
-
|
|
71
|
-
|
|
64
|
+
if (hasSeparator && SEPARATORS.some(function (s) { return s === event.key; })) {
|
|
65
|
+
return event.preventDefault();
|
|
66
|
+
}
|
|
67
|
+
// Запрещаем вводить лишний знак
|
|
68
|
+
if ((!allowSigns || SIGNS.some(function (s) { return s === val[0]; })) &&
|
|
69
|
+
SIGNS.some(function (s) { return s === event.key; })) {
|
|
70
|
+
return event.preventDefault();
|
|
71
|
+
}
|
|
72
|
+
var selectionStart = event.target.selectionStart || 0;
|
|
73
|
+
// Запрещаем вводить цифры в дробную часть, если кол-во цифр больше fractionLength
|
|
74
|
+
if (hasSeparator &&
|
|
75
|
+
fractionLength &&
|
|
76
|
+
event.key.length === 1 &&
|
|
77
|
+
selectionStart > val.indexOf(separator) &&
|
|
78
|
+
val.split(separator)[1].length >= fractionLength) {
|
|
79
|
+
return event.preventDefault();
|
|
72
80
|
}
|
|
81
|
+
return undefined;
|
|
73
82
|
};
|
|
74
83
|
var handleBlur = function (event) {
|
|
75
84
|
var valueBlur = event.target.value.replace(new RegExp("\\".concat(separator, "$")), '');
|
package/esm/utils.d.ts
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
declare const SIGNS: string[];
|
|
2
2
|
declare const SEPARATORS: string[];
|
|
3
3
|
declare function createSeparatorsRegExp(): RegExp;
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Проверка вводимых значений.
|
|
6
|
+
*/
|
|
7
|
+
declare const getAllowedValue: ({ value, fractionLength, separator, allowSigns, }: {
|
|
8
|
+
value: string;
|
|
9
|
+
fractionLength?: number | undefined;
|
|
10
|
+
separator: string;
|
|
11
|
+
allowSigns: boolean;
|
|
12
|
+
}) => string;
|
|
13
|
+
export { SIGNS, SEPARATORS, createSeparatorsRegExp, getAllowedValue };
|
package/esm/utils.js
CHANGED
|
@@ -3,5 +3,27 @@ var SEPARATORS = [',', '.'];
|
|
|
3
3
|
function createSeparatorsRegExp() {
|
|
4
4
|
return new RegExp("[".concat(SEPARATORS.map(function (s) { return "\\".concat(s); }).join(''), "]"), 'g');
|
|
5
5
|
}
|
|
6
|
+
var getNumberRegExp = function (fractionLength) {
|
|
7
|
+
var reStr = '[0-9]+';
|
|
8
|
+
if (fractionLength !== 0) {
|
|
9
|
+
reStr = "".concat(reStr, "[").concat(SEPARATORS.map(function (s) { return "\\".concat(s); }).join(''), "]?[0-9]{0,").concat(fractionLength || Number.MAX_SAFE_INTEGER, "}");
|
|
10
|
+
}
|
|
11
|
+
return new RegExp("^".concat(reStr, "$"));
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Проверка вводимых значений.
|
|
15
|
+
*/
|
|
16
|
+
var getAllowedValue = function (_a) {
|
|
17
|
+
var _b = _a.value, value = _b === void 0 ? '' : _b, fractionLength = _a.fractionLength, separator = _a.separator, allowSigns = _a.allowSigns;
|
|
18
|
+
var sign = allowSigns && SIGNS.some(function (s) { return s === value[0]; }) ? value[0] : '';
|
|
19
|
+
var testedValue = sign ? value.slice(1) : value;
|
|
20
|
+
if (getNumberRegExp(fractionLength).test(testedValue)) {
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
var _c = testedValue
|
|
24
|
+
.split(separator)
|
|
25
|
+
.map(function (v) { return v.replace(/[^0-9]/g, ''); }), majorPart = _c[0], minorPart = _c[1];
|
|
26
|
+
return "".concat(sign).concat(majorPart).concat(minorPart ? separator + minorPart.slice(0, fractionLength) : '');
|
|
27
|
+
};
|
|
6
28
|
|
|
7
|
-
export { SEPARATORS, SIGNS, createSeparatorsRegExp };
|
|
29
|
+
export { SEPARATORS, SIGNS, createSeparatorsRegExp, getAllowedValue };
|
package/index.js
CHANGED
package/modern/Component.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { useRef, useState } from 'react';
|
|
2
2
|
import mergeRefs from 'react-merge-refs';
|
|
3
3
|
import { Input } from '@alfalab/core-components-input/modern';
|
|
4
|
-
import {
|
|
4
|
+
import { createSeparatorsRegExp, getAllowedValue, SEPARATORS, SIGNS } from './utils.js';
|
|
5
5
|
|
|
6
6
|
const NumberInput = React.forwardRef(({ value: propValue, onChange, onBlur, allowSigns = true, separator = ',', fractionLength, defaultValue, ...restProps }, ref) => {
|
|
7
7
|
const uncontrolled = propValue === undefined;
|
|
@@ -15,59 +15,68 @@ const NumberInput = React.forwardRef(({ value: propValue, onChange, onBlur, allo
|
|
|
15
15
|
}
|
|
16
16
|
return parseFloat(valueString);
|
|
17
17
|
};
|
|
18
|
-
const getNumberRegExp = () => {
|
|
19
|
-
let reStr = '[0-9]+';
|
|
20
|
-
if (fractionLength !== 0) {
|
|
21
|
-
reStr = `${reStr}[${SEPARATORS.map((s) => `\\${s}`).join('')}]?[0-9]{0,${fractionLength || Number.MAX_SAFE_INTEGER}}`;
|
|
22
|
-
}
|
|
23
|
-
return new RegExp(`^${reStr}$`);
|
|
24
|
-
};
|
|
25
18
|
const restoreCaret = (target) => {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
19
|
+
setTimeout(() => {
|
|
20
|
+
const input = target;
|
|
21
|
+
const positionCursor = input.selectionStart || 0;
|
|
22
|
+
const isEndPosition = input.value.length === positionCursor;
|
|
23
|
+
const enteredSign = SIGNS.some((s) => s === input.value[positionCursor - 1]);
|
|
24
|
+
const enteredSeparator = SEPARATORS.filter((s) => s !== separator).some((s) => s === input.value[positionCursor - 1]);
|
|
25
|
+
const shouldRestore = enteredSeparator || enteredSign;
|
|
26
|
+
if (!isEndPosition && shouldRestore) {
|
|
34
27
|
input.selectionStart = positionCursor;
|
|
35
28
|
input.selectionEnd = positionCursor;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
29
|
+
}
|
|
30
|
+
});
|
|
38
31
|
};
|
|
39
32
|
const handleChange = (event) => {
|
|
40
33
|
const input = event.target;
|
|
41
|
-
const
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
if (uncontrolled) {
|
|
54
|
-
setValue(newValue);
|
|
55
|
-
}
|
|
56
|
-
restoreCaret(input);
|
|
34
|
+
const newValue = input.value.replace(createSeparatorsRegExp(), separator);
|
|
35
|
+
const allowedValue = getAllowedValue({
|
|
36
|
+
value: newValue,
|
|
37
|
+
fractionLength,
|
|
38
|
+
allowSigns,
|
|
39
|
+
separator,
|
|
40
|
+
});
|
|
41
|
+
if (onChange) {
|
|
42
|
+
onChange(event, {
|
|
43
|
+
value: getNumberValueFromStr(allowedValue),
|
|
44
|
+
valueString: allowedValue,
|
|
45
|
+
});
|
|
57
46
|
}
|
|
47
|
+
if (uncontrolled) {
|
|
48
|
+
setValue(allowedValue);
|
|
49
|
+
}
|
|
50
|
+
restoreCaret(input);
|
|
58
51
|
};
|
|
59
52
|
const handleKeyDown = (event) => {
|
|
60
53
|
const disallowedSymbols = /[/|?!@#$%^&*()_=A-Za-zА-Яа-яЁё ]/;
|
|
61
|
-
const oneKeyPress = !event.altKey && !event.metaKey && !event.ctrlKey
|
|
62
|
-
// Запрещаем вводить неразрешенные символы за исключением
|
|
54
|
+
const oneKeyPress = !event.altKey && !event.metaKey && !event.ctrlKey;
|
|
55
|
+
// Запрещаем вводить неразрешенные символы за исключением комбинаций клавиш
|
|
63
56
|
if (oneKeyPress && event.key.length === 1 && disallowedSymbols.test(event.key)) {
|
|
64
|
-
event.preventDefault();
|
|
57
|
+
return event.preventDefault();
|
|
65
58
|
}
|
|
59
|
+
const val = event.target.value;
|
|
60
|
+
const hasSeparator = (val.match(createSeparatorsRegExp()) || []).length > 0;
|
|
66
61
|
// Запрещаем вводить второй сепаратор
|
|
67
|
-
if (SEPARATORS.some((s) => s === event.key)
|
|
68
|
-
|
|
69
|
-
|
|
62
|
+
if (hasSeparator && SEPARATORS.some((s) => s === event.key)) {
|
|
63
|
+
return event.preventDefault();
|
|
64
|
+
}
|
|
65
|
+
// Запрещаем вводить лишний знак
|
|
66
|
+
if ((!allowSigns || SIGNS.some((s) => s === val[0])) &&
|
|
67
|
+
SIGNS.some((s) => s === event.key)) {
|
|
68
|
+
return event.preventDefault();
|
|
69
|
+
}
|
|
70
|
+
const selectionStart = event.target.selectionStart || 0;
|
|
71
|
+
// Запрещаем вводить цифры в дробную часть, если кол-во цифр больше fractionLength
|
|
72
|
+
if (hasSeparator &&
|
|
73
|
+
fractionLength &&
|
|
74
|
+
event.key.length === 1 &&
|
|
75
|
+
selectionStart > val.indexOf(separator) &&
|
|
76
|
+
val.split(separator)[1].length >= fractionLength) {
|
|
77
|
+
return event.preventDefault();
|
|
70
78
|
}
|
|
79
|
+
return undefined;
|
|
71
80
|
};
|
|
72
81
|
const handleBlur = (event) => {
|
|
73
82
|
const valueBlur = event.target.value.replace(new RegExp(`\\${separator}$`), '');
|
package/modern/utils.d.ts
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
declare const SIGNS: string[];
|
|
2
2
|
declare const SEPARATORS: string[];
|
|
3
3
|
declare function createSeparatorsRegExp(): RegExp;
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Проверка вводимых значений.
|
|
6
|
+
*/
|
|
7
|
+
declare const getAllowedValue: ({ value, fractionLength, separator, allowSigns, }: {
|
|
8
|
+
value: string;
|
|
9
|
+
fractionLength?: number | undefined;
|
|
10
|
+
separator: string;
|
|
11
|
+
allowSigns: boolean;
|
|
12
|
+
}) => string;
|
|
13
|
+
export { SIGNS, SEPARATORS, createSeparatorsRegExp, getAllowedValue };
|
package/modern/utils.js
CHANGED
|
@@ -3,5 +3,26 @@ const SEPARATORS = [',', '.'];
|
|
|
3
3
|
function createSeparatorsRegExp() {
|
|
4
4
|
return new RegExp(`[${SEPARATORS.map((s) => `\\${s}`).join('')}]`, 'g');
|
|
5
5
|
}
|
|
6
|
+
const getNumberRegExp = (fractionLength) => {
|
|
7
|
+
let reStr = '[0-9]+';
|
|
8
|
+
if (fractionLength !== 0) {
|
|
9
|
+
reStr = `${reStr}[${SEPARATORS.map((s) => `\\${s}`).join('')}]?[0-9]{0,${fractionLength || Number.MAX_SAFE_INTEGER}}`;
|
|
10
|
+
}
|
|
11
|
+
return new RegExp(`^${reStr}$`);
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Проверка вводимых значений.
|
|
15
|
+
*/
|
|
16
|
+
const getAllowedValue = ({ value = '', fractionLength, separator, allowSigns, }) => {
|
|
17
|
+
const sign = allowSigns && SIGNS.some((s) => s === value[0]) ? value[0] : '';
|
|
18
|
+
const testedValue = sign ? value.slice(1) : value;
|
|
19
|
+
if (getNumberRegExp(fractionLength).test(testedValue)) {
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
const [majorPart, minorPart] = testedValue
|
|
23
|
+
.split(separator)
|
|
24
|
+
.map((v) => v.replace(/[^0-9]/g, ''));
|
|
25
|
+
return `${sign}${majorPart}${minorPart ? separator + minorPart.slice(0, fractionLength) : ''}`;
|
|
26
|
+
};
|
|
6
27
|
|
|
7
|
-
export { SEPARATORS, SIGNS, createSeparatorsRegExp };
|
|
28
|
+
export { SEPARATORS, SIGNS, createSeparatorsRegExp, getAllowedValue };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alfalab/core-components-number-input",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "MIT",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"react": "^16.9.0 || ^17.0.1 || ^18.0.0"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@alfalab/core-components-input": "^11.1.
|
|
20
|
+
"@alfalab/core-components-input": "^11.1.9",
|
|
21
21
|
"react-merge-refs": "^1.1.0",
|
|
22
22
|
"tslib": "^2.4.0"
|
|
23
23
|
}
|
package/utils.d.ts
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
declare const SIGNS: string[];
|
|
2
2
|
declare const SEPARATORS: string[];
|
|
3
3
|
declare function createSeparatorsRegExp(): RegExp;
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Проверка вводимых значений.
|
|
6
|
+
*/
|
|
7
|
+
declare const getAllowedValue: ({ value, fractionLength, separator, allowSigns, }: {
|
|
8
|
+
value: string;
|
|
9
|
+
fractionLength?: number | undefined;
|
|
10
|
+
separator: string;
|
|
11
|
+
allowSigns: boolean;
|
|
12
|
+
}) => string;
|
|
13
|
+
export { SIGNS, SEPARATORS, createSeparatorsRegExp, getAllowedValue };
|
package/utils.js
CHANGED
|
@@ -1,11 +1,36 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
3
5
|
var SIGNS = ['-', '+'];
|
|
4
6
|
var SEPARATORS = [',', '.'];
|
|
5
7
|
function createSeparatorsRegExp() {
|
|
6
8
|
return new RegExp("[".concat(SEPARATORS.map(function (s) { return "\\".concat(s); }).join(''), "]"), 'g');
|
|
7
9
|
}
|
|
10
|
+
var getNumberRegExp = function (fractionLength) {
|
|
11
|
+
var reStr = '[0-9]+';
|
|
12
|
+
if (fractionLength !== 0) {
|
|
13
|
+
reStr = "".concat(reStr, "[").concat(SEPARATORS.map(function (s) { return "\\".concat(s); }).join(''), "]?[0-9]{0,").concat(fractionLength || Number.MAX_SAFE_INTEGER, "}");
|
|
14
|
+
}
|
|
15
|
+
return new RegExp("^".concat(reStr, "$"));
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Проверка вводимых значений.
|
|
19
|
+
*/
|
|
20
|
+
var getAllowedValue = function (_a) {
|
|
21
|
+
var _b = _a.value, value = _b === void 0 ? '' : _b, fractionLength = _a.fractionLength, separator = _a.separator, allowSigns = _a.allowSigns;
|
|
22
|
+
var sign = allowSigns && SIGNS.some(function (s) { return s === value[0]; }) ? value[0] : '';
|
|
23
|
+
var testedValue = sign ? value.slice(1) : value;
|
|
24
|
+
if (getNumberRegExp(fractionLength).test(testedValue)) {
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
var _c = testedValue
|
|
28
|
+
.split(separator)
|
|
29
|
+
.map(function (v) { return v.replace(/[^0-9]/g, ''); }), majorPart = _c[0], minorPart = _c[1];
|
|
30
|
+
return "".concat(sign).concat(majorPart).concat(minorPart ? separator + minorPart.slice(0, fractionLength) : '');
|
|
31
|
+
};
|
|
8
32
|
|
|
9
33
|
exports.SEPARATORS = SEPARATORS;
|
|
10
34
|
exports.SIGNS = SIGNS;
|
|
11
35
|
exports.createSeparatorsRegExp = createSeparatorsRegExp;
|
|
36
|
+
exports.getAllowedValue = getAllowedValue;
|