intelicoreact 1.5.3 → 1.5.4

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.
@@ -9,94 +9,109 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
9
9
  var _react = _interopRequireWildcard(require("react"));
10
10
  var _reactFeather = require("react-feather");
11
11
  var _utils = require("../../../Functions/utils");
12
- var _Input = _interopRequireDefault(require("../Input/Input"));
12
+ var _InputMask = _interopRequireDefault(require("../InputMask3/InputMask3"));
13
13
  require("./FormattedRawSSN.scss");
14
14
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
15
15
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
16
+ const DEFAULT_SSN_MASK = "DDD-DD-DDDD";
17
+ const SIGNIFICANT_CHARACTERS = ['D'];
16
18
  const FormattedRawSSN = _ref => {
17
- var _value$substring;
18
19
  let {
19
20
  value = "",
20
- postfix = "",
21
21
  onChange: onChangeProp = () => {},
22
- maskChar = "*",
23
22
  testId,
23
+ // ! ВСЕ "пляшет" от fullSnnMask и significantChars
24
+ // Маска для полного snn (технически ограничений нет, НО нужно передавать то, что понимает InputMask3)
25
+ fullSnnMask = DEFAULT_SSN_MASK,
26
+ // Значащие символы в fullSnnMask
27
+ // Технически ограничений нет, НО нужно передавать
28
+ // - массив ОДИНОЧНЫХ символов
29
+ // - массив тех символов, которые правильно трактуются в InputMask3 (смотри InputMask3/config)
30
+ significantChars = SIGNIFICANT_CHARACTERS,
31
+ // Символ для маскировки
32
+ maskChar = "*",
33
+ // Инициализационное значение (сразу скрывать или нет)
24
34
  isHiddenDefault = true,
35
+ // Максимальное значение ВВОДИМЫХ цифр
25
36
  maxLen = 9,
37
+ // ? Речь о значащих символах
38
+ // Сколько из ПЕРВЫХ вводимых нужно прятать при включении мода маскировки
39
+ countOfFirstDigitsToHide = 5,
40
+ // ? Речь о значащих символах
41
+ // Статическая часть
42
+ postfix = "",
26
43
  ...args
27
44
  } = _ref;
28
- const [SSN, setSSN] = (0, _react.useState)((_value$substring = value === null || value === void 0 ? void 0 : value.substring(0, maxLen)) !== null && _value$substring !== void 0 ? _value$substring : "");
45
+ // ? Будем пользоваться своим (верхним относительно InputMask3) стейтом
46
+ // ? Это потребует отрисовки триггера "поверх" InputMask3.
29
47
  const [isHidden, setIsHidden] = (0, _react.useState)(isHiddenDefault);
30
48
  const wrapperRef = (0, _react.useRef)(null);
31
- (0, _react.useEffect)(() => {
32
- var _value$toString$subst, _value$toString;
33
- setSSN((_value$toString$subst = value === null || value === void 0 || (_value$toString = value.toString()) === null || _value$toString === void 0 ? void 0 : _value$toString.substring(0, maxLen)) !== null && _value$toString$subst !== void 0 ? _value$toString$subst : "");
34
- }, [value]);
35
49
  const onChange = value => {
36
- if (!value && value !== "") return "";
37
- if (value.replace(/-/g, "").length < SSN.length) {
38
- const last = SSN.length - 1;
39
- setSSN(SSN.slice(0, last));
40
- return;
41
- }
42
- const numValue = value.replace(/\D/g, "");
43
- let newSSN = "";
44
- if (isHidden) {
45
- if (SSN.length > 5) {
46
- newSSN = SSN.slice(0, 5) + numValue;
47
- } else {
48
- newSSN = SSN + numValue;
49
- }
50
- } else {
51
- newSSN = numValue;
52
- }
53
- if (newSSN.length > maxLen) {
54
- return;
55
- }
56
- setSSN(newSSN);
50
+ const newValue = !value && value !== "" ? '' : value === null || value === void 0 ? void 0 : value.toString();
51
+ onChangeProp(newValue);
57
52
  };
58
- const switchView = () => {
59
- var _wrapperRef$current;
60
- const input = wrapperRef === null || wrapperRef === void 0 || (_wrapperRef$current = wrapperRef.current) === null || _wrapperRef$current === void 0 ? void 0 : _wrapperRef$current.querySelector("input");
61
- input === null || input === void 0 || input.focus();
62
- (0, _utils.setCarretToEnd)(input);
63
- setIsHidden(!isHidden);
64
- };
65
- const getFormatedValue = v => {
66
- if (!v) return "";
67
- v = v.slice(0, 11).replace(/-/g, "");
68
- if (v.length <= 3) {
69
- return v;
70
- }
71
- if (v.length > 3 && v.length <= 5) {
72
- return "".concat(v.slice(0, 3), "-").concat(v.slice(3));
73
- }
74
- if (v.length > 5) {
75
- return "".concat(v.slice(0, 3), "-").concat(v.slice(3, 5), "-").concat(v.slice(5));
76
- }
77
- };
78
- const getMaskedValue = v => {
79
- return isHidden ? v.slice(0, 7).replace(/[0-9]/g, maskChar).concat(v.slice(7)) : v;
80
- };
81
- (0, _react.useEffect)(() => {
82
- if (SSN) onChangeProp === null || onChangeProp === void 0 || onChangeProp(SSN.concat(SSN.length === maxLen ? postfix : "").replace(/-/g, ""));
83
- }, [SSN]);
53
+
54
+ // ? Пересчитываем маску с учетом переданного maxLen.
55
+ // ? Если maxLen меньше количества значащих символов в fullSnnMask, то маска корректно обрежется.
56
+ // ? Передаем опцию isOnlyMask: false, чтобы получить НЕ только новую маску, а еще и статистику.
57
+ // ? В этом случае приходит объект формата: { mask, countOfSignificantChars, countOfNotSignificantChars }
58
+ const infoAboutMask = (0, _utils.getLimitedMask)({
59
+ mask: fullSnnMask,
60
+ significantChars: significantChars,
61
+ limit: maxLen,
62
+ isOnlyMask: false
63
+ });
64
+
65
+ // ? Расчитываем ИНДЕКС крайнего символа части маски, которая подлежит скрытию,
66
+ // ? исходя из countOfFirstDigitsToHide
67
+ const maxHiddenIndex = (() => {
68
+ // если не приводится к числу или ноль (передавать ноль лишено смысла)
69
+ if (isNaN(+countOfFirstDigitsToHide) || !+countOfFirstDigitsToHide) return -1;
70
+ // если больше чем значимых символов
71
+ if (countOfFirstDigitsToHide > infoAboutMask.countOfSignificantChars) return infoAboutMask.mask.length;
72
+
73
+ // ? Для расчетов получаем дополнительно корректно "обрезанную" маску (до уровня скрываемой части)
74
+ // ? на основе ранее полученной "обрезанной" по maxLen. Нам нужна НЕ сама маска, а статистика по ней.
75
+ // ? В частности - количество "незначащих" символов содержащихся в скрываемой части
76
+ const infoAboutMaskOfHidden = (0, _utils.getLimitedMask)({
77
+ mask: infoAboutMask.mask,
78
+ significantChars: significantChars,
79
+ limit: countOfFirstDigitsToHide,
80
+ isOnlyMask: false
81
+ });
82
+
83
+ // ? Для InputMask3 maxHiddenIndex должен быть передан относительно длины ВСЕЙ применяемой маски (наша "обрезанная" по maxLen).
84
+ // ? Поэтому к количеству "скрываемых" символов добавляем количество "незначащих", входящих в скрываемую часть маски.
85
+ // ? Т.к. расчитываем НЕ длинну, а индекс - отнимаем 1
86
+ return countOfFirstDigitsToHide + infoAboutMaskOfHidden.countOfNotSignificantChars - 1;
87
+ })();
84
88
  return /*#__PURE__*/_react.default.createElement("div", {
85
89
  className: "formatted-raw-ssn",
86
90
  ref: wrapperRef
87
- }, /*#__PURE__*/_react.default.createElement(_Input.default, (0, _extends2.default)({}, args, {
88
- value: getMaskedValue(getFormatedValue(SSN)),
91
+ }, /*#__PURE__*/_react.default.createElement(_InputMask.default, (0, _extends2.default)({}, args, {
92
+ value: value,
89
93
  onChange: onChange,
90
- testId: "formattedRawSNN--input--key-".concat(testId)
94
+ testId: "formattedRawSNN--input--key-".concat(testId),
95
+ maskPattern: infoAboutMask.mask,
96
+ maskPlaceholder: "X",
97
+ focusSelector: "input",
98
+ isNumericMobileKeyboard: true,
99
+ blinkErrors: true,
100
+ showErrors: false,
101
+ withHiddenMode: true,
102
+ isValueHiddenDefault: isHiddenDefault,
103
+ hiddenChar: maskChar,
104
+ maxHiddenIndex: maxHiddenIndex,
105
+ isHide: isHidden
91
106
  })), postfix && /*#__PURE__*/_react.default.createElement("span", {
92
107
  className: "formatted-raw-ssn-postfix",
93
108
  onClick: () => {
94
- var _wrapperRef$current2;
95
- return wrapperRef === null || wrapperRef === void 0 || (_wrapperRef$current2 = wrapperRef.current) === null || _wrapperRef$current2 === void 0 || (_wrapperRef$current2 = _wrapperRef$current2.querySelector("input")) === null || _wrapperRef$current2 === void 0 ? void 0 : _wrapperRef$current2.focus();
109
+ var _wrapperRef$current;
110
+ return wrapperRef === null || wrapperRef === void 0 || (_wrapperRef$current = wrapperRef.current) === null || _wrapperRef$current === void 0 || (_wrapperRef$current = _wrapperRef$current.querySelector("input")) === null || _wrapperRef$current === void 0 ? void 0 : _wrapperRef$current.focus();
96
111
  }
97
112
  }, postfix), /*#__PURE__*/_react.default.createElement("span", {
98
113
  className: "formatted-raw-ssn-eye-holder",
99
- onClick: switchView,
114
+ onClick: () => setIsHidden(!isHidden),
100
115
  "data-testid": "formattedRawSNN--eye--key-".concat(testId, "--container")
101
116
  }, " ", isHidden ? /*#__PURE__*/_react.default.createElement(_reactFeather.Eye, {
102
117
  strokeWidth: 1,
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ var _reactFeather = require("react-feather");
11
+ var _utils = require("../../../Functions/utils");
12
+ var _Input = _interopRequireDefault(require("../Input/Input"));
13
+ require("./FormattedRawSSN.scss");
14
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
15
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
16
+ const FormattedRawSSN = _ref => {
17
+ var _value$substring;
18
+ let {
19
+ value = "",
20
+ postfix = "",
21
+ onChange: onChangeProp = () => {},
22
+ maskChar = "*",
23
+ testId,
24
+ isHiddenDefault = true,
25
+ maxLen = 9,
26
+ ...args
27
+ } = _ref;
28
+ const [SSN, setSSN] = (0, _react.useState)((_value$substring = value === null || value === void 0 ? void 0 : value.substring(0, maxLen)) !== null && _value$substring !== void 0 ? _value$substring : "");
29
+ const [isHidden, setIsHidden] = (0, _react.useState)(isHiddenDefault);
30
+ const wrapperRef = (0, _react.useRef)(null);
31
+ (0, _react.useEffect)(() => {
32
+ var _value$toString$subst, _value$toString;
33
+ setSSN((_value$toString$subst = value === null || value === void 0 || (_value$toString = value.toString()) === null || _value$toString === void 0 ? void 0 : _value$toString.substring(0, maxLen)) !== null && _value$toString$subst !== void 0 ? _value$toString$subst : "");
34
+ }, [value]);
35
+ const onChange = value => {
36
+ if (!value && value !== "") return "";
37
+ if (value.replace(/-/g, "").length < SSN.length) {
38
+ const last = SSN.length - 1;
39
+ setSSN(SSN.slice(0, last));
40
+ return;
41
+ }
42
+ const numValue = value.replace(/\D/g, "");
43
+ let newSSN = "";
44
+ if (isHidden) {
45
+ if (SSN.length > 5) {
46
+ newSSN = SSN.slice(0, 5) + numValue;
47
+ } else {
48
+ newSSN = SSN + numValue;
49
+ }
50
+ } else {
51
+ newSSN = numValue;
52
+ }
53
+ if (newSSN.length > maxLen) {
54
+ return;
55
+ }
56
+ setSSN(newSSN);
57
+ };
58
+ const switchView = () => {
59
+ var _wrapperRef$current;
60
+ const input = wrapperRef === null || wrapperRef === void 0 || (_wrapperRef$current = wrapperRef.current) === null || _wrapperRef$current === void 0 ? void 0 : _wrapperRef$current.querySelector("input");
61
+ input === null || input === void 0 || input.focus();
62
+ (0, _utils.setCarretToEnd)(input);
63
+ setIsHidden(!isHidden);
64
+ };
65
+ const getFormatedValue = v => {
66
+ if (!v) return "";
67
+ v = v.slice(0, 11).replace(/-/g, "");
68
+ if (v.length <= 3) {
69
+ return v;
70
+ }
71
+ if (v.length > 3 && v.length <= 5) {
72
+ return "".concat(v.slice(0, 3), "-").concat(v.slice(3));
73
+ }
74
+ if (v.length > 5) {
75
+ return "".concat(v.slice(0, 3), "-").concat(v.slice(3, 5), "-").concat(v.slice(5));
76
+ }
77
+ };
78
+ const getMaskedValue = v => {
79
+ return isHidden ? v.slice(0, 7).replace(/[0-9]/g, maskChar).concat(v.slice(7)) : v;
80
+ };
81
+ (0, _react.useEffect)(() => {
82
+ if (SSN) onChangeProp === null || onChangeProp === void 0 || onChangeProp(SSN.concat(SSN.length === maxLen ? postfix : "").replace(/-/g, ""));
83
+ }, [SSN]);
84
+ return /*#__PURE__*/_react.default.createElement("div", {
85
+ className: "formatted-raw-ssn",
86
+ ref: wrapperRef
87
+ }, /*#__PURE__*/_react.default.createElement(_Input.default, (0, _extends2.default)({}, args, {
88
+ value: getMaskedValue(getFormatedValue(SSN)),
89
+ onChange: onChange,
90
+ testId: "formattedRawSNN--input--key-".concat(testId)
91
+ })), postfix && /*#__PURE__*/_react.default.createElement("span", {
92
+ className: "formatted-raw-ssn-postfix",
93
+ onClick: () => {
94
+ var _wrapperRef$current2;
95
+ return wrapperRef === null || wrapperRef === void 0 || (_wrapperRef$current2 = wrapperRef.current) === null || _wrapperRef$current2 === void 0 || (_wrapperRef$current2 = _wrapperRef$current2.querySelector("input")) === null || _wrapperRef$current2 === void 0 ? void 0 : _wrapperRef$current2.focus();
96
+ }
97
+ }, postfix), /*#__PURE__*/_react.default.createElement("span", {
98
+ className: "formatted-raw-ssn-eye-holder",
99
+ onClick: switchView,
100
+ "data-testid": "formattedRawSNN--eye--key-".concat(testId, "--container")
101
+ }, " ", isHidden ? /*#__PURE__*/_react.default.createElement(_reactFeather.Eye, {
102
+ strokeWidth: 1,
103
+ className: "password-icon"
104
+ }) : /*#__PURE__*/_react.default.createElement(_reactFeather.EyeOff, {
105
+ strokeWidth: 1,
106
+ className: "password-icon"
107
+ })));
108
+ };
109
+ var _default = exports.default = FormattedRawSSN;
@@ -35,10 +35,21 @@ function InputMask3() {
35
35
  adaptTextCase,
36
36
  isUseAutoSelect = true,
37
37
  isLoading = false,
38
- hiddenChar = "*",
38
+ // Включает/отключает режим скрытия в принциепе.
39
39
  withHiddenMode = false,
40
+ // Символ которым скрывааеются символы
41
+ hiddenChar = "*",
42
+ // Индекс последнего скрываемогосимвола
43
+ // Индекс нужно передавать с УЧЕТОМ не значащих символов маски,
44
+ // при этом не значащие символы скрываться НЕ будут
40
45
  maxHiddenIndex = -1,
46
+ // Инициализационнное значение положения "скрыть" (если НЕ управляется сверху)
41
47
  isValueHiddenDefault = false,
48
+ // ? Если передана как булева, то режим скрытия управляется ей, здешний триггер (глазик) НЕ рендерится
49
+ // ? Если НЕ передана ка булева, то режим скрытия обеспечиватся своим внутренним стором, здешний триггер (глазик) рендерится
50
+ isHide,
51
+ // булева пропа для управления сверху
52
+
42
53
  icon,
43
54
  showIcon,
44
55
  isIconLeft,
@@ -81,7 +92,8 @@ function InputMask3() {
81
92
  const [isFocused, setFocused] = (0, _react.useState)(false);
82
93
  const [isInitValue, setIsInitValue] = (0, _react.useState)(false);
83
94
  const [selectedLength, setSelectedLength] = (0, _react.useState)(0);
84
- const [isValueHidden, setIsValueHidden] = (0, _react.useState)(isValueHiddenDefault);
95
+ //? Если управляется сверху, то инициируемся текущим внешним значением
96
+ const [isValueHidden, setIsValueHidden] = (0, _react.useState)(typeof isHide === 'boolean' ? isHide : isValueHiddenDefault);
85
97
  const inputRef = (0, _react.useRef)(null);
86
98
  const keyDownRef = (0, _react.useRef)(null);
87
99
  const setKeyDown = keyCode => keyDownRef.current = keyCode;
@@ -428,7 +440,9 @@ function InputMask3() {
428
440
  }
429
441
  const numValue = value.replace(/\D/g, "");
430
442
  let newSSN = "";
431
- const staticLength = maxHiddenIndex !== -1 ? maxHiddenIndex : (_maskPattern3 = maskPattern) === null || _maskPattern3 === void 0 ? void 0 : _maskPattern3.length;
443
+
444
+ //! maxHiddenIndex - это индекс, НЕ length. Поэтому нужно добавить 1
445
+ const staticLength = maxHiddenIndex !== -1 ? maxHiddenIndex + 1 : (_maskPattern3 = maskPattern) === null || _maskPattern3 === void 0 ? void 0 : _maskPattern3.length;
432
446
  if (SSN.length > staticLength) {
433
447
  newSSN = SSN.slice(0, staticLength) + numValue;
434
448
  } else {
@@ -465,9 +479,11 @@ function InputMask3() {
465
479
  setCaret(0);
466
480
  clearErrorMessage();
467
481
  };
468
- const onHiddenToggle = () => {
482
+ const onHiddenToggle = value => {
469
483
  var _inputRef$current2;
470
- setIsValueHidden(v => !v);
484
+ // ? Добавлена возможность принудительной установки велью (опционально)
485
+ const newValue = typeof value === 'boolean' ? value : !isValueHidden;
486
+ setIsValueHidden(newValue);
471
487
  inputRef === null || inputRef === void 0 || (_inputRef$current2 = inputRef.current) === null || _inputRef$current2 === void 0 || _inputRef$current2.focus();
472
488
  };
473
489
  const onFocus = () => {
@@ -550,6 +566,11 @@ function InputMask3() {
550
566
  setError(customError !== "");
551
567
  setErrorMessage(customError === "" ? errors.default : customError);
552
568
  }, [customError, isError]);
569
+ (0, _react.useEffect)(() => {
570
+ if (typeof isHide === 'boolean') {
571
+ onHiddenToggle(isHide);
572
+ }
573
+ }, [isHide]);
553
574
 
554
575
  /// --- RENDER ---///
555
576
 
@@ -677,7 +698,7 @@ function InputMask3() {
677
698
  tabIndex: -1
678
699
  }, /*#__PURE__*/_react.default.createElement("div", {
679
700
  className: "\n input-mask\n ".concat(isError ? "input-mask_error" : "", "\n ").concat(isFocused ? "input-mask_focus" : "", "\n ").concat(blinkError ? "input-mask_blink-error" : "", "\n ")
680
- }, showHint && isHintLeft && renderHint(), isIconLeft && showIcon && renderIcon("left"), renderMask(), renderInput(), withHiddenMode && renderHideToggler(), isClearable && renderClearButton(), isIconRight && showIcon && renderIcon("right"), showHint && isHintRight && renderHint()), showErrors && errorMessage && /*#__PURE__*/_react.default.createElement("div", {
701
+ }, showHint && isHintLeft && renderHint(), isIconLeft && showIcon && renderIcon("left"), renderMask(), renderInput(), withHiddenMode && typeof isHide !== 'boolean' && renderHideToggler(), isClearable && renderClearButton(), isIconRight && showIcon && renderIcon("right"), showHint && isHintRight && renderHint()), showErrors && errorMessage && /*#__PURE__*/_react.default.createElement("div", {
681
702
  className: "input-mask_error-text"
682
703
  }, errorMessage), isLoading && /*#__PURE__*/_react.default.createElement(_Spinner.default, {
683
704
  size: "small"
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.disableDefaultBehavior = exports.debounce = exports.compareAlphabetical = exports.compare = exports.clone = exports.checkedRef = exports.changeMeta = exports.capitalized = exports.addBitDepthPoints = void 0;
8
8
  exports.downloadEmulation = downloadEmulation;
9
- exports.throttle = exports.setCarretToEnd = exports.renderFileSize = exports.omitKeys = exports.logout = exports.handleObjectChange = exports.getUniqueFileExtensions = exports.getStyles = exports.getResponseClone = exports.getOS = exports.getIsOnlyAnObject = exports.getCorrectTestId = exports.getColorById = exports.getBase64 = exports.firstLetterCapital = exports.downloadFile = void 0;
9
+ exports.throttle = exports.setCarretToEnd = exports.renderFileSize = exports.omitKeys = exports.logout = exports.handleObjectChange = exports.getUniqueFileExtensions = exports.getStyles = exports.getResponseClone = exports.getOS = exports.getLimitedMask = exports.getIsOnlyAnObject = exports.getCorrectTestId = exports.getColorById = exports.getBase64 = exports.firstLetterCapital = exports.downloadFile = void 0;
10
10
  exports.transformDateOrTimeOrTogetherToFormat = transformDateOrTimeOrTogetherToFormat;
11
11
  exports.transformDateOrTimeOrTogetherToFormattedLocal = transformDateOrTimeOrTogetherToFormattedLocal;
12
12
  exports.transformLocalTimeToUTC = transformLocalTimeToUTC;
@@ -443,4 +443,64 @@ const getCorrectTestId = _ref3 => {
443
443
  } = _ref3;
444
444
  return testId && testId !== undefined ? "".concat(withTier ? "-" : "").concat(testId) : "";
445
445
  };
446
- exports.getCorrectTestId = getCorrectTestId;
446
+
447
+ //? Метод возращает корректно обрезанную маску с учетом лимита значащих символов
448
+ exports.getCorrectTestId = getCorrectTestId;
449
+ const getLimitedMask = props => {
450
+ const {
451
+ mask = '',
452
+ significantChars = [],
453
+ limit,
454
+ isOnlyMask = true
455
+ } = props;
456
+
457
+ // ? Проверяем основные входные пропы
458
+ if (typeof mask !== 'string' || !Array.isArray(significantChars) || !significantChars.every(item => typeof item === 'string' && item.length === 1)) {
459
+ // ? Если нужна только маска возвращаем никакую маску,
460
+ // ? иначе - объект с никакой маской и нулевой статистикой
461
+ return isOnlyMask ? '' : {
462
+ mask: '',
463
+ countOfSignificantChars: 0,
464
+ countOfNotSignificantChars: 0
465
+ };
466
+ }
467
+
468
+ // Ф-я расчёта количества "значащих" символов в маске
469
+ const getCountOfSignificantChars = mask => mask.split('').filter(sym => significantChars.includes(sym)).length;
470
+
471
+ // ? Расчитываем безопасный лимит
472
+ const safelyLimit = (() => {
473
+ const COUNT_OF_SIGNIFICANT_CHARS = getCountOfSignificantChars(mask);
474
+
475
+ //? Если нельзя привести к числу, то лимитом считаем ВСЕ "значащие" символы в маске
476
+ const outputLimit = isNaN(+limit) ? COUNT_OF_SIGNIFICANT_CHARS : +limit;
477
+
478
+ //? Если выходной лимит ноль или больше количества "значащих" символов в маске,
479
+ //? то лимитом считаем ВСЕ "значащие" символы в маске
480
+ if (!outputLimit || outputLimit > COUNT_OF_SIGNIFICANT_CHARS) return COUNT_OF_SIGNIFICANT_CHARS;
481
+ return outputLimit;
482
+ })();
483
+
484
+ // ? Корректно "обрезаем" маску с учетом того, сколько "значащих" символов должно в нее войти
485
+ const limitedMask = mask.split('').reduce((acc, sym) => {
486
+ // ? "Нарасчиваем" маску до тех пор, пока счетчик не достигнет лимита
487
+ if (acc.count < safelyLimit) {
488
+ acc.result += sym;
489
+ // ? Если добавленный символ "значащий" - увеличиваем счетчик
490
+ if (significantChars.includes(sym)) acc.count += 1;
491
+ }
492
+ return acc;
493
+ }, {
494
+ result: '',
495
+ count: 0
496
+ }).result;
497
+
498
+ // ? Если нужна только маска - возвращаем только маску,
499
+ // ? иначе - объект с новой маской и статистикой по ней
500
+ return isOnlyMask ? limitedMask : {
501
+ mask: limitedMask,
502
+ countOfSignificantChars: safelyLimit,
503
+ countOfNotSignificantChars: limitedMask.length - safelyLimit
504
+ };
505
+ };
506
+ exports.getLimitedMask = getLimitedMask;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "intelicoreact",
3
- "version": "1.5.3",
3
+ "version": "1.5.4",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "files": [