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

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 (242) hide show
  1. package/LICENSE +201 -201
  2. package/dist/components/Flag/augment.d.ts +1 -1
  3. package/dist/components/Icon/complexIcons/augment.d.ts +1 -1
  4. package/dist/true-react-common-ui-kit.js +58 -58
  5. package/dist/true-react-common-ui-kit.js.map +1 -1
  6. package/dist/true-react-common-ui-kit.umd.cjs +58 -58
  7. package/dist/true-react-common-ui-kit.umd.cjs.map +1 -1
  8. package/dist/vite-env.d.ts +1 -1
  9. package/package.json +93 -93
  10. package/src/components/AccountInfo/AccountInfo.stories.tsx +32 -32
  11. package/src/components/AccountInfo/AccountInfo.styles.ts +55 -55
  12. package/src/components/AccountInfo/AccountInfo.tsx +77 -77
  13. package/src/components/AccountInfo/index.ts +2 -2
  14. package/src/components/AddButton/AddButton.stories.tsx +21 -21
  15. package/src/components/AddButton/AddButton.styles.ts +34 -34
  16. package/src/components/AddButton/AddButton.tsx +48 -48
  17. package/src/components/AddButton/index.ts +2 -2
  18. package/src/components/Button/Button.stories.tsx +52 -52
  19. package/src/components/Button/Button.styles.ts +196 -196
  20. package/src/components/Button/Button.tsx +167 -167
  21. package/src/components/Button/index.ts +2 -2
  22. package/src/components/Checkbox/Checkbox.stories.tsx +32 -32
  23. package/src/components/Checkbox/Checkbox.styles.ts +62 -62
  24. package/src/components/Checkbox/Checkbox.tsx +105 -105
  25. package/src/components/Checkbox/index.ts +2 -2
  26. package/src/components/CloseButton/CloseButton.styles.ts +34 -34
  27. package/src/components/CloseButton/CloseButton.tsx +35 -35
  28. package/src/components/CloseButton/index.ts +2 -2
  29. package/src/components/Colors/Colors.stories.tsx +7 -7
  30. package/src/components/Colors/Colors.styles.ts +38 -38
  31. package/src/components/Colors/Colors.tsx +26 -26
  32. package/src/components/Colors/index.ts +2 -2
  33. package/src/components/CssBaseline/CssBaseline.styles.ts +15 -15
  34. package/src/components/CssBaseline/CssBaseline.tsx +15 -15
  35. package/src/components/CssBaseline/index.ts +2 -2
  36. package/src/components/DateInput/DateInput.stories.tsx +61 -61
  37. package/src/components/DateInput/DateInput.styles.ts +14 -14
  38. package/src/components/DateInput/DateInput.tsx +82 -82
  39. package/src/components/DateInput/constants.ts +2 -2
  40. package/src/components/DateInput/index.ts +3 -3
  41. package/src/components/DatePicker/DatePicker.stories.tsx +87 -87
  42. package/src/components/DatePicker/DatePicker.styles.ts +44 -44
  43. package/src/components/DatePicker/DatePicker.tsx +327 -327
  44. package/src/components/DatePicker/DatePickerHeader/DatePickerHeader.styles.ts +84 -84
  45. package/src/components/DatePicker/DatePickerHeader/DatePickerHeader.tsx +79 -79
  46. package/src/components/DatePicker/DatePickerHeader/index.ts +2 -2
  47. package/src/components/DatePicker/constants.ts +1 -1
  48. package/src/components/DatePicker/helpers.ts +23 -23
  49. package/src/components/DatePicker/index.ts +3 -3
  50. package/src/components/DatePicker/types.ts +45 -45
  51. package/src/components/Description/Description.stories.tsx +27 -27
  52. package/src/components/Description/Description.styles.ts +31 -31
  53. package/src/components/Description/Description.tsx +60 -60
  54. package/src/components/Description/index.ts +2 -2
  55. package/src/components/FiltersPane/FilterInterval/FilterInterval.styles.ts +64 -64
  56. package/src/components/FiltersPane/FilterInterval/FilterInterval.tsx +143 -143
  57. package/src/components/FiltersPane/FilterInterval/index.ts +1 -1
  58. package/src/components/FiltersPane/FilterMultiSelect/FilterMultiSelect.tsx +10 -10
  59. package/src/components/FiltersPane/FilterMultiSelect/index.ts +1 -1
  60. package/src/components/FiltersPane/FilterSelect/FilterSelect.styles.ts +143 -143
  61. package/src/components/FiltersPane/FilterSelect/FilterSelect.tsx +348 -348
  62. package/src/components/FiltersPane/FilterSelect/index.ts +1 -1
  63. package/src/components/FiltersPane/FilterSelect/locales.ts +37 -37
  64. package/src/components/FiltersPane/FilterValueView/FilterValueView.styles.tsx +15 -15
  65. package/src/components/FiltersPane/FilterValueView/FilterValueView.tsx +166 -166
  66. package/src/components/FiltersPane/FilterValueView/index.tsx +1 -1
  67. package/src/components/FiltersPane/FilterWithDates/FilterWithDates.styles.ts +60 -60
  68. package/src/components/FiltersPane/FilterWithDates/FilterWithDates.tsx +184 -184
  69. package/src/components/FiltersPane/FilterWithDates/index.ts +1 -1
  70. package/src/components/FiltersPane/FilterWithPeriod/FilterWithPeriod.styles.ts +17 -17
  71. package/src/components/FiltersPane/FilterWithPeriod/FilterWithPeriod.tsx +198 -198
  72. package/src/components/FiltersPane/FilterWithPeriod/index.ts +1 -1
  73. package/src/components/FiltersPane/FilterWrapper/FilterWrapper.styles.ts +110 -110
  74. package/src/components/FiltersPane/FilterWrapper/FilterWrapper.tsx +346 -346
  75. package/src/components/FiltersPane/FilterWrapper/index.ts +1 -1
  76. package/src/components/FiltersPane/FiltersPane.stories.tsx +295 -295
  77. package/src/components/FiltersPane/FiltersPane.styles.ts +71 -71
  78. package/src/components/FiltersPane/FiltersPane.tsx +151 -151
  79. package/src/components/FiltersPane/FiltersPaneSearch/FiltersPaneSearch.styles.ts +109 -109
  80. package/src/components/FiltersPane/FiltersPaneSearch/FiltersPaneSearch.tsx +155 -155
  81. package/src/components/FiltersPane/FiltersPaneSearch/index.ts +1 -1
  82. package/src/components/FiltersPane/index.ts +20 -20
  83. package/src/components/FiltersPane/locales.ts +107 -107
  84. package/src/components/FiltersPane/types.ts +112 -112
  85. package/src/components/Flag/Flag.stories.tsx +29 -29
  86. package/src/components/Flag/Flag.styles.ts +18 -18
  87. package/src/components/Flag/Flag.tsx +27 -27
  88. package/src/components/Flag/augment.d.ts +1 -1
  89. package/src/components/Flag/index.ts +2 -2
  90. package/src/components/FlexibleTable/FlexibleTable.stories.tsx +84 -84
  91. package/src/components/FlexibleTable/FlexibleTable.styles.ts +131 -131
  92. package/src/components/FlexibleTable/FlexibleTable.tsx +205 -205
  93. package/src/components/FlexibleTable/TableRow.tsx +152 -152
  94. package/src/components/FlexibleTable/TableValue.tsx +75 -75
  95. package/src/components/FlexibleTable/fixture-test.ts +254 -254
  96. package/src/components/FlexibleTable/index.ts +3 -3
  97. package/src/components/FlexibleTable/types.ts +52 -52
  98. package/src/components/Icon/ComplexIconBoilerplate.tsx +17 -17
  99. package/src/components/Icon/Icon.stories.tsx +85 -85
  100. package/src/components/Icon/Icon.styles.ts +10 -10
  101. package/src/components/Icon/Icon.tsx +32 -32
  102. package/src/components/Icon/IconBoilerplate.tsx +42 -42
  103. package/src/components/Icon/complexIcons/augment.d.ts +1 -1
  104. package/src/components/Icon/complexIcons/avatarGreen.svg +57 -57
  105. package/src/components/Icon/complexIcons/icons.ts +7 -7
  106. package/src/components/Icon/complexIcons/index.ts +1 -1
  107. package/src/components/Icon/icons/icons.ts +838 -838
  108. package/src/components/Icon/icons/index.ts +1 -1
  109. package/src/components/Icon/index.ts +4 -4
  110. package/src/components/IncrementInput/ChangeButton.tsx +33 -33
  111. package/src/components/IncrementInput/IncrementInput.stories.tsx +31 -31
  112. package/src/components/IncrementInput/IncrementInput.styles.ts +77 -77
  113. package/src/components/IncrementInput/IncrementInput.tsx +80 -80
  114. package/src/components/IncrementInput/index.ts +2 -2
  115. package/src/components/Input/Input.stories.tsx +86 -86
  116. package/src/components/Input/Input.styles.ts +307 -307
  117. package/src/components/Input/Input.tsx +311 -311
  118. package/src/components/Input/index.ts +2 -2
  119. package/src/components/List/List.stories.tsx +62 -62
  120. package/src/components/List/List.styles.ts +52 -52
  121. package/src/components/List/List.tsx +64 -64
  122. package/src/components/List/index.ts +2 -2
  123. package/src/components/Modal/Modal.stories.tsx +105 -105
  124. package/src/components/Modal/Modal.styles.ts +305 -305
  125. package/src/components/Modal/Modal.tsx +200 -200
  126. package/src/components/Modal/index.ts +2 -2
  127. package/src/components/MoreMenu/MoreMenu.stories.tsx +46 -46
  128. package/src/components/MoreMenu/MoreMenu.styles.ts +70 -70
  129. package/src/components/MoreMenu/MoreMenu.tsx +90 -90
  130. package/src/components/MoreMenu/index.ts +2 -2
  131. package/src/components/MultiSelect/MultiSelect.stories.tsx +46 -46
  132. package/src/components/MultiSelect/MultiSelect.styles.ts +55 -55
  133. package/src/components/MultiSelect/MultiSelect.tsx +89 -89
  134. package/src/components/MultiSelect/MultiSelectInput/MultiSelectInput.styles.ts +73 -73
  135. package/src/components/MultiSelect/MultiSelectInput/MultiSelectInput.tsx +51 -51
  136. package/src/components/MultiSelect/MultiSelectInput/index.ts +1 -1
  137. package/src/components/MultiSelect/index.ts +3 -3
  138. package/src/components/MultiSelectList/MultiSelectList.styles.ts +124 -124
  139. package/src/components/MultiSelectList/MultiSelectList.tsx +451 -451
  140. package/src/components/MultiSelectList/index.ts +2 -2
  141. package/src/components/MultiSelectList/locales.ts +37 -37
  142. package/src/components/Notification/Notification.stories.tsx +46 -46
  143. package/src/components/Notification/Notification.styles.ts +50 -50
  144. package/src/components/Notification/Notification.tsx +79 -79
  145. package/src/components/Notification/index.ts +2 -2
  146. package/src/components/NumberInput/NumberInput.stories.tsx +35 -35
  147. package/src/components/NumberInput/NumberInput.tsx +133 -133
  148. package/src/components/NumberInput/helpers.ts +86 -86
  149. package/src/components/NumberInput/index.ts +1 -1
  150. package/src/components/PhoneInput/PhoneInput.stories.tsx +70 -70
  151. package/src/components/PhoneInput/PhoneInput.styles.ts +84 -84
  152. package/src/components/PhoneInput/PhoneInput.tsx +194 -194
  153. package/src/components/PhoneInput/PhoneInputCountryList/PhoneInputCountryList.stories.tsx +21 -21
  154. package/src/components/PhoneInput/PhoneInputCountryList/PhoneInputCountryList.styles.ts +100 -100
  155. package/src/components/PhoneInput/PhoneInputCountryList/PhoneInputCountryList.tsx +147 -147
  156. package/src/components/PhoneInput/PhoneInputCountryList/index.ts +2 -2
  157. package/src/components/PhoneInput/index.ts +6 -6
  158. package/src/components/PhoneInput/phone-info.ts +2147 -2147
  159. package/src/components/PhoneInput/types.ts +16 -16
  160. package/src/components/RadioButton/RadioButton.stories.tsx +46 -46
  161. package/src/components/RadioButton/RadioButton.styles.ts +37 -37
  162. package/src/components/RadioButton/RadioButton.tsx +55 -55
  163. package/src/components/RadioButton/index.ts +2 -2
  164. package/src/components/ScrollIntoViewIfNeeded/ScrollIntoViewIfNeeded.ts +61 -61
  165. package/src/components/ScrollIntoViewIfNeeded/index.ts +1 -1
  166. package/src/components/SearchInput/SearchInput.stories.tsx +23 -23
  167. package/src/components/SearchInput/SearchInput.styles.ts +50 -50
  168. package/src/components/SearchInput/SearchInput.tsx +50 -50
  169. package/src/components/SearchInput/index.ts +2 -2
  170. package/src/components/Select/MultiSelect.stories.tsx +240 -240
  171. package/src/components/Select/Select.stories.tsx +235 -235
  172. package/src/components/Select/Select.styles.ts +96 -96
  173. package/src/components/Select/Select.tsx +575 -575
  174. package/src/components/Select/SelectList/SelectList.styles.ts +72 -72
  175. package/src/components/Select/SelectList/SelectList.tsx +158 -158
  176. package/src/components/Select/SelectList/index.ts +1 -1
  177. package/src/components/Select/SelectListItem/SelectListItem.styles.ts +14 -14
  178. package/src/components/Select/SelectListItem/SelectListItem.tsx +68 -68
  179. package/src/components/Select/constants.ts +2 -2
  180. package/src/components/Select/helpers.ts +26 -26
  181. package/src/components/Select/index.ts +4 -4
  182. package/src/components/Select/types.ts +1 -1
  183. package/src/components/SmartInput/SmartInput.stories.tsx +50 -50
  184. package/src/components/SmartInput/SmartInput.tsx +147 -147
  185. package/src/components/SmartInput/helpers.ts +85 -85
  186. package/src/components/SmartInput/index.ts +1 -1
  187. package/src/components/Switch/Switch.stories.tsx +40 -40
  188. package/src/components/Switch/Switch.styles.ts +75 -75
  189. package/src/components/Switch/Switch.tsx +83 -83
  190. package/src/components/Switch/index.ts +2 -2
  191. package/src/components/TextArea/TextArea.stories.tsx +35 -35
  192. package/src/components/TextArea/TextArea.styles.ts +153 -153
  193. package/src/components/TextArea/TextArea.tsx +165 -165
  194. package/src/components/TextArea/index.ts +2 -2
  195. package/src/components/TextWithInfo/TextWithInfo.stories.tsx +53 -53
  196. package/src/components/TextWithInfo/TextWithInfo.styles.ts +60 -60
  197. package/src/components/TextWithInfo/TextWithInfo.tsx +60 -60
  198. package/src/components/TextWithInfo/index.ts +2 -2
  199. package/src/components/TextWithTooltip/TextWithTooltip.stories.tsx +58 -58
  200. package/src/components/TextWithTooltip/TextWithTooltip.styles.ts +19 -19
  201. package/src/components/TextWithTooltip/TextWithTooltip.tsx +143 -143
  202. package/src/components/TextWithTooltip/index.ts +2 -2
  203. package/src/components/ThemedPreloader/ThemedPreloader.stories.tsx +41 -41
  204. package/src/components/ThemedPreloader/ThemedPreloader.styles.ts +21 -21
  205. package/src/components/ThemedPreloader/ThemedPreloader.tsx +50 -50
  206. package/src/components/ThemedPreloader/components/DefaultPreloader/DefaultPreloader.tsx +29 -29
  207. package/src/components/ThemedPreloader/components/DefaultPreloader/index.ts +1 -1
  208. package/src/components/ThemedPreloader/components/DotsPreloader/DotsPreloader.styles.ts +54 -54
  209. package/src/components/ThemedPreloader/components/DotsPreloader/DotsPreloader.tsx +18 -18
  210. package/src/components/ThemedPreloader/components/DotsPreloader/index.ts +2 -2
  211. package/src/components/ThemedPreloader/components/SvgPreloader/SvgPreloader.styles.ts +11 -11
  212. package/src/components/ThemedPreloader/components/SvgPreloader/SvgPreloader.tsx +25 -25
  213. package/src/components/ThemedPreloader/components/SvgPreloader/index.ts +2 -2
  214. package/src/components/ThemedPreloader/components/index.ts +2 -2
  215. package/src/components/ThemedPreloader/index.ts +2 -2
  216. package/src/components/Toaster/Toaster.stories.tsx +30 -30
  217. package/src/components/Toaster/Toaster.styles.ts +59 -59
  218. package/src/components/Toaster/Toaster.tsx +110 -110
  219. package/src/components/Toaster/index.ts +2 -2
  220. package/src/components/Tooltip/Tooltip.stories.tsx +19 -19
  221. package/src/components/Tooltip/Tooltip.styles.ts +45 -45
  222. package/src/components/Tooltip/Tooltip.tsx +35 -35
  223. package/src/components/Tooltip/index.ts +3 -3
  224. package/src/components/Tooltip/types.ts +1 -1
  225. package/src/components/index.ts +36 -36
  226. package/src/helpers/deprecated.ts +23 -22
  227. package/src/helpers/index.ts +4 -4
  228. package/src/helpers/misc.ts +158 -158
  229. package/src/helpers/phone.ts +87 -87
  230. package/src/helpers/popper-helpers.ts +17 -17
  231. package/src/helpers/snippets.tsx +6 -6
  232. package/src/hooks/index.ts +6 -6
  233. package/src/hooks/use-did-mount-effect.ts +18 -18
  234. package/src/hooks/use-dropdown.ts +82 -82
  235. package/src/hooks/use-is-mounted.ts +15 -15
  236. package/src/hooks/use-on-click-outside.ts +77 -77
  237. package/src/hooks/use-theme.ts +32 -32
  238. package/src/hooks/use-tweak-styles.ts +13 -13
  239. package/src/index.ts +6 -6
  240. package/src/theme.ts +149 -149
  241. package/src/types.ts +107 -107
  242. 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';