@true-engineering/true-react-common-ui-kit 2.2.0 → 2.3.0

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.
Files changed (244) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +16 -0
  3. package/dist/components/Flag/augment.d.ts +1 -1
  4. package/dist/components/Icon/complexIcons/augment.d.ts +1 -1
  5. package/dist/components/Modal/Modal.d.ts +3 -3
  6. package/dist/true-react-common-ui-kit.js +151 -97
  7. package/dist/true-react-common-ui-kit.js.map +1 -1
  8. package/dist/true-react-common-ui-kit.umd.cjs +151 -97
  9. package/dist/true-react-common-ui-kit.umd.cjs.map +1 -1
  10. package/dist/vite-env.d.ts +1 -1
  11. package/package.json +93 -93
  12. package/src/components/AccountInfo/AccountInfo.stories.tsx +32 -32
  13. package/src/components/AccountInfo/AccountInfo.styles.ts +55 -55
  14. package/src/components/AccountInfo/AccountInfo.tsx +77 -77
  15. package/src/components/AccountInfo/index.ts +2 -2
  16. package/src/components/AddButton/AddButton.stories.tsx +21 -21
  17. package/src/components/AddButton/AddButton.styles.ts +34 -34
  18. package/src/components/AddButton/AddButton.tsx +48 -48
  19. package/src/components/AddButton/index.ts +2 -2
  20. package/src/components/Button/Button.stories.tsx +52 -52
  21. package/src/components/Button/Button.styles.ts +196 -196
  22. package/src/components/Button/Button.tsx +167 -167
  23. package/src/components/Button/index.ts +2 -2
  24. package/src/components/Checkbox/Checkbox.stories.tsx +32 -32
  25. package/src/components/Checkbox/Checkbox.styles.ts +62 -62
  26. package/src/components/Checkbox/Checkbox.tsx +105 -105
  27. package/src/components/Checkbox/index.ts +2 -2
  28. package/src/components/CloseButton/CloseButton.styles.ts +34 -34
  29. package/src/components/CloseButton/CloseButton.tsx +35 -35
  30. package/src/components/CloseButton/index.ts +2 -2
  31. package/src/components/Colors/Colors.stories.tsx +7 -7
  32. package/src/components/Colors/Colors.styles.ts +38 -38
  33. package/src/components/Colors/Colors.tsx +26 -26
  34. package/src/components/Colors/index.ts +2 -2
  35. package/src/components/CssBaseline/CssBaseline.styles.ts +15 -15
  36. package/src/components/CssBaseline/CssBaseline.tsx +15 -15
  37. package/src/components/CssBaseline/index.ts +2 -2
  38. package/src/components/DateInput/DateInput.stories.tsx +61 -61
  39. package/src/components/DateInput/DateInput.styles.ts +14 -14
  40. package/src/components/DateInput/DateInput.tsx +82 -82
  41. package/src/components/DateInput/constants.ts +2 -2
  42. package/src/components/DateInput/index.ts +3 -3
  43. package/src/components/DatePicker/DatePicker.stories.tsx +87 -87
  44. package/src/components/DatePicker/DatePicker.styles.ts +44 -44
  45. package/src/components/DatePicker/DatePicker.tsx +327 -327
  46. package/src/components/DatePicker/DatePickerHeader/DatePickerHeader.styles.ts +84 -84
  47. package/src/components/DatePicker/DatePickerHeader/DatePickerHeader.tsx +79 -79
  48. package/src/components/DatePicker/DatePickerHeader/index.ts +2 -2
  49. package/src/components/DatePicker/constants.ts +1 -1
  50. package/src/components/DatePicker/helpers.ts +23 -23
  51. package/src/components/DatePicker/index.ts +3 -3
  52. package/src/components/DatePicker/types.ts +45 -45
  53. package/src/components/Description/Description.stories.tsx +27 -27
  54. package/src/components/Description/Description.styles.ts +31 -31
  55. package/src/components/Description/Description.tsx +60 -60
  56. package/src/components/Description/index.ts +2 -2
  57. package/src/components/FiltersPane/FilterInterval/FilterInterval.styles.ts +64 -64
  58. package/src/components/FiltersPane/FilterInterval/FilterInterval.tsx +143 -143
  59. package/src/components/FiltersPane/FilterInterval/index.ts +1 -1
  60. package/src/components/FiltersPane/FilterMultiSelect/FilterMultiSelect.tsx +10 -10
  61. package/src/components/FiltersPane/FilterMultiSelect/index.ts +1 -1
  62. package/src/components/FiltersPane/FilterSelect/FilterSelect.styles.ts +143 -143
  63. package/src/components/FiltersPane/FilterSelect/FilterSelect.tsx +348 -348
  64. package/src/components/FiltersPane/FilterSelect/index.ts +1 -1
  65. package/src/components/FiltersPane/FilterSelect/locales.ts +37 -37
  66. package/src/components/FiltersPane/FilterValueView/FilterValueView.styles.tsx +15 -15
  67. package/src/components/FiltersPane/FilterValueView/FilterValueView.tsx +166 -166
  68. package/src/components/FiltersPane/FilterValueView/index.tsx +1 -1
  69. package/src/components/FiltersPane/FilterWithDates/FilterWithDates.styles.ts +60 -60
  70. package/src/components/FiltersPane/FilterWithDates/FilterWithDates.tsx +184 -184
  71. package/src/components/FiltersPane/FilterWithDates/index.ts +1 -1
  72. package/src/components/FiltersPane/FilterWithPeriod/FilterWithPeriod.styles.ts +17 -17
  73. package/src/components/FiltersPane/FilterWithPeriod/FilterWithPeriod.tsx +198 -198
  74. package/src/components/FiltersPane/FilterWithPeriod/index.ts +1 -1
  75. package/src/components/FiltersPane/FilterWrapper/FilterWrapper.styles.ts +110 -110
  76. package/src/components/FiltersPane/FilterWrapper/FilterWrapper.tsx +346 -346
  77. package/src/components/FiltersPane/FilterWrapper/index.ts +1 -1
  78. package/src/components/FiltersPane/FiltersPane.stories.tsx +295 -295
  79. package/src/components/FiltersPane/FiltersPane.styles.ts +71 -71
  80. package/src/components/FiltersPane/FiltersPane.tsx +151 -151
  81. package/src/components/FiltersPane/FiltersPaneSearch/FiltersPaneSearch.styles.ts +109 -109
  82. package/src/components/FiltersPane/FiltersPaneSearch/FiltersPaneSearch.tsx +155 -155
  83. package/src/components/FiltersPane/FiltersPaneSearch/index.ts +1 -1
  84. package/src/components/FiltersPane/index.ts +20 -20
  85. package/src/components/FiltersPane/locales.ts +107 -107
  86. package/src/components/FiltersPane/types.ts +112 -112
  87. package/src/components/Flag/Flag.stories.tsx +29 -29
  88. package/src/components/Flag/Flag.styles.ts +18 -18
  89. package/src/components/Flag/Flag.tsx +27 -27
  90. package/src/components/Flag/augment.d.ts +1 -1
  91. package/src/components/Flag/index.ts +2 -2
  92. package/src/components/FlexibleTable/FlexibleTable.stories.tsx +84 -84
  93. package/src/components/FlexibleTable/FlexibleTable.styles.ts +131 -131
  94. package/src/components/FlexibleTable/FlexibleTable.tsx +205 -205
  95. package/src/components/FlexibleTable/TableRow.tsx +152 -152
  96. package/src/components/FlexibleTable/TableValue.tsx +75 -75
  97. package/src/components/FlexibleTable/fixture-test.ts +254 -254
  98. package/src/components/FlexibleTable/index.ts +3 -3
  99. package/src/components/FlexibleTable/types.ts +52 -52
  100. package/src/components/Icon/ComplexIconBoilerplate.tsx +17 -17
  101. package/src/components/Icon/Icon.stories.tsx +85 -85
  102. package/src/components/Icon/Icon.styles.ts +10 -10
  103. package/src/components/Icon/Icon.tsx +32 -32
  104. package/src/components/Icon/IconBoilerplate.tsx +42 -42
  105. package/src/components/Icon/complexIcons/augment.d.ts +1 -1
  106. package/src/components/Icon/complexIcons/avatarGreen.svg +57 -57
  107. package/src/components/Icon/complexIcons/icons.ts +7 -7
  108. package/src/components/Icon/complexIcons/index.ts +1 -1
  109. package/src/components/Icon/icons/icons.ts +838 -838
  110. package/src/components/Icon/icons/index.ts +1 -1
  111. package/src/components/Icon/index.ts +4 -4
  112. package/src/components/IncrementInput/ChangeButton.tsx +33 -33
  113. package/src/components/IncrementInput/IncrementInput.stories.tsx +31 -31
  114. package/src/components/IncrementInput/IncrementInput.styles.ts +77 -77
  115. package/src/components/IncrementInput/IncrementInput.tsx +80 -80
  116. package/src/components/IncrementInput/index.ts +2 -2
  117. package/src/components/Input/Input.stories.tsx +86 -86
  118. package/src/components/Input/Input.styles.ts +307 -307
  119. package/src/components/Input/Input.tsx +311 -311
  120. package/src/components/Input/index.ts +2 -2
  121. package/src/components/List/List.stories.tsx +62 -62
  122. package/src/components/List/List.styles.ts +52 -52
  123. package/src/components/List/List.tsx +64 -64
  124. package/src/components/List/index.ts +2 -2
  125. package/src/components/Modal/Modal.stories.tsx +105 -105
  126. package/src/components/Modal/Modal.styles.ts +305 -305
  127. package/src/components/Modal/Modal.tsx +200 -186
  128. package/src/components/Modal/index.ts +2 -2
  129. package/src/components/MoreMenu/MoreMenu.stories.tsx +46 -46
  130. package/src/components/MoreMenu/MoreMenu.styles.ts +70 -70
  131. package/src/components/MoreMenu/MoreMenu.tsx +90 -90
  132. package/src/components/MoreMenu/index.ts +2 -2
  133. package/src/components/MultiSelect/MultiSelect.stories.tsx +46 -46
  134. package/src/components/MultiSelect/MultiSelect.styles.ts +55 -55
  135. package/src/components/MultiSelect/MultiSelect.tsx +89 -89
  136. package/src/components/MultiSelect/MultiSelectInput/MultiSelectInput.styles.ts +73 -73
  137. package/src/components/MultiSelect/MultiSelectInput/MultiSelectInput.tsx +51 -51
  138. package/src/components/MultiSelect/MultiSelectInput/index.ts +1 -1
  139. package/src/components/MultiSelect/index.ts +3 -3
  140. package/src/components/MultiSelectList/MultiSelectList.styles.ts +124 -124
  141. package/src/components/MultiSelectList/MultiSelectList.tsx +451 -451
  142. package/src/components/MultiSelectList/index.ts +2 -2
  143. package/src/components/MultiSelectList/locales.ts +37 -37
  144. package/src/components/Notification/Notification.stories.tsx +46 -46
  145. package/src/components/Notification/Notification.styles.ts +50 -50
  146. package/src/components/Notification/Notification.tsx +79 -79
  147. package/src/components/Notification/index.ts +2 -2
  148. package/src/components/NumberInput/NumberInput.stories.tsx +35 -35
  149. package/src/components/NumberInput/NumberInput.tsx +133 -133
  150. package/src/components/NumberInput/helpers.ts +86 -86
  151. package/src/components/NumberInput/index.ts +1 -1
  152. package/src/components/PhoneInput/PhoneInput.stories.tsx +70 -70
  153. package/src/components/PhoneInput/PhoneInput.styles.ts +84 -84
  154. package/src/components/PhoneInput/PhoneInput.tsx +194 -194
  155. package/src/components/PhoneInput/PhoneInputCountryList/PhoneInputCountryList.stories.tsx +21 -21
  156. package/src/components/PhoneInput/PhoneInputCountryList/PhoneInputCountryList.styles.ts +100 -100
  157. package/src/components/PhoneInput/PhoneInputCountryList/PhoneInputCountryList.tsx +147 -147
  158. package/src/components/PhoneInput/PhoneInputCountryList/index.ts +2 -2
  159. package/src/components/PhoneInput/index.ts +6 -6
  160. package/src/components/PhoneInput/phone-info.ts +2147 -2147
  161. package/src/components/PhoneInput/types.ts +16 -16
  162. package/src/components/RadioButton/RadioButton.stories.tsx +46 -46
  163. package/src/components/RadioButton/RadioButton.styles.ts +37 -37
  164. package/src/components/RadioButton/RadioButton.tsx +55 -55
  165. package/src/components/RadioButton/index.ts +2 -2
  166. package/src/components/ScrollIntoViewIfNeeded/ScrollIntoViewIfNeeded.ts +61 -61
  167. package/src/components/ScrollIntoViewIfNeeded/index.ts +1 -1
  168. package/src/components/SearchInput/SearchInput.stories.tsx +23 -23
  169. package/src/components/SearchInput/SearchInput.styles.ts +50 -50
  170. package/src/components/SearchInput/SearchInput.tsx +50 -50
  171. package/src/components/SearchInput/index.ts +2 -2
  172. package/src/components/Select/MultiSelect.stories.tsx +240 -240
  173. package/src/components/Select/Select.stories.tsx +235 -235
  174. package/src/components/Select/Select.styles.ts +96 -96
  175. package/src/components/Select/Select.tsx +575 -575
  176. package/src/components/Select/SelectList/SelectList.styles.ts +72 -72
  177. package/src/components/Select/SelectList/SelectList.tsx +158 -158
  178. package/src/components/Select/SelectList/index.ts +1 -1
  179. package/src/components/Select/SelectListItem/SelectListItem.styles.ts +14 -14
  180. package/src/components/Select/SelectListItem/SelectListItem.tsx +68 -68
  181. package/src/components/Select/constants.ts +2 -2
  182. package/src/components/Select/helpers.ts +26 -26
  183. package/src/components/Select/index.ts +4 -4
  184. package/src/components/Select/types.ts +1 -1
  185. package/src/components/SmartInput/SmartInput.stories.tsx +50 -50
  186. package/src/components/SmartInput/SmartInput.tsx +147 -147
  187. package/src/components/SmartInput/helpers.ts +85 -85
  188. package/src/components/SmartInput/index.ts +1 -1
  189. package/src/components/Switch/Switch.stories.tsx +40 -40
  190. package/src/components/Switch/Switch.styles.ts +75 -75
  191. package/src/components/Switch/Switch.tsx +83 -83
  192. package/src/components/Switch/index.ts +2 -2
  193. package/src/components/TextArea/TextArea.stories.tsx +35 -35
  194. package/src/components/TextArea/TextArea.styles.ts +153 -153
  195. package/src/components/TextArea/TextArea.tsx +165 -165
  196. package/src/components/TextArea/index.ts +2 -2
  197. package/src/components/TextWithInfo/TextWithInfo.stories.tsx +53 -53
  198. package/src/components/TextWithInfo/TextWithInfo.styles.ts +60 -60
  199. package/src/components/TextWithInfo/TextWithInfo.tsx +60 -60
  200. package/src/components/TextWithInfo/index.ts +2 -2
  201. package/src/components/TextWithTooltip/TextWithTooltip.stories.tsx +58 -58
  202. package/src/components/TextWithTooltip/TextWithTooltip.styles.ts +19 -19
  203. package/src/components/TextWithTooltip/TextWithTooltip.tsx +143 -143
  204. package/src/components/TextWithTooltip/index.ts +2 -2
  205. package/src/components/ThemedPreloader/ThemedPreloader.stories.tsx +41 -41
  206. package/src/components/ThemedPreloader/ThemedPreloader.styles.ts +21 -21
  207. package/src/components/ThemedPreloader/ThemedPreloader.tsx +50 -50
  208. package/src/components/ThemedPreloader/components/DefaultPreloader/DefaultPreloader.tsx +29 -29
  209. package/src/components/ThemedPreloader/components/DefaultPreloader/index.ts +1 -1
  210. package/src/components/ThemedPreloader/components/DotsPreloader/DotsPreloader.styles.ts +54 -54
  211. package/src/components/ThemedPreloader/components/DotsPreloader/DotsPreloader.tsx +18 -18
  212. package/src/components/ThemedPreloader/components/DotsPreloader/index.ts +2 -2
  213. package/src/components/ThemedPreloader/components/SvgPreloader/SvgPreloader.styles.ts +11 -11
  214. package/src/components/ThemedPreloader/components/SvgPreloader/SvgPreloader.tsx +25 -25
  215. package/src/components/ThemedPreloader/components/SvgPreloader/index.ts +2 -2
  216. package/src/components/ThemedPreloader/components/index.ts +2 -2
  217. package/src/components/ThemedPreloader/index.ts +2 -2
  218. package/src/components/Toaster/Toaster.stories.tsx +30 -30
  219. package/src/components/Toaster/Toaster.styles.ts +59 -59
  220. package/src/components/Toaster/Toaster.tsx +110 -110
  221. package/src/components/Toaster/index.ts +2 -2
  222. package/src/components/Tooltip/Tooltip.stories.tsx +19 -19
  223. package/src/components/Tooltip/Tooltip.styles.ts +45 -45
  224. package/src/components/Tooltip/Tooltip.tsx +35 -35
  225. package/src/components/Tooltip/index.ts +3 -3
  226. package/src/components/Tooltip/types.ts +1 -1
  227. package/src/components/index.ts +36 -36
  228. package/src/helpers/deprecated.ts +22 -22
  229. package/src/helpers/index.ts +4 -4
  230. package/src/helpers/misc.ts +158 -158
  231. package/src/helpers/phone.ts +87 -87
  232. package/src/helpers/popper-helpers.ts +17 -17
  233. package/src/helpers/snippets.tsx +6 -6
  234. package/src/hooks/index.ts +6 -6
  235. package/src/hooks/use-did-mount-effect.ts +18 -18
  236. package/src/hooks/use-dropdown.ts +82 -82
  237. package/src/hooks/use-is-mounted.ts +15 -15
  238. package/src/hooks/use-on-click-outside.ts +77 -77
  239. package/src/hooks/use-theme.ts +32 -32
  240. package/src/hooks/use-tweak-styles.ts +13 -13
  241. package/src/index.ts +6 -6
  242. package/src/theme.ts +149 -149
  243. package/src/types.ts +107 -107
  244. package/src/vite-env.d.ts +1 -1
@@ -1,26 +1,26 @@
1
- import { isNotEmpty } from '@true-engineering/true-react-platform-helpers';
2
- import type { IMultipleSelectProps, ISelectProps } from './Select';
3
- import { IMultipleSelectValue } from './types';
4
-
5
- export const defaultIsOptionDisabled = <Value>(option: Value): boolean =>
6
- typeof option === 'object' &&
7
- option !== null &&
8
- ((option as { isDisabled?: boolean })?.isDisabled ?? false);
9
-
10
- export const defaultConvertFunction = (v: unknown) => (v === undefined ? undefined : String(v));
11
-
12
- export const defaultCompareFunction = <Value>(v1: Value, v2: Value) => v1 === v2;
13
-
14
- export const getDefaultConvertToIdFunction =
15
- <Value>(
16
- convertValueToString: (value: Value) => string | undefined,
17
- ): ((value: Value) => string | undefined) =>
18
- (value) =>
19
- isNotEmpty((value as { id: unknown })?.id)
20
- ? String((value as { id: unknown }).id)
21
- : convertValueToString(value);
22
-
23
- export const isMultiSelectValue = <Value>(
24
- props: ISelectProps<Value> | IMultipleSelectProps<Value>,
25
- _value: Value | IMultipleSelectValue<Value> | undefined,
26
- ): _value is IMultipleSelectValue<Value> | undefined => props.isMultiSelect === true;
1
+ import { isNotEmpty } from '@true-engineering/true-react-platform-helpers';
2
+ import type { IMultipleSelectProps, ISelectProps } from './Select';
3
+ import { IMultipleSelectValue } from './types';
4
+
5
+ export const defaultIsOptionDisabled = <Value>(option: Value): boolean =>
6
+ typeof option === 'object' &&
7
+ option !== null &&
8
+ ((option as { isDisabled?: boolean })?.isDisabled ?? false);
9
+
10
+ export const defaultConvertFunction = (v: unknown) => (v === undefined ? undefined : String(v));
11
+
12
+ export const defaultCompareFunction = <Value>(v1: Value, v2: Value) => v1 === v2;
13
+
14
+ export const getDefaultConvertToIdFunction =
15
+ <Value>(
16
+ convertValueToString: (value: Value) => string | undefined,
17
+ ): ((value: Value) => string | undefined) =>
18
+ (value) =>
19
+ isNotEmpty((value as { id: unknown })?.id)
20
+ ? String((value as { id: unknown }).id)
21
+ : convertValueToString(value);
22
+
23
+ export const isMultiSelectValue = <Value>(
24
+ props: ISelectProps<Value> | IMultipleSelectProps<Value>,
25
+ _value: Value | IMultipleSelectValue<Value> | undefined,
26
+ ): _value is IMultipleSelectValue<Value> | undefined => props.isMultiSelect === true;
@@ -1,4 +1,4 @@
1
- export * from './Select';
2
- export type { IMultipleSelectValue } from './types';
3
- export type { SelectStyles } from './Select.styles';
4
- export type { SelectListStyles } from './SelectList/SelectList.styles';
1
+ export * from './Select';
2
+ export type { IMultipleSelectValue } from './types';
3
+ export type { SelectStyles } from './Select.styles';
4
+ export type { SelectListStyles } from './SelectList/SelectList.styles';
@@ -1 +1 @@
1
- export type IMultipleSelectValue<Value> = Array<NonNullable<Value>>;
1
+ export type IMultipleSelectValue<Value> = Array<NonNullable<Value>>;
@@ -1,50 +1,50 @@
1
- import { useState } from 'react';
2
- import { ComponentStory } from '@storybook/react';
3
- import { IInputProps } from '../Input';
4
- import { SmartInput, TSmartType } from './SmartInput';
5
-
6
- const types: Array<IInputProps['type']> = ['text', 'password', 'email', 'number'];
7
- const smartTypes: TSmartType[] = ['default', 'agencyName', 'surname', 'name', 'email'];
8
-
9
- export default {
10
- title: 'Inputs/SmartInput',
11
- component: SmartInput,
12
- argTypes: {
13
- type: { control: 'inline-radio', options: types },
14
- smartType: { control: 'inline-radio', options: smartTypes },
15
- },
16
- };
17
-
18
- const Template: ComponentStory<typeof SmartInput> = (args) => {
19
- const [value, setValue] = useState('');
20
-
21
- return (
22
- <div>
23
- <div>Фичи умного инпута:</div>
24
- <ul>
25
- <li>Переключение раскладки при вводе</li>
26
- <li>Транслитерация при копировании текста на русском</li>
27
- <li>
28
- Запрет ввода определённых символов для разных видов полей, например, только буквы, пробелы
29
- и дефис для фамилий и т.д.
30
- </li>
31
- <li>Фильтрация скопированного значения на предмет запрещённых символов</li>
32
- <li>Трансформация значения в UPPERCASE</li>
33
- </ul>
34
-
35
- <SmartInput {...args} value={value} onChange={(v) => setValue(v)} />
36
- </div>
37
- );
38
- };
39
-
40
- export const Default = Template.bind({});
41
-
42
- Default.args = {
43
- label: 'Label',
44
- placeholder: 'Placeholder',
45
- type: 'text',
46
- smartType: 'default',
47
- isUpperCase: false,
48
- isDisabled: false,
49
- hasFloatingLabel: true,
50
- };
1
+ import { useState } from 'react';
2
+ import { ComponentStory } from '@storybook/react';
3
+ import { IInputProps } from '../Input';
4
+ import { SmartInput, TSmartType } from './SmartInput';
5
+
6
+ const types: Array<IInputProps['type']> = ['text', 'password', 'email', 'number'];
7
+ const smartTypes: TSmartType[] = ['default', 'agencyName', 'surname', 'name', 'email'];
8
+
9
+ export default {
10
+ title: 'Inputs/SmartInput',
11
+ component: SmartInput,
12
+ argTypes: {
13
+ type: { control: 'inline-radio', options: types },
14
+ smartType: { control: 'inline-radio', options: smartTypes },
15
+ },
16
+ };
17
+
18
+ const Template: ComponentStory<typeof SmartInput> = (args) => {
19
+ const [value, setValue] = useState('');
20
+
21
+ return (
22
+ <div>
23
+ <div>Фичи умного инпута:</div>
24
+ <ul>
25
+ <li>Переключение раскладки при вводе</li>
26
+ <li>Транслитерация при копировании текста на русском</li>
27
+ <li>
28
+ Запрет ввода определённых символов для разных видов полей, например, только буквы, пробелы
29
+ и дефис для фамилий и т.д.
30
+ </li>
31
+ <li>Фильтрация скопированного значения на предмет запрещённых символов</li>
32
+ <li>Трансформация значения в UPPERCASE</li>
33
+ </ul>
34
+
35
+ <SmartInput {...args} value={value} onChange={(v) => setValue(v)} />
36
+ </div>
37
+ );
38
+ };
39
+
40
+ export const Default = Template.bind({});
41
+
42
+ Default.args = {
43
+ label: 'Label',
44
+ placeholder: 'Placeholder',
45
+ type: 'text',
46
+ smartType: 'default',
47
+ isUpperCase: false,
48
+ isDisabled: false,
49
+ hasFloatingLabel: true,
50
+ };
@@ -1,147 +1,147 @@
1
- import React, { useState, useEffect, forwardRef } from 'react';
2
- import { Input, IInputProps } from '../Input';
3
- import { CharactersMap, transformCaseSensitive, TransliterationMap } from './helpers';
4
-
5
- export type TSmartType =
6
- | 'name'
7
- | 'nameRuEn'
8
- | 'surname'
9
- | 'surnameRuEn'
10
- | 'email'
11
- | 'agencyName'
12
- | 'default'
13
- | 'digits'
14
- | 'docNumber'
15
- | 'benefitCert';
16
-
17
- export interface ISmartInputProps extends IInputProps {
18
- isUpperCase?: boolean;
19
- smartType?: TSmartType;
20
- regExp?: RegExp;
21
- onChange: (value: string) => void;
22
- }
23
-
24
- export const SMART_INPUT_REGEX_MAP = {
25
- default: /./i,
26
- agencyName: /^[a-zA-Z\s0-9-]*$/i,
27
- surname: /^[a-zA-Z\s-]*$/i,
28
- name: /^[a-zA-Z\s-.`']*$/i,
29
- surnameRuEn: /^[a-zA-Zа-яА-Я\s-]*$/i,
30
- nameRuEn: /^[a-zA-Zа-яА-Я\s-.`']*$/i,
31
- email: /^[a-zA-Z0-9@_\-.+']*$/i,
32
- digits: /^[0-9]*$/i,
33
- docNumber: /^[a-zA-Z0-9]*$/i,
34
- benefitCert: /^[a-zA-Z0-9/]*$/i,
35
- };
36
-
37
- export const SmartInput = forwardRef<HTMLInputElement, ISmartInputProps>(
38
- (
39
- { onChange, isUpperCase, smartType = 'default', regExp, value = '', maxLength, ...rest },
40
- ref,
41
- ) => {
42
- const [currentValue, setCurrentValue] = useState<string>(getUpperCaseIfNeeded(value));
43
- const [caretPosition, setCaretPosition] = useState<number | null>(null);
44
- const [input, setInput] = useState<HTMLInputElement | null>(null);
45
- const regex = regExp || SMART_INPUT_REGEX_MAP[smartType];
46
-
47
- useEffect(() => {
48
- if (input && input.type !== 'email' && input.selectionStart !== caretPosition) {
49
- input.selectionStart = caretPosition;
50
- input.selectionEnd = caretPosition;
51
- }
52
- }, [caretPosition]);
53
-
54
- useEffect(() => {
55
- setCurrentValue(getUpperCaseIfNeeded(value));
56
- }, [value]);
57
-
58
- function getUpperCaseIfNeeded(str: string) {
59
- return isUpperCase ? str.toUpperCase() : str;
60
- }
61
-
62
- const handleChange = (str: string, event?: React.FormEvent<HTMLInputElement>) => {
63
- const mappedValue = str
64
- .split('')
65
- .map((symbol) =>
66
- regex.test(symbol)
67
- ? symbol
68
- : transformCaseSensitive(
69
- smartType,
70
- smartType !== 'email' ? CharactersMap : { ...CharactersMap, '"': '@' },
71
- symbol,
72
- ),
73
- )
74
- .filter((symbol) => regex.test(symbol))
75
- .join('');
76
- const domElement = event?.currentTarget;
77
-
78
- if (domElement) {
79
- if (!input) {
80
- setInput(domElement);
81
- }
82
-
83
- setCurrentValue(getUpperCaseIfNeeded(mappedValue));
84
- onChange(getUpperCaseIfNeeded(mappedValue));
85
-
86
- if (mappedValue !== currentValue) {
87
- setCaretPosition(domElement.selectionStart);
88
- } else {
89
- setCaretPosition(domElement.selectionStart ? domElement.selectionStart - 1 : null);
90
- }
91
- }
92
- };
93
-
94
- const handlePaste = (event: React.ClipboardEvent<HTMLInputElement>) => {
95
- const str = event.clipboardData.getData('text/plain').split('').join('');
96
- const domElement = event.currentTarget;
97
-
98
- if (!input) {
99
- setInput(domElement);
100
- }
101
-
102
- event.preventDefault();
103
- const selectionStart = domElement.selectionStart ?? 0;
104
- const selectionEnd = domElement.selectionEnd ?? 0;
105
-
106
- let mappedValue = str
107
- .split('')
108
- .map((symbol) =>
109
- regex.test(symbol)
110
- ? symbol
111
- : transformCaseSensitive(smartType, TransliterationMap, symbol),
112
- )
113
- .filter((letter) => regex.test(letter))
114
- .join('');
115
-
116
- const newValueLength =
117
- mappedValue.length + currentValue.length - (selectionEnd - selectionStart);
118
-
119
- if (maxLength !== undefined && maxLength >= 0 && newValueLength > maxLength) {
120
- const validMappedValueLength = mappedValue.length - (newValueLength - maxLength);
121
-
122
- mappedValue = mappedValue.substring(0, validMappedValueLength);
123
- }
124
-
125
- const newValue = getUpperCaseIfNeeded(
126
- `${currentValue?.substring(0, selectionStart)}${mappedValue}${currentValue?.substring(
127
- selectionEnd,
128
- )}`,
129
- );
130
-
131
- setCaretPosition(selectionStart + mappedValue.length);
132
- setCurrentValue(newValue);
133
- onChange(newValue);
134
- };
135
-
136
- return (
137
- <Input
138
- {...rest}
139
- ref={ref}
140
- maxLength={maxLength}
141
- onChange={handleChange}
142
- onPaste={handlePaste}
143
- value={currentValue}
144
- />
145
- );
146
- },
147
- );
1
+ import React, { useState, useEffect, forwardRef } from 'react';
2
+ import { Input, IInputProps } from '../Input';
3
+ import { CharactersMap, transformCaseSensitive, TransliterationMap } from './helpers';
4
+
5
+ export type TSmartType =
6
+ | 'name'
7
+ | 'nameRuEn'
8
+ | 'surname'
9
+ | 'surnameRuEn'
10
+ | 'email'
11
+ | 'agencyName'
12
+ | 'default'
13
+ | 'digits'
14
+ | 'docNumber'
15
+ | 'benefitCert';
16
+
17
+ export interface ISmartInputProps extends IInputProps {
18
+ isUpperCase?: boolean;
19
+ smartType?: TSmartType;
20
+ regExp?: RegExp;
21
+ onChange: (value: string) => void;
22
+ }
23
+
24
+ export const SMART_INPUT_REGEX_MAP = {
25
+ default: /./i,
26
+ agencyName: /^[a-zA-Z\s0-9-]*$/i,
27
+ surname: /^[a-zA-Z\s-]*$/i,
28
+ name: /^[a-zA-Z\s-.`']*$/i,
29
+ surnameRuEn: /^[a-zA-Zа-яА-Я\s-]*$/i,
30
+ nameRuEn: /^[a-zA-Zа-яА-Я\s-.`']*$/i,
31
+ email: /^[a-zA-Z0-9@_\-.+']*$/i,
32
+ digits: /^[0-9]*$/i,
33
+ docNumber: /^[a-zA-Z0-9]*$/i,
34
+ benefitCert: /^[a-zA-Z0-9/]*$/i,
35
+ };
36
+
37
+ export const SmartInput = forwardRef<HTMLInputElement, ISmartInputProps>(
38
+ (
39
+ { onChange, isUpperCase, smartType = 'default', regExp, value = '', maxLength, ...rest },
40
+ ref,
41
+ ) => {
42
+ const [currentValue, setCurrentValue] = useState<string>(getUpperCaseIfNeeded(value));
43
+ const [caretPosition, setCaretPosition] = useState<number | null>(null);
44
+ const [input, setInput] = useState<HTMLInputElement | null>(null);
45
+ const regex = regExp || SMART_INPUT_REGEX_MAP[smartType];
46
+
47
+ useEffect(() => {
48
+ if (input && input.type !== 'email' && input.selectionStart !== caretPosition) {
49
+ input.selectionStart = caretPosition;
50
+ input.selectionEnd = caretPosition;
51
+ }
52
+ }, [caretPosition]);
53
+
54
+ useEffect(() => {
55
+ setCurrentValue(getUpperCaseIfNeeded(value));
56
+ }, [value]);
57
+
58
+ function getUpperCaseIfNeeded(str: string) {
59
+ return isUpperCase ? str.toUpperCase() : str;
60
+ }
61
+
62
+ const handleChange = (str: string, event?: React.FormEvent<HTMLInputElement>) => {
63
+ const mappedValue = str
64
+ .split('')
65
+ .map((symbol) =>
66
+ regex.test(symbol)
67
+ ? symbol
68
+ : transformCaseSensitive(
69
+ smartType,
70
+ smartType !== 'email' ? CharactersMap : { ...CharactersMap, '"': '@' },
71
+ symbol,
72
+ ),
73
+ )
74
+ .filter((symbol) => regex.test(symbol))
75
+ .join('');
76
+ const domElement = event?.currentTarget;
77
+
78
+ if (domElement) {
79
+ if (!input) {
80
+ setInput(domElement);
81
+ }
82
+
83
+ setCurrentValue(getUpperCaseIfNeeded(mappedValue));
84
+ onChange(getUpperCaseIfNeeded(mappedValue));
85
+
86
+ if (mappedValue !== currentValue) {
87
+ setCaretPosition(domElement.selectionStart);
88
+ } else {
89
+ setCaretPosition(domElement.selectionStart ? domElement.selectionStart - 1 : null);
90
+ }
91
+ }
92
+ };
93
+
94
+ const handlePaste = (event: React.ClipboardEvent<HTMLInputElement>) => {
95
+ const str = event.clipboardData.getData('text/plain').split('').join('');
96
+ const domElement = event.currentTarget;
97
+
98
+ if (!input) {
99
+ setInput(domElement);
100
+ }
101
+
102
+ event.preventDefault();
103
+ const selectionStart = domElement.selectionStart ?? 0;
104
+ const selectionEnd = domElement.selectionEnd ?? 0;
105
+
106
+ let mappedValue = str
107
+ .split('')
108
+ .map((symbol) =>
109
+ regex.test(symbol)
110
+ ? symbol
111
+ : transformCaseSensitive(smartType, TransliterationMap, symbol),
112
+ )
113
+ .filter((letter) => regex.test(letter))
114
+ .join('');
115
+
116
+ const newValueLength =
117
+ mappedValue.length + currentValue.length - (selectionEnd - selectionStart);
118
+
119
+ if (maxLength !== undefined && maxLength >= 0 && newValueLength > maxLength) {
120
+ const validMappedValueLength = mappedValue.length - (newValueLength - maxLength);
121
+
122
+ mappedValue = mappedValue.substring(0, validMappedValueLength);
123
+ }
124
+
125
+ const newValue = getUpperCaseIfNeeded(
126
+ `${currentValue?.substring(0, selectionStart)}${mappedValue}${currentValue?.substring(
127
+ selectionEnd,
128
+ )}`,
129
+ );
130
+
131
+ setCaretPosition(selectionStart + mappedValue.length);
132
+ setCurrentValue(newValue);
133
+ onChange(newValue);
134
+ };
135
+
136
+ return (
137
+ <Input
138
+ {...rest}
139
+ ref={ref}
140
+ maxLength={maxLength}
141
+ onChange={handleChange}
142
+ onPaste={handlePaste}
143
+ value={currentValue}
144
+ />
145
+ );
146
+ },
147
+ );
@@ -1,85 +1,85 @@
1
- import { TSmartType } from './SmartInput';
2
-
3
- export const transformCaseSensitive = (
4
- smartType: TSmartType,
5
- map: { [key: string]: string },
6
- symbol: string,
7
- ): string => {
8
- const isUpperCase = symbol.toUpperCase() === symbol;
9
- const result = smartType.endsWith('RuEn')
10
- ? symbol.toLowerCase()
11
- : map[symbol.toLowerCase()] ?? symbol;
12
- return isUpperCase ? result.toUpperCase() : result;
13
- };
14
-
15
- export const CharactersMap: { [key: string]: string } = {
16
- й: 'q',
17
- ц: 'w',
18
- у: 'e',
19
- к: 'r',
20
- е: 't',
21
- н: 'y',
22
- г: 'u',
23
- ш: 'i',
24
- щ: 'o',
25
- з: 'p',
26
- х: '[',
27
- ъ: ']',
28
- ф: 'a',
29
- ы: 's',
30
- в: 'd',
31
- а: 'f',
32
- п: 'g',
33
- р: 'h',
34
- о: 'j',
35
- л: 'k',
36
- д: 'l',
37
- ж: ';',
38
- э: "'",
39
- я: 'z',
40
- ч: 'x',
41
- с: 'c',
42
- м: 'v',
43
- и: 'b',
44
- т: 'n',
45
- ь: 'm',
46
- б: ',',
47
- ю: '.',
48
- ё: '`',
49
- };
50
-
51
- export const TransliterationMap: { [key: string]: string } = {
52
- й: 'i',
53
- ц: 'ts',
54
- у: 'u',
55
- к: 'k',
56
- е: 'e',
57
- н: 'n',
58
- г: 'g',
59
- ш: 'sh',
60
- щ: 'shch',
61
- з: 'z',
62
- х: 'h',
63
- ъ: 'ie',
64
- ф: 'f',
65
- ы: 'y',
66
- в: 'v',
67
- а: 'a',
68
- п: 'p',
69
- р: 'r',
70
- о: 'o',
71
- л: 'l',
72
- д: 'd',
73
- ж: 'zh',
74
- э: 'e',
75
- я: 'ia',
76
- ч: 'ch',
77
- с: 's',
78
- м: 'm',
79
- и: 'i',
80
- т: 't',
81
- ь: '',
82
- б: 'b',
83
- ю: 'iu',
84
- ё: 'e',
85
- };
1
+ import { TSmartType } from './SmartInput';
2
+
3
+ export const transformCaseSensitive = (
4
+ smartType: TSmartType,
5
+ map: { [key: string]: string },
6
+ symbol: string,
7
+ ): string => {
8
+ const isUpperCase = symbol.toUpperCase() === symbol;
9
+ const result = smartType.endsWith('RuEn')
10
+ ? symbol.toLowerCase()
11
+ : map[symbol.toLowerCase()] ?? symbol;
12
+ return isUpperCase ? result.toUpperCase() : result;
13
+ };
14
+
15
+ export const CharactersMap: { [key: string]: string } = {
16
+ й: 'q',
17
+ ц: 'w',
18
+ у: 'e',
19
+ к: 'r',
20
+ е: 't',
21
+ н: 'y',
22
+ г: 'u',
23
+ ш: 'i',
24
+ щ: 'o',
25
+ з: 'p',
26
+ х: '[',
27
+ ъ: ']',
28
+ ф: 'a',
29
+ ы: 's',
30
+ в: 'd',
31
+ а: 'f',
32
+ п: 'g',
33
+ р: 'h',
34
+ о: 'j',
35
+ л: 'k',
36
+ д: 'l',
37
+ ж: ';',
38
+ э: "'",
39
+ я: 'z',
40
+ ч: 'x',
41
+ с: 'c',
42
+ м: 'v',
43
+ и: 'b',
44
+ т: 'n',
45
+ ь: 'm',
46
+ б: ',',
47
+ ю: '.',
48
+ ё: '`',
49
+ };
50
+
51
+ export const TransliterationMap: { [key: string]: string } = {
52
+ й: 'i',
53
+ ц: 'ts',
54
+ у: 'u',
55
+ к: 'k',
56
+ е: 'e',
57
+ н: 'n',
58
+ г: 'g',
59
+ ш: 'sh',
60
+ щ: 'shch',
61
+ з: 'z',
62
+ х: 'h',
63
+ ъ: 'ie',
64
+ ф: 'f',
65
+ ы: 'y',
66
+ в: 'v',
67
+ а: 'a',
68
+ п: 'p',
69
+ р: 'r',
70
+ о: 'o',
71
+ л: 'l',
72
+ д: 'd',
73
+ ж: 'zh',
74
+ э: 'e',
75
+ я: 'ia',
76
+ ч: 'ch',
77
+ с: 's',
78
+ м: 'm',
79
+ и: 'i',
80
+ т: 't',
81
+ ь: '',
82
+ б: 'b',
83
+ ю: 'iu',
84
+ ё: 'e',
85
+ };
@@ -1 +1 @@
1
- export * from './SmartInput';
1
+ export * from './SmartInput';