@salutejs/plasma-new-hope 0.146.0-dev.0 → 0.147.0-canary.1418.10899581491.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (136) hide show
  1. package/cjs/components/Mask/Mask.js +209 -0
  2. package/cjs/components/Mask/Mask.js.map +1 -0
  3. package/cjs/components/Mask/utils/constants.js +33 -0
  4. package/cjs/components/Mask/utils/constants.js.map +1 -0
  5. package/cjs/components/Mask/utils/createMask.js +53 -0
  6. package/cjs/components/Mask/utils/createMask.js.map +1 -0
  7. package/cjs/components/Mask/utils/mask.js +244 -0
  8. package/cjs/components/Mask/utils/mask.js.map +1 -0
  9. package/cjs/components/Mask/utils/parseMask.js +38 -0
  10. package/cjs/components/Mask/utils/parseMask.js.map +1 -0
  11. package/cjs/components/Mask/utils/processInput.js +54 -0
  12. package/cjs/components/Mask/utils/processInput.js.map +1 -0
  13. package/cjs/components/Mask/utils/processMask.js +101 -0
  14. package/cjs/components/Mask/utils/processMask.js.map +1 -0
  15. package/cjs/components/Mask/utils/selection.js +50 -0
  16. package/cjs/components/Mask/utils/selection.js.map +1 -0
  17. package/cjs/components/TextField/TextField.js +3 -1
  18. package/cjs/components/TextField/TextField.js.map +1 -1
  19. package/cjs/index.js +2 -0
  20. package/cjs/index.js.map +1 -1
  21. package/emotion/cjs/components/Mask/Mask.js +220 -0
  22. package/emotion/cjs/components/Mask/Mask.template-doc.mdx +126 -0
  23. package/emotion/cjs/components/Mask/Mask.types.js +5 -0
  24. package/emotion/cjs/components/Mask/index.js +12 -0
  25. package/emotion/cjs/components/Mask/utils/constants.js +29 -0
  26. package/emotion/cjs/components/Mask/utils/createMask.js +50 -0
  27. package/emotion/cjs/components/Mask/utils/mask.js +247 -0
  28. package/emotion/cjs/components/Mask/utils/parseMask.js +36 -0
  29. package/emotion/cjs/components/Mask/utils/processInput.js +52 -0
  30. package/emotion/cjs/components/Mask/utils/processMask.js +99 -0
  31. package/emotion/cjs/components/Mask/utils/selection.js +48 -0
  32. package/emotion/cjs/components/TextField/TextField.js +4 -2
  33. package/emotion/cjs/examples/plasma_b2c/components/Mask/Mask.js +9 -0
  34. package/emotion/cjs/examples/plasma_b2c/components/Mask/Mask.stories.tsx +127 -0
  35. package/emotion/cjs/examples/plasma_web/components/Mask/Mask.js +9 -0
  36. package/emotion/cjs/examples/plasma_web/components/Mask/Mask.stories.tsx +125 -0
  37. package/emotion/cjs/index.js +11 -0
  38. package/emotion/es/components/Mask/Mask.js +212 -0
  39. package/emotion/es/components/Mask/Mask.template-doc.mdx +126 -0
  40. package/emotion/es/components/Mask/Mask.types.js +1 -0
  41. package/emotion/es/components/Mask/index.js +1 -0
  42. package/emotion/es/components/Mask/utils/constants.js +23 -0
  43. package/emotion/es/components/Mask/utils/createMask.js +44 -0
  44. package/emotion/es/components/Mask/utils/mask.js +243 -0
  45. package/emotion/es/components/Mask/utils/parseMask.js +30 -0
  46. package/emotion/es/components/Mask/utils/processInput.js +46 -0
  47. package/emotion/es/components/Mask/utils/processMask.js +93 -0
  48. package/emotion/es/components/Mask/utils/selection.js +42 -0
  49. package/emotion/es/components/TextField/TextField.js +4 -2
  50. package/emotion/es/examples/plasma_b2c/components/Mask/Mask.js +3 -0
  51. package/emotion/es/examples/plasma_b2c/components/Mask/Mask.stories.tsx +127 -0
  52. package/emotion/es/examples/plasma_web/components/Mask/Mask.js +3 -0
  53. package/emotion/es/examples/plasma_web/components/Mask/Mask.stories.tsx +125 -0
  54. package/emotion/es/index.js +2 -1
  55. package/es/components/Mask/Mask.js +205 -0
  56. package/es/components/Mask/Mask.js.map +1 -0
  57. package/es/components/Mask/utils/constants.js +26 -0
  58. package/es/components/Mask/utils/constants.js.map +1 -0
  59. package/es/components/Mask/utils/createMask.js +48 -0
  60. package/es/components/Mask/utils/createMask.js.map +1 -0
  61. package/es/components/Mask/utils/mask.js +240 -0
  62. package/es/components/Mask/utils/mask.js.map +1 -0
  63. package/es/components/Mask/utils/parseMask.js +34 -0
  64. package/es/components/Mask/utils/parseMask.js.map +1 -0
  65. package/es/components/Mask/utils/processInput.js +50 -0
  66. package/es/components/Mask/utils/processInput.js.map +1 -0
  67. package/es/components/Mask/utils/processMask.js +97 -0
  68. package/es/components/Mask/utils/processMask.js.map +1 -0
  69. package/es/components/Mask/utils/selection.js +46 -0
  70. package/es/components/Mask/utils/selection.js.map +1 -0
  71. package/es/components/TextField/TextField.js +3 -1
  72. package/es/components/TextField/TextField.js.map +1 -1
  73. package/es/index.js +1 -0
  74. package/es/index.js.map +1 -1
  75. package/package.json +2 -2
  76. package/styled-components/cjs/components/Mask/Mask.js +220 -0
  77. package/styled-components/cjs/components/Mask/Mask.template-doc.mdx +126 -0
  78. package/styled-components/cjs/components/Mask/Mask.types.js +5 -0
  79. package/styled-components/cjs/components/Mask/index.js +12 -0
  80. package/styled-components/cjs/components/Mask/utils/constants.js +29 -0
  81. package/styled-components/cjs/components/Mask/utils/createMask.js +50 -0
  82. package/styled-components/cjs/components/Mask/utils/mask.js +247 -0
  83. package/styled-components/cjs/components/Mask/utils/parseMask.js +36 -0
  84. package/styled-components/cjs/components/Mask/utils/processInput.js +52 -0
  85. package/styled-components/cjs/components/Mask/utils/processMask.js +99 -0
  86. package/styled-components/cjs/components/Mask/utils/selection.js +48 -0
  87. package/styled-components/cjs/components/TextField/TextField.js +3 -1
  88. package/styled-components/cjs/examples/plasma_b2c/components/Mask/Mask.js +9 -0
  89. package/styled-components/cjs/examples/plasma_b2c/components/Mask/Mask.stories.tsx +127 -0
  90. package/styled-components/cjs/examples/plasma_web/components/Mask/Mask.js +9 -0
  91. package/styled-components/cjs/examples/plasma_web/components/Mask/Mask.stories.tsx +125 -0
  92. package/styled-components/cjs/index.js +11 -0
  93. package/styled-components/es/components/Mask/Mask.js +212 -0
  94. package/styled-components/es/components/Mask/Mask.template-doc.mdx +126 -0
  95. package/styled-components/es/components/Mask/Mask.types.js +1 -0
  96. package/styled-components/es/components/Mask/index.js +1 -0
  97. package/styled-components/es/components/Mask/utils/constants.js +23 -0
  98. package/styled-components/es/components/Mask/utils/createMask.js +44 -0
  99. package/styled-components/es/components/Mask/utils/mask.js +243 -0
  100. package/styled-components/es/components/Mask/utils/parseMask.js +30 -0
  101. package/styled-components/es/components/Mask/utils/processInput.js +46 -0
  102. package/styled-components/es/components/Mask/utils/processMask.js +93 -0
  103. package/styled-components/es/components/Mask/utils/selection.js +42 -0
  104. package/styled-components/es/components/TextField/TextField.js +3 -1
  105. package/styled-components/es/examples/plasma_b2c/components/Mask/Mask.js +3 -0
  106. package/styled-components/es/examples/plasma_b2c/components/Mask/Mask.stories.tsx +127 -0
  107. package/styled-components/es/examples/plasma_web/components/Mask/Mask.js +3 -0
  108. package/styled-components/es/examples/plasma_web/components/Mask/Mask.stories.tsx +125 -0
  109. package/styled-components/es/index.js +2 -1
  110. package/types/components/Mask/Mask.d.ts +5 -0
  111. package/types/components/Mask/Mask.d.ts.map +1 -0
  112. package/types/components/Mask/Mask.types.d.ts +84 -0
  113. package/types/components/Mask/Mask.types.d.ts.map +1 -0
  114. package/types/components/Mask/index.d.ts +2 -0
  115. package/types/components/Mask/index.d.ts.map +1 -0
  116. package/types/components/Mask/utils/constants.d.ts +15 -0
  117. package/types/components/Mask/utils/constants.d.ts.map +1 -0
  118. package/types/components/Mask/utils/createMask.d.ts +19 -0
  119. package/types/components/Mask/utils/createMask.d.ts.map +1 -0
  120. package/types/components/Mask/utils/mask.d.ts +48 -0
  121. package/types/components/Mask/utils/mask.d.ts.map +1 -0
  122. package/types/components/Mask/utils/parseMask.d.ts +3 -0
  123. package/types/components/Mask/utils/parseMask.d.ts.map +1 -0
  124. package/types/components/Mask/utils/processInput.d.ts +13 -0
  125. package/types/components/Mask/utils/processInput.d.ts.map +1 -0
  126. package/types/components/Mask/utils/processMask.d.ts +7 -0
  127. package/types/components/Mask/utils/processMask.d.ts.map +1 -0
  128. package/types/components/Mask/utils/selection.d.ts +10 -0
  129. package/types/components/Mask/utils/selection.d.ts.map +1 -0
  130. package/types/components/TextField/TextField.d.ts.map +1 -1
  131. package/types/examples/plasma_b2c/components/Mask/Mask.d.ts +191 -0
  132. package/types/examples/plasma_b2c/components/Mask/Mask.d.ts.map +1 -0
  133. package/types/examples/plasma_web/components/Mask/Mask.d.ts +191 -0
  134. package/types/examples/plasma_web/components/Mask/Mask.d.ts.map +1 -0
  135. package/types/index.d.ts +1 -0
  136. package/types/index.d.ts.map +1 -1
@@ -0,0 +1,127 @@
1
+ import React from 'react';
2
+ import type { ComponentProps } from 'react';
3
+ import type { StoryObj, Meta } from '@storybook/react';
4
+ import { action } from '@storybook/addon-actions';
5
+
6
+ import { WithTheme } from '../../../_helpers';
7
+
8
+ import { Mask } from './Mask';
9
+
10
+ const onChange = action('onChange');
11
+
12
+ const sizes = ['l', 'm', 's', 'xs'];
13
+ const views = ['default', 'positive', 'warning', 'negative'];
14
+
15
+ const meta: Meta<typeof Mask> = {
16
+ title: 'plasma_b2c/Mask',
17
+ component: Mask,
18
+ decorators: [WithTheme],
19
+ argTypes: {
20
+ view: {
21
+ options: views,
22
+ control: {
23
+ type: 'select',
24
+ },
25
+ },
26
+ size: {
27
+ options: sizes,
28
+ control: {
29
+ type: 'inline-radio',
30
+ },
31
+ },
32
+ },
33
+ };
34
+
35
+ export default meta;
36
+
37
+ type StoryPropsDefault = Omit<
38
+ ComponentProps<typeof Mask>,
39
+ | 'helperBlock'
40
+ | 'contentLeft'
41
+ | 'htmlSize'
42
+ | 'contentRight'
43
+ | 'type'
44
+ | 'name'
45
+ | 'onFocus'
46
+ | 'onBlur'
47
+ | 'onChange'
48
+ | 'value'
49
+ | 'checked'
50
+ | 'maxLength'
51
+ | 'minLength'
52
+ | 'required'
53
+ | 'enumerationType'
54
+ | 'chips'
55
+ | 'onChangeChips'
56
+ >;
57
+
58
+ const StoryDemo = ({ view, ...rest }: StoryPropsDefault) => {
59
+ return (
60
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '2rem', width: '50%' }}>
61
+ <Mask
62
+ label="Маска телефона"
63
+ mask="+7 (000) 000 - 00 - 00"
64
+ maskChar="_"
65
+ showPrefix={false}
66
+ view={view}
67
+ onChange={onChange}
68
+ {...rest}
69
+ />
70
+
71
+ <Mask
72
+ label="Маска телефона: отображается всегда"
73
+ mask="+7 (000) 000 - 00 - 00"
74
+ maskChar="_"
75
+ view={view}
76
+ alwaysShowMask
77
+ onChange={onChange}
78
+ {...rest}
79
+ value="+79123"
80
+ name="example"
81
+ />
82
+
83
+ <Mask
84
+ label="Маска даты"
85
+ mask="00/00/0000"
86
+ maskString="DD/MM/YYYY"
87
+ alwaysShowMask
88
+ view={view}
89
+ onChange={onChange}
90
+ {...rest}
91
+ />
92
+
93
+ <Mask
94
+ label="Маска даты: значения по умолчанию"
95
+ // eslint-disable-next-line no-octal-escape
96
+ mask="12.\04.0000"
97
+ maskChar="_"
98
+ alwaysShowMask
99
+ view={view}
100
+ onChange={onChange}
101
+ {...rest}
102
+ />
103
+
104
+ <Mask
105
+ label="Маска времени"
106
+ mask="00:00"
107
+ maskChar="_"
108
+ alwaysShowMask
109
+ view={view}
110
+ onChange={onChange}
111
+ {...rest}
112
+ />
113
+ </div>
114
+ );
115
+ };
116
+
117
+ export const Default: StoryObj<StoryPropsDefault> = {
118
+ args: {
119
+ size: 'l',
120
+ view: 'default',
121
+ labelPlacement: 'outer',
122
+ placeholder: 'Заполните поле',
123
+ disabled: false,
124
+ readOnly: false,
125
+ },
126
+ render: (args) => <StoryDemo {...args} />,
127
+ };
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Mask = void 0;
7
+ var _Mask = /*#__PURE__*/require("../../../../components/Mask");
8
+ var _TextField = /*#__PURE__*/require("../TextField/TextField");
9
+ var Mask = exports.Mask = /*#__PURE__*/(0, _Mask.composeMask)(_TextField.TextField);
@@ -0,0 +1,125 @@
1
+ import React from 'react';
2
+ import type { ComponentProps } from 'react';
3
+ import type { StoryObj, Meta } from '@storybook/react';
4
+ import { action } from '@storybook/addon-actions';
5
+
6
+ import { WithTheme } from '../../../_helpers';
7
+
8
+ import { Mask } from './Mask';
9
+
10
+ const onChange = action('onChange');
11
+
12
+ const sizes = ['l', 'm', 's', 'xs'];
13
+ const views = ['default', 'positive', 'warning', 'negative'];
14
+
15
+ const meta: Meta<typeof Mask> = {
16
+ title: 'plasma_web/Mask',
17
+ component: Mask,
18
+ decorators: [WithTheme],
19
+ argTypes: {
20
+ view: {
21
+ options: views,
22
+ control: {
23
+ type: 'select',
24
+ },
25
+ },
26
+ size: {
27
+ options: sizes,
28
+ control: {
29
+ type: 'inline-radio',
30
+ },
31
+ },
32
+ },
33
+ };
34
+
35
+ export default meta;
36
+
37
+ type StoryPropsDefault = Omit<
38
+ ComponentProps<typeof Mask>,
39
+ | 'helperBlock'
40
+ | 'contentLeft'
41
+ | 'htmlSize'
42
+ | 'contentRight'
43
+ | 'type'
44
+ | 'name'
45
+ | 'onFocus'
46
+ | 'onBlur'
47
+ | 'onChange'
48
+ | 'value'
49
+ | 'checked'
50
+ | 'maxLength'
51
+ | 'minLength'
52
+ | 'required'
53
+ | 'enumerationType'
54
+ | 'chips'
55
+ | 'onChangeChips'
56
+ >;
57
+
58
+ const StoryDemo = ({ view, ...rest }: StoryPropsDefault) => {
59
+ return (
60
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '2rem', width: '50%' }}>
61
+ <Mask
62
+ label="Маска телефона"
63
+ mask="+7 (000) 000 - 00 - 00"
64
+ maskChar="_"
65
+ showPrefix={false}
66
+ view={view}
67
+ onChange={onChange}
68
+ {...rest}
69
+ />
70
+
71
+ <Mask
72
+ label="Маска телефона: отображается всегда"
73
+ mask="+7 (000) 000 - 00 - 00"
74
+ maskChar="_"
75
+ view={view}
76
+ alwaysShowMask
77
+ onChange={onChange}
78
+ {...rest}
79
+ />
80
+
81
+ <Mask
82
+ label="Маска даты"
83
+ mask="00/00/0000"
84
+ maskString="DD/MM/YYYY"
85
+ alwaysShowMask
86
+ view={view}
87
+ onChange={onChange}
88
+ {...rest}
89
+ />
90
+
91
+ <Mask
92
+ label="Маска даты: значения по умолчанию"
93
+ // eslint-disable-next-line no-octal-escape
94
+ mask="12.\04.0000"
95
+ maskChar="_"
96
+ alwaysShowMask
97
+ view={view}
98
+ onChange={onChange}
99
+ {...rest}
100
+ />
101
+
102
+ <Mask
103
+ label="Маска времени"
104
+ mask="00:00"
105
+ maskChar="_"
106
+ alwaysShowMask
107
+ view={view}
108
+ onChange={onChange}
109
+ {...rest}
110
+ />
111
+ </div>
112
+ );
113
+ };
114
+
115
+ export const Default: StoryObj<StoryPropsDefault> = {
116
+ args: {
117
+ size: 'l',
118
+ view: 'default',
119
+ labelPlacement: 'outer',
120
+ placeholder: 'Заполните поле',
121
+ disabled: false,
122
+ readOnly: false,
123
+ },
124
+ render: (args) => <StoryDemo {...args} />,
125
+ };
@@ -629,4 +629,15 @@ Object.keys(_Editable).forEach(function (key) {
629
629
  return _Editable[key];
630
630
  }
631
631
  });
632
+ });
633
+ var _Mask = /*#__PURE__*/require("./components/Mask");
634
+ Object.keys(_Mask).forEach(function (key) {
635
+ if (key === "default" || key === "__esModule") return;
636
+ if (key in exports && exports[key] === _Mask[key]) return;
637
+ Object.defineProperty(exports, key, {
638
+ enumerable: true,
639
+ get: function get() {
640
+ return _Mask[key];
641
+ }
642
+ });
632
643
  });
@@ -0,0 +1,212 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ var _excluded = ["mask", "maskChar", "alwaysShowMask", "maskString", "showPrefix", "value", "defaultValue", "showMask", "onChange", "onBlur", "onFocus", "reformat"];
3
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
4
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
6
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
8
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
9
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
10
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
11
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
12
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
13
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
14
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
15
+ import React, { forwardRef, useEffect, useMemo, useRef, useState } from 'react';
16
+ import { useForkRef } from '@salutejs/plasma-core';
17
+ import { useDidMountEffect } from '../../hooks';
18
+ import { createMask, defaults } from './utils/createMask';
19
+ import { keyboardCode } from './utils/constants';
20
+ export var composeMask = function composeMask(InputComponent) {
21
+ return /*#__PURE__*/forwardRef(function (props, outerRef) {
22
+ var maskValue = props.mask,
23
+ maskChar = props.maskChar,
24
+ alwaysShowMask = props.alwaysShowMask,
25
+ maskString = props.maskString,
26
+ showPrefix = props.showPrefix,
27
+ value = props.value,
28
+ defaultValue = props.defaultValue,
29
+ showMaskedValue = props.showMask,
30
+ onChange = props.onChange,
31
+ onBlur = props.onBlur,
32
+ onFocus = props.onFocus,
33
+ reformat = props.reformat,
34
+ rest = _objectWithoutProperties(props, _excluded);
35
+ var _useState = useState(alwaysShowMask || showMaskedValue),
36
+ _useState2 = _slicedToArray(_useState, 2),
37
+ showMask = _useState2[0],
38
+ setShowMask = _useState2[1];
39
+ var _useState3 = useState(''),
40
+ _useState4 = _slicedToArray(_useState3, 2),
41
+ innerValue = _useState4[0],
42
+ setInnerValue = _useState4[1];
43
+ var mask = useMemo(function () {
44
+ return createMask({
45
+ value: String(value) || String(defaultValue) || '',
46
+ mask: maskValue,
47
+ maskChar: maskChar || defaults.maskChar,
48
+ maskString: maskString,
49
+ showPrefix: showPrefix || defaults.showPrefix,
50
+ reformat: reformat
51
+ });
52
+ }, []);
53
+ var canSetSelection = useRef(false);
54
+ var inputRef = useRef(null);
55
+ var innerRef = useForkRef(inputRef, outerRef);
56
+ var getSelection = function getSelection() {
57
+ var _inputRef$current, _inputRef$current2;
58
+ mask.setSelection = {
59
+ start: (inputRef === null || inputRef === void 0 || (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.selectionStart) || 0,
60
+ end: (inputRef === null || inputRef === void 0 || (_inputRef$current2 = inputRef.current) === null || _inputRef$current2 === void 0 ? void 0 : _inputRef$current2.selectionEnd) || 0
61
+ };
62
+ };
63
+ var setSelection = function setSelection() {
64
+ var _inputRef$current3;
65
+ if (!canSetSelection.current) {
66
+ return;
67
+ }
68
+ var selection = mask.getSelection;
69
+ inputRef === null || inputRef === void 0 || (_inputRef$current3 = inputRef.current) === null || _inputRef$current3 === void 0 || _inputRef$current3.setSelectionRange(selection.start, selection.end);
70
+ setTimeout(function () {
71
+ var _inputRef$current4;
72
+ return inputRef === null || inputRef === void 0 || (_inputRef$current4 = inputRef.current) === null || _inputRef$current4 === void 0 ? void 0 : _inputRef$current4.setSelectionRange(selection.start, selection.end);
73
+ }, 0);
74
+ };
75
+ var showValue = function showValue() {
76
+ if (!(inputRef !== null && inputRef !== void 0 && inputRef.current)) {
77
+ return;
78
+ }
79
+ if (showMask && (canSetSelection.current || alwaysShowMask)) {
80
+ inputRef.current.value = mask.getState.maskedValue;
81
+ setInnerValue(mask.getState.maskedValue);
82
+ return;
83
+ }
84
+ setInnerValue(mask.getState.visibleValue);
85
+ inputRef.current.value = mask.getState.visibleValue;
86
+ };
87
+ var keyPressPropName = function keyPressPropName() {
88
+ if (typeof navigator !== 'undefined' && navigator.userAgent.match(/Android/i)) {
89
+ return 'onBeforeInput';
90
+ }
91
+ return 'onKeyPress';
92
+ };
93
+ var dispatchEvent = function dispatchEvent(e) {
94
+ var _mask$getState = mask.getState,
95
+ maskedValue = _mask$getState.maskedValue,
96
+ visibleValue = _mask$getState.visibleValue;
97
+ if (onChange) {
98
+ onChange(e, {
99
+ maskedValue: maskedValue,
100
+ value: visibleValue
101
+ });
102
+ }
103
+ };
104
+ var onPaste = function onPaste(e) {
105
+ e.preventDefault();
106
+ getSelection();
107
+ if (!(e !== null && e !== void 0 && e.clipboardData)) {
108
+ return;
109
+ }
110
+ mask.paste(e.clipboardData.getData('Text'));
111
+ setTimeout(setSelection, 0);
112
+ dispatchEvent(e);
113
+ };
114
+ var handleChange = function handleChange(e) {
115
+ var currentValue;
116
+ if (showMask && (canSetSelection.current || alwaysShowMask)) {
117
+ currentValue = mask.getState.maskedValue;
118
+ } else {
119
+ currentValue = mask.getState.visibleValue;
120
+ }
121
+ if (e.target.value !== currentValue) {
122
+ getSelection();
123
+ mask.updateValue(e.target.value);
124
+ setTimeout(setSelection, 0);
125
+ }
126
+ dispatchEvent(e);
127
+ };
128
+ var onKeyPress = function onKeyPress(e) {
129
+ if (e.metaKey || e.altKey || e.ctrlKey || e.key === 'Enter') {
130
+ return;
131
+ }
132
+ e.preventDefault();
133
+ getSelection();
134
+ mask.input(e.key || String.fromCharCode(e.which));
135
+ setSelection();
136
+ dispatchEvent(e);
137
+ };
138
+ var onKeyDown = function onKeyDown(e) {
139
+ if (e.code === keyboardCode.Backspace) {
140
+ e.preventDefault();
141
+ getSelection();
142
+ mask.removePreviousOrSelected();
143
+ setSelection();
144
+ dispatchEvent(e);
145
+ }
146
+ if (e.code === keyboardCode.Delete) {
147
+ e.preventDefault();
148
+ getSelection();
149
+ mask.removeNextOrSelected();
150
+ setSelection();
151
+ dispatchEvent(e);
152
+ }
153
+ };
154
+ var handleFocus = function handleFocus(e) {
155
+ canSetSelection.current = true;
156
+ if (onFocus) {
157
+ onFocus(e);
158
+ }
159
+ };
160
+ var handleBlur = function handleBlur(e) {
161
+ canSetSelection.current = false;
162
+ if (onBlur) {
163
+ onBlur(e);
164
+ }
165
+ };
166
+ var keyPressEvent = _defineProperty({}, keyPressPropName(), onKeyPress);
167
+ useDidMountEffect(function () {
168
+ setShowMask(alwaysShowMask || showMask);
169
+ }, [alwaysShowMask, showMask]);
170
+ useDidMountEffect(function () {
171
+ if (reformat) {
172
+ mask.updateReformat(reformat);
173
+ }
174
+ }, [reformat]);
175
+ useDidMountEffect(function () {
176
+ mask.updateMask(String(mask));
177
+ }, [mask]);
178
+ useDidMountEffect(function () {
179
+ mask.updateMaskString(String(maskString));
180
+ }, [maskString]);
181
+ useDidMountEffect(function () {
182
+ mask.updateMaskChar(String(maskChar));
183
+ }, [maskChar]);
184
+ useEffect(function () {
185
+ mask.updateValue(String(value));
186
+ }, [value]);
187
+ useEffect(function () {
188
+ showValue();
189
+ }, [showValue, mask]);
190
+ useEffect(function () {
191
+ var subscriber = function subscriber() {
192
+ showValue();
193
+ setSelection();
194
+ };
195
+ mask.subscribe(subscriber);
196
+ return function () {
197
+ mask.unsubscribe(subscriber);
198
+ };
199
+ }, [mask, showValue, setSelection]);
200
+ return /*#__PURE__*/React.createElement(InputComponent, _extends({}, rest, {
201
+ onChange: handleChange,
202
+ onKeyDown: onKeyDown,
203
+ onPaste: onPaste,
204
+ onFocus: handleFocus,
205
+ onBlur: handleBlur
206
+ }, keyPressEvent, {
207
+ value: innerValue,
208
+ ref: innerRef,
209
+ autoComplete: "off"
210
+ }));
211
+ });
212
+ };
@@ -0,0 +1,126 @@
1
+ ---
2
+ id: mask
3
+ title: Mask
4
+ ---
5
+
6
+ import { PropsTable, Description, StorybookLink } from '@site/src/components';
7
+
8
+ import Tabs from '@theme/Tabs';
9
+ import TabItem from '@theme/TabItem';
10
+
11
+ # Mask
12
+ <Description name="Mask" />
13
+ <PropsTable name="Mask" exclude={['css']} />
14
+ <StorybookLink name="Mask" />
15
+
16
+ ## Использование
17
+ Компонент `Mask` представляет собой поле ввода с возможностью маскирования значения.
18
+ Он реализован на компоненте [TextField](https://plasma.sberdevices.ru/b2c/components/textfield/)
19
+ и наследует практически все его свойства (`size`, `view`, `disabled`, `label` и тд.)
20
+
21
+ ```tsx live
22
+ import React from 'react';
23
+ import { Mask } from '@salutejs/{{ package }}';
24
+ import { IconDone } from '@salutejs/plasma-icons';
25
+
26
+ export function App() {
27
+ return (
28
+ <div>
29
+ <Mask
30
+ label="Лейбл"
31
+ leftHelper="Подсказка к полю"
32
+ placeholder="Введите дату"
33
+ mask="00/00/0000"
34
+ maskString="DD/MM/YYYY"
35
+ size="l"
36
+ />
37
+ </div>
38
+ );
39
+ }
40
+ ```
41
+
42
+ ### Маска
43
+ Маска задается с помощью свойства `mask`.
44
+ Поддерживает следующие символы:
45
+
46
+ | Обозначение | Описание |
47
+ |-------------|---------------------------------------|
48
+ | 0 | любая цифра от 0 до 9 |
49
+ | a (англ.) | A-Z, a-z |
50
+ | я | А-Я, а-я, ё, Ё |
51
+ | q | буква "q" |
52
+ | 2 | цифра "2" |
53
+ | * | любой символ |
54
+ | \ | символ экранирования "\a" - буква "a" |
55
+
56
+
57
+ <Tabs>
58
+ <TabItem value="phone" label="Маска телефона">
59
+ Пример маски для ввода телефона
60
+
61
+ ```tsx live
62
+ import React from 'react';
63
+ import { Mask } from '@salutejs/{{ package }}';
64
+
65
+ export function App() {
66
+ return (
67
+ <div>
68
+ <Mask
69
+ label="Маска телефона"
70
+ placeholder="Введите телефон"
71
+ mask="+7 (000) 000 - 00 - 00"
72
+ maskChar="_"
73
+ size="l"
74
+ alwaysShowMask
75
+ />
76
+ </div>
77
+ );
78
+ }
79
+ ```
80
+ </TabItem>
81
+ <TabItem value="date" label="Маска даты">
82
+ Пример маски для ввода даты
83
+
84
+ ```tsx live
85
+ import React from 'react';
86
+ import { Mask } from '@salutejs/{{ package }}';
87
+
88
+ export function App() {
89
+ return (
90
+ <div>
91
+ <Mask
92
+ label="Маска даты"
93
+ placeholder="Введите дату"
94
+ mask="00/00/0000"
95
+ maskString="DD/MM/YYYY"
96
+ size="l"
97
+ />
98
+ </div>
99
+ );
100
+ }
101
+ ```
102
+ </TabItem>
103
+ <TabItem value="time" label="Маска времени">
104
+ Пример маски для ввода даты
105
+
106
+ ```tsx live
107
+ import React from 'react';
108
+ import { Mask } from '@salutejs/{{ package }}';
109
+
110
+ export function App() {
111
+ return (
112
+ <div>
113
+ <Mask
114
+ label="Маска времени"
115
+ placeholder="Введите время"
116
+ mask="1\0:00"
117
+ maskChar="_"
118
+ size="l"
119
+ showPrefix
120
+ />
121
+ </div>
122
+ );
123
+ }
124
+ ```
125
+ </TabItem>
126
+ </Tabs>
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export { composeMask } from './Mask';
@@ -0,0 +1,23 @@
1
+ export var charType = {
2
+ User: 1,
3
+ Char: 2,
4
+ Mask: 3
5
+ };
6
+ export var keyboardCode = {
7
+ Backspace: 'Backspace',
8
+ Delete: 'Delete'
9
+ };
10
+ export var escapeChar = '\\';
11
+ export var defaultFormatChars = [{
12
+ str: '0',
13
+ regexp: /[0-9]/
14
+ }, {
15
+ str: '*',
16
+ regexp: /./
17
+ }, {
18
+ str: 'a',
19
+ regexp: /[a-zA-Z]/
20
+ }, {
21
+ str: 'я',
22
+ regexp: /[а-яА-ЯёЁ]/
23
+ }];