@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 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
- var input = target;
36
- var positionCursor = input.selectionStart || 0;
37
- var isEndPosition = input.value.length === positionCursor;
38
- var enteredSign = utils.SIGNS.some(function (s) { return s === input.value[positionCursor - 1]; });
39
- var enteredSeparator = utils.SEPARATORS.filter(function (s) { return s !== separator; }).some(function (s) { return s === input.value[positionCursor - 1]; });
40
- var shouldRestore = enteredSeparator || enteredSign;
41
- if (!isEndPosition && shouldRestore) {
42
- setTimeout(function () {
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 numberRe = getNumberRegExp();
51
- var testedValue = allowSigns && utils.SIGNS.some(function (s) { return s === input.value[0]; })
52
- ? input.value.slice(1)
53
- : input.value;
54
- if (testedValue === '' || numberRe.test(testedValue)) {
55
- var newValue = input.value.replace(utils.createSeparatorsRegExp(), separator);
56
- if (onChange) {
57
- onChange(event, {
58
- value: getNumberValueFromStr(newValue),
59
- valueString: newValue,
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 && !event.shiftKey;
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
- (event.target.value.match(utils.createSeparatorsRegExp()) || []).length) {
78
- event.preventDefault();
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
- var input = target;
36
- var positionCursor = input.selectionStart || 0;
37
- var isEndPosition = input.value.length === positionCursor;
38
- var enteredSign = utils.SIGNS.some(function (s) { return s === input.value[positionCursor - 1]; });
39
- var enteredSeparator = utils.SEPARATORS.filter(function (s) { return s !== separator; }).some(function (s) { return s === input.value[positionCursor - 1]; });
40
- var shouldRestore = enteredSeparator || enteredSign;
41
- if (!isEndPosition && shouldRestore) {
42
- setTimeout(function () {
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 numberRe = getNumberRegExp();
51
- var testedValue = allowSigns && utils.SIGNS.some(function (s) { return s === input.value[0]; })
52
- ? input.value.slice(1)
53
- : input.value;
54
- if (testedValue === '' || numberRe.test(testedValue)) {
55
- var newValue = input.value.replace(utils.createSeparatorsRegExp(), separator);
56
- if (onChange) {
57
- onChange(event, {
58
- value: getNumberValueFromStr(newValue),
59
- valueString: newValue,
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 && !event.shiftKey;
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
- (event.target.value.match(utils.createSeparatorsRegExp()) || []).length) {
78
- event.preventDefault();
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
@@ -1,5 +1,7 @@
1
1
  'use strict';
2
2
 
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
3
5
  var Component = require('./Component.js');
4
6
  require('tslib');
5
7
  require('react');
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
- export { SIGNS, SEPARATORS, createSeparatorsRegExp };
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 { SIGNS, createSeparatorsRegExp, SEPARATORS } from './utils.js';
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
- var input = target;
29
- var positionCursor = input.selectionStart || 0;
30
- var isEndPosition = input.value.length === positionCursor;
31
- var enteredSign = SIGNS.some(function (s) { return s === input.value[positionCursor - 1]; });
32
- var enteredSeparator = SEPARATORS.filter(function (s) { return s !== separator; }).some(function (s) { return s === input.value[positionCursor - 1]; });
33
- var shouldRestore = enteredSeparator || enteredSign;
34
- if (!isEndPosition && shouldRestore) {
35
- setTimeout(function () {
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 numberRe = getNumberRegExp();
44
- var testedValue = allowSigns && SIGNS.some(function (s) { return s === input.value[0]; })
45
- ? input.value.slice(1)
46
- : input.value;
47
- if (testedValue === '' || numberRe.test(testedValue)) {
48
- var newValue = input.value.replace(createSeparatorsRegExp(), separator);
49
- if (onChange) {
50
- onChange(event, {
51
- value: getNumberValueFromStr(newValue),
52
- valueString: newValue,
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 && !event.shiftKey;
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
- (event.target.value.match(createSeparatorsRegExp()) || []).length) {
71
- event.preventDefault();
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
- export { SIGNS, SEPARATORS, createSeparatorsRegExp };
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
@@ -1,5 +1,7 @@
1
1
  'use strict';
2
2
 
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
3
5
  var Component = require('./Component.js');
4
6
  require('tslib');
5
7
  require('react');
@@ -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 { SIGNS, createSeparatorsRegExp, SEPARATORS } from './utils.js';
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
- const input = target;
27
- const positionCursor = input.selectionStart || 0;
28
- const isEndPosition = input.value.length === positionCursor;
29
- const enteredSign = SIGNS.some((s) => s === input.value[positionCursor - 1]);
30
- const enteredSeparator = SEPARATORS.filter((s) => s !== separator).some((s) => s === input.value[positionCursor - 1]);
31
- const shouldRestore = enteredSeparator || enteredSign;
32
- if (!isEndPosition && shouldRestore) {
33
- setTimeout(() => {
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 numberRe = getNumberRegExp();
42
- const testedValue = allowSigns && SIGNS.some((s) => s === input.value[0])
43
- ? input.value.slice(1)
44
- : input.value;
45
- if (testedValue === '' || numberRe.test(testedValue)) {
46
- const newValue = input.value.replace(createSeparatorsRegExp(), separator);
47
- if (onChange) {
48
- onChange(event, {
49
- value: getNumberValueFromStr(newValue),
50
- valueString: newValue,
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 && !event.shiftKey;
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
- (event.target.value.match(createSeparatorsRegExp()) || []).length) {
69
- event.preventDefault();
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
- export { SIGNS, SEPARATORS, createSeparatorsRegExp };
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.5",
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.8",
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
- export { SIGNS, SEPARATORS, createSeparatorsRegExp };
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;