@true-engineering/true-react-common-ui-kit 1.5.3 → 1.7.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/dist/components/Checkbox/Checkbox.d.ts +2 -1
  3. package/dist/components/Checkbox/Checkbox.styles.d.ts +4 -1
  4. package/dist/components/Flag/augment.d.ts +1 -1
  5. package/dist/components/FlexibleTable/types.d.ts +2 -2
  6. package/dist/components/Icon/complexIcons/augment.d.ts +1 -1
  7. package/dist/helpers/index.d.ts +0 -1
  8. package/dist/helpers/utils.d.ts +8 -0
  9. package/dist/true-react-common-ui-kit.js +183 -154
  10. package/dist/true-react-common-ui-kit.js.map +1 -1
  11. package/dist/true-react-common-ui-kit.umd.cjs +183 -154
  12. package/dist/true-react-common-ui-kit.umd.cjs.map +1 -1
  13. package/dist/vite-env.d.ts +1 -1
  14. package/package.json +91 -91
  15. package/src/components/AccountInfo/AccountInfo.stories.tsx +35 -35
  16. package/src/components/AccountInfo/AccountInfo.styles.ts +55 -55
  17. package/src/components/AccountInfo/AccountInfo.tsx +106 -106
  18. package/src/components/AccountInfo/index.ts +2 -2
  19. package/src/components/AddButton/AddButton.stories.tsx +21 -21
  20. package/src/components/AddButton/AddButton.styles.ts +34 -34
  21. package/src/components/AddButton/AddButton.tsx +49 -49
  22. package/src/components/AddButton/index.ts +2 -2
  23. package/src/components/Button/Button.stories.tsx +61 -61
  24. package/src/components/Button/Button.styles.ts +196 -196
  25. package/src/components/Button/Button.tsx +195 -195
  26. package/src/components/Button/index.ts +2 -2
  27. package/src/components/Checkbox/Checkbox.stories.tsx +35 -35
  28. package/src/components/Checkbox/Checkbox.styles.ts +62 -59
  29. package/src/components/Checkbox/Checkbox.tsx +106 -93
  30. package/src/components/Checkbox/index.ts +2 -2
  31. package/src/components/CloseButton/CloseButton.styles.ts +34 -34
  32. package/src/components/CloseButton/CloseButton.tsx +37 -37
  33. package/src/components/CloseButton/index.ts +2 -2
  34. package/src/components/Colors/Colors.stories.tsx +7 -7
  35. package/src/components/Colors/Colors.styles.ts +38 -38
  36. package/src/components/Colors/Colors.tsx +34 -34
  37. package/src/components/Colors/index.ts +2 -2
  38. package/src/components/CssBaseline/CssBaseline.styles.ts +15 -15
  39. package/src/components/CssBaseline/CssBaseline.tsx +17 -17
  40. package/src/components/CssBaseline/index.ts +2 -2
  41. package/src/components/DateInput/DateInput.stories.tsx +63 -63
  42. package/src/components/DateInput/DateInput.styles.ts +14 -14
  43. package/src/components/DateInput/DateInput.tsx +60 -60
  44. package/src/components/DateInput/index.ts +2 -2
  45. package/src/components/DatePicker/DatePicker.stories.tsx +96 -96
  46. package/src/components/DatePicker/DatePicker.styles.ts +54 -54
  47. package/src/components/DatePicker/DatePicker.tsx +358 -358
  48. package/src/components/DatePicker/DatePickerHeader/DatePickerHeader.styles.ts +84 -84
  49. package/src/components/DatePicker/DatePickerHeader/DatePickerHeader.tsx +94 -94
  50. package/src/components/DatePicker/DatePickerHeader/index.ts +1 -1
  51. package/src/components/DatePicker/DatePickerInput/DatePickerInput.styles.ts +25 -25
  52. package/src/components/DatePicker/DatePickerInput/DatePickerInput.tsx +31 -31
  53. package/src/components/DatePicker/DatePickerInput/index.ts +1 -1
  54. package/src/components/DatePicker/index.ts +4 -4
  55. package/src/components/Description/Description.stories.tsx +29 -29
  56. package/src/components/Description/Description.styles.ts +31 -31
  57. package/src/components/Description/Description.tsx +69 -69
  58. package/src/components/Description/index.ts +2 -2
  59. package/src/components/FiltersPane/FilterInterval/FilterInterval.styles.ts +64 -64
  60. package/src/components/FiltersPane/FilterInterval/FilterInterval.tsx +162 -162
  61. package/src/components/FiltersPane/FilterInterval/index.ts +1 -1
  62. package/src/components/FiltersPane/FilterMultiSelect/FilterMultiSelect.tsx +14 -14
  63. package/src/components/FiltersPane/FilterMultiSelect/index.ts +1 -1
  64. package/src/components/FiltersPane/FilterSelect/FilterSelect.styles.ts +144 -144
  65. package/src/components/FiltersPane/FilterSelect/FilterSelect.tsx +397 -397
  66. package/src/components/FiltersPane/FilterSelect/index.ts +1 -1
  67. package/src/components/FiltersPane/FilterSelect/locales.ts +37 -37
  68. package/src/components/FiltersPane/FilterValueView/FilterValueView.styles.tsx +15 -15
  69. package/src/components/FiltersPane/FilterValueView/FilterValueView.tsx +186 -186
  70. package/src/components/FiltersPane/FilterValueView/index.tsx +1 -1
  71. package/src/components/FiltersPane/FilterWithDates/FilterWithDates.styles.ts +60 -60
  72. package/src/components/FiltersPane/FilterWithDates/FilterWithDates.tsx +222 -222
  73. package/src/components/FiltersPane/FilterWithDates/index.ts +1 -1
  74. package/src/components/FiltersPane/FilterWithPeriod/FilterWithPeriod.styles.ts +17 -17
  75. package/src/components/FiltersPane/FilterWithPeriod/FilterWithPeriod.tsx +231 -231
  76. package/src/components/FiltersPane/FilterWithPeriod/index.ts +1 -1
  77. package/src/components/FiltersPane/FilterWrapper/FilterWrapper.styles.ts +110 -110
  78. package/src/components/FiltersPane/FilterWrapper/FilterWrapper.tsx +360 -360
  79. package/src/components/FiltersPane/FilterWrapper/index.ts +1 -1
  80. package/src/components/FiltersPane/FiltersPane.stories.tsx +308 -308
  81. package/src/components/FiltersPane/FiltersPane.styles.ts +71 -71
  82. package/src/components/FiltersPane/FiltersPane.tsx +193 -193
  83. package/src/components/FiltersPane/FiltersPaneSearch/FiltersPaneSearch.styles.ts +109 -109
  84. package/src/components/FiltersPane/FiltersPaneSearch/FiltersPaneSearch.tsx +175 -175
  85. package/src/components/FiltersPane/FiltersPaneSearch/index.ts +1 -1
  86. package/src/components/FiltersPane/index.ts +20 -20
  87. package/src/components/FiltersPane/locales.ts +107 -107
  88. package/src/components/FiltersPane/types.ts +126 -126
  89. package/src/components/Flag/Flag.stories.tsx +29 -29
  90. package/src/components/Flag/Flag.styles.ts +18 -18
  91. package/src/components/Flag/Flag.tsx +28 -28
  92. package/src/components/Flag/augment.d.ts +1 -1
  93. package/src/components/Flag/index.ts +2 -2
  94. package/src/components/FlexibleTable/FlexibleTable.stories.tsx +86 -80
  95. package/src/components/FlexibleTable/FlexibleTable.styles.ts +131 -131
  96. package/src/components/FlexibleTable/FlexibleTable.tsx +243 -243
  97. package/src/components/FlexibleTable/TableRow.tsx +171 -171
  98. package/src/components/FlexibleTable/TableValue.tsx +83 -83
  99. package/src/components/FlexibleTable/fixture-test.ts +254 -254
  100. package/src/components/FlexibleTable/index.ts +3 -3
  101. package/src/components/FlexibleTable/types.ts +58 -58
  102. package/src/components/Icon/ComplexIconBoilerplate.tsx +17 -17
  103. package/src/components/Icon/Icon.stories.tsx +88 -88
  104. package/src/components/Icon/Icon.styles.ts +10 -10
  105. package/src/components/Icon/Icon.tsx +34 -34
  106. package/src/components/Icon/IconBoilerplate.tsx +42 -42
  107. package/src/components/Icon/complexIcons/augment.d.ts +1 -1
  108. package/src/components/Icon/complexIcons/avatarGreen.svg +57 -57
  109. package/src/components/Icon/complexIcons/icons.ts +7 -7
  110. package/src/components/Icon/complexIcons/index.ts +1 -1
  111. package/src/components/Icon/icons/icons.ts +838 -838
  112. package/src/components/Icon/icons/index.ts +1 -1
  113. package/src/components/Icon/index.ts +4 -4
  114. package/src/components/IncrementInput/ChangeButton.tsx +34 -34
  115. package/src/components/IncrementInput/IncrementInput.stories.tsx +34 -34
  116. package/src/components/IncrementInput/IncrementInput.styles.ts +77 -77
  117. package/src/components/IncrementInput/IncrementInput.tsx +95 -95
  118. package/src/components/IncrementInput/index.ts +2 -2
  119. package/src/components/Input/Input.stories.tsx +92 -92
  120. package/src/components/Input/Input.styles.ts +305 -305
  121. package/src/components/Input/Input.tsx +318 -318
  122. package/src/components/Input/index.ts +2 -2
  123. package/src/components/List/List.stories.tsx +62 -62
  124. package/src/components/List/List.styles.ts +52 -52
  125. package/src/components/List/List.tsx +82 -82
  126. package/src/components/List/index.ts +2 -2
  127. package/src/components/Modal/Modal.stories.tsx +113 -113
  128. package/src/components/Modal/Modal.styles.ts +308 -308
  129. package/src/components/Modal/Modal.tsx +210 -210
  130. package/src/components/Modal/index.ts +2 -2
  131. package/src/components/MoreMenu/MoreMenu.stories.tsx +46 -46
  132. package/src/components/MoreMenu/MoreMenu.styles.ts +70 -70
  133. package/src/components/MoreMenu/MoreMenu.tsx +102 -102
  134. package/src/components/MoreMenu/index.ts +2 -2
  135. package/src/components/MultiSelect/MultiSelect.stories.tsx +46 -46
  136. package/src/components/MultiSelect/MultiSelect.styles.ts +55 -55
  137. package/src/components/MultiSelect/MultiSelect.tsx +98 -98
  138. package/src/components/MultiSelect/MultiSelectInput/MultiSelectInput.styles.ts +73 -73
  139. package/src/components/MultiSelect/MultiSelectInput/MultiSelectInput.tsx +62 -62
  140. package/src/components/MultiSelect/MultiSelectInput/index.ts +1 -1
  141. package/src/components/MultiSelect/index.ts +3 -3
  142. package/src/components/MultiSelectList/MultiSelectList.styles.ts +125 -125
  143. package/src/components/MultiSelectList/MultiSelectList.tsx +519 -519
  144. package/src/components/MultiSelectList/index.ts +2 -2
  145. package/src/components/MultiSelectList/locales.ts +37 -37
  146. package/src/components/Notification/Notification.stories.tsx +51 -51
  147. package/src/components/Notification/Notification.styles.ts +50 -50
  148. package/src/components/Notification/Notification.tsx +84 -84
  149. package/src/components/Notification/index.ts +2 -2
  150. package/src/components/NumberInput/NumberInput.stories.tsx +36 -36
  151. package/src/components/NumberInput/NumberInput.tsx +154 -154
  152. package/src/components/NumberInput/helpers.ts +87 -87
  153. package/src/components/NumberInput/index.ts +1 -1
  154. package/src/components/PhoneInput/PhoneInput.stories.tsx +71 -71
  155. package/src/components/PhoneInput/PhoneInput.styles.ts +84 -84
  156. package/src/components/PhoneInput/PhoneInput.tsx +223 -223
  157. package/src/components/PhoneInput/PhoneInputCountryList/PhoneInputCountryList.stories.tsx +21 -21
  158. package/src/components/PhoneInput/PhoneInputCountryList/PhoneInputCountryList.styles.ts +100 -100
  159. package/src/components/PhoneInput/PhoneInputCountryList/PhoneInputCountryList.tsx +171 -171
  160. package/src/components/PhoneInput/PhoneInputCountryList/index.ts +2 -2
  161. package/src/components/PhoneInput/index.ts +6 -6
  162. package/src/components/PhoneInput/phone-info.ts +2167 -2167
  163. package/src/components/PhoneInput/types.ts +16 -16
  164. package/src/components/RadioButton/RadioButton.stories.tsx +46 -46
  165. package/src/components/RadioButton/RadioButton.styles.ts +37 -37
  166. package/src/components/RadioButton/RadioButton.tsx +56 -56
  167. package/src/components/RadioButton/index.ts +2 -2
  168. package/src/components/ScrollIntoViewIfNeeded/ScrollIntoViewIfNeeded.ts +66 -66
  169. package/src/components/ScrollIntoViewIfNeeded/index.ts +1 -1
  170. package/src/components/SearchInput/SearchInput.stories.tsx +24 -24
  171. package/src/components/SearchInput/SearchInput.styles.ts +50 -50
  172. package/src/components/SearchInput/SearchInput.tsx +63 -63
  173. package/src/components/SearchInput/index.ts +2 -2
  174. package/src/components/Select/Select.stories.tsx +258 -258
  175. package/src/components/Select/Select.styles.ts +85 -85
  176. package/src/components/Select/Select.tsx +517 -508
  177. package/src/components/Select/SelectList/SelectList.styles.ts +68 -68
  178. package/src/components/Select/SelectList/SelectList.tsx +139 -139
  179. package/src/components/Select/SelectList/index.ts +1 -1
  180. package/src/components/Select/helpers.ts +21 -21
  181. package/src/components/Select/index.ts +3 -3
  182. package/src/components/SmartInput/SmartInput.stories.tsx +63 -63
  183. package/src/components/SmartInput/SmartInput.tsx +180 -180
  184. package/src/components/SmartInput/helpers.ts +85 -85
  185. package/src/components/SmartInput/index.ts +1 -1
  186. package/src/components/Switch/Switch.stories.tsx +40 -40
  187. package/src/components/Switch/Switch.styles.ts +75 -75
  188. package/src/components/Switch/Switch.tsx +89 -89
  189. package/src/components/Switch/index.ts +2 -2
  190. package/src/components/TextArea/TextArea.stories.tsx +35 -35
  191. package/src/components/TextArea/TextArea.styles.ts +153 -153
  192. package/src/components/TextArea/TextArea.tsx +178 -178
  193. package/src/components/TextArea/index.ts +2 -2
  194. package/src/components/TextWithInfo/TextWithInfo.stories.tsx +53 -53
  195. package/src/components/TextWithInfo/TextWithInfo.styles.ts +60 -60
  196. package/src/components/TextWithInfo/TextWithInfo.tsx +67 -67
  197. package/src/components/TextWithInfo/index.ts +2 -2
  198. package/src/components/TextWithTooltip/TextWithTooltip.stories.tsx +58 -58
  199. package/src/components/TextWithTooltip/TextWithTooltip.styles.ts +19 -19
  200. package/src/components/TextWithTooltip/TextWithTooltip.tsx +163 -163
  201. package/src/components/TextWithTooltip/index.ts +2 -2
  202. package/src/components/ThemedPreloader/ThemedPreloader.stories.tsx +41 -41
  203. package/src/components/ThemedPreloader/ThemedPreloader.styles.ts +21 -21
  204. package/src/components/ThemedPreloader/ThemedPreloader.tsx +56 -56
  205. package/src/components/ThemedPreloader/components/DefaultPreloader/DefaultPreloader.tsx +34 -34
  206. package/src/components/ThemedPreloader/components/DefaultPreloader/index.ts +1 -1
  207. package/src/components/ThemedPreloader/components/DotsPreloader/DotsPreloader.styles.ts +54 -54
  208. package/src/components/ThemedPreloader/components/DotsPreloader/DotsPreloader.tsx +18 -18
  209. package/src/components/ThemedPreloader/components/DotsPreloader/index.ts +2 -2
  210. package/src/components/ThemedPreloader/components/SvgPreloader/SvgPreloader.styles.ts +11 -11
  211. package/src/components/ThemedPreloader/components/SvgPreloader/SvgPreloader.tsx +32 -32
  212. package/src/components/ThemedPreloader/components/SvgPreloader/index.ts +2 -2
  213. package/src/components/ThemedPreloader/components/index.ts +2 -2
  214. package/src/components/ThemedPreloader/index.ts +2 -2
  215. package/src/components/Toaster/Toaster.stories.tsx +34 -34
  216. package/src/components/Toaster/Toaster.styles.ts +59 -59
  217. package/src/components/Toaster/Toaster.tsx +113 -113
  218. package/src/components/Toaster/index.ts +2 -2
  219. package/src/components/Tooltip/Tooltip.stories.tsx +21 -21
  220. package/src/components/Tooltip/Tooltip.styles.ts +45 -45
  221. package/src/components/Tooltip/Tooltip.tsx +40 -40
  222. package/src/components/Tooltip/index.ts +3 -3
  223. package/src/components/Tooltip/types.ts +1 -1
  224. package/src/components/index.ts +36 -36
  225. package/src/helpers/colors.ts +2 -2
  226. package/src/helpers/dateHelpers/date-helpers.ts +9 -9
  227. package/src/helpers/index.ts +4 -5
  228. package/src/helpers/phone.ts +106 -106
  229. package/src/helpers/popper-helpers.ts +17 -17
  230. package/src/helpers/snippets.tsx +5 -5
  231. package/src/helpers/utils.ts +219 -178
  232. package/src/hooks/index.ts +6 -6
  233. package/src/hooks/use-did-mount-effect.ts +21 -21
  234. package/src/hooks/use-dropdown.ts +85 -85
  235. package/src/hooks/use-is-mounted.ts +15 -15
  236. package/src/hooks/use-on-click-outside.ts +92 -92
  237. package/src/hooks/use-theme.ts +36 -36
  238. package/src/hooks/use-tweak-styles.ts +14 -14
  239. package/src/index.ts +6 -6
  240. package/src/theme.ts +155 -155
  241. package/src/types.ts +106 -106
  242. package/src/vite-env.d.ts +1 -1
  243. package/dist/helpers/data-attributes.d.ts +0 -5
  244. package/src/helpers/data-attributes.ts +0 -18
@@ -1,68 +1,68 @@
1
- import { colors, dimensions, helpers } from '../../../theme';
2
- import { ComponentStyles } from '../../../types';
3
-
4
- export const ROW_HEIGHT = 40;
5
- const CONTAINER_PADDING = 10;
6
- const CELL_PADDING = [10, 20];
7
-
8
- export const styles = {
9
- root: {
10
- borderRadius: dimensions.BORDER_RADIUS_SMALL,
11
- boxShadow: '0 13px 74px -27px rgba(0, 0, 0, 0.11)',
12
- boxSizing: 'border-box',
13
- padding: [CONTAINER_PADDING, 0],
14
- fontSize: 16,
15
- overflow: 'hidden',
16
- },
17
-
18
- withListHeader: {
19
- paddingTop: 0,
20
- },
21
-
22
- listHeader: {
23
- '& + $list': {
24
- borderTop: [1, 'solid', colors.BORDER_LIGHT],
25
- },
26
- },
27
-
28
- list: {
29
- height: '100%',
30
- maxHeight: ROW_HEIGHT * 6,
31
- cursor: 'pointer',
32
- backgroundColor: colors.CLASSIC_WHITE,
33
-
34
- ...helpers.withScrollBar,
35
- },
36
-
37
- cell: {
38
- display: 'flex',
39
- cursor: 'pointer',
40
- minHeight: ROW_HEIGHT,
41
- width: 'auto',
42
- padding: CELL_PADDING,
43
- alignItems: 'center',
44
- boxSizing: 'border-box',
45
- fontSize: 14,
46
- },
47
-
48
- noMatchesLabel: {
49
- pointerEvents: 'none',
50
- },
51
-
52
- focused: {},
53
-
54
- active: {},
55
-
56
- disabled: {
57
- cursor: 'default',
58
- },
59
-
60
- loading: {
61
- cursor: 'default',
62
- pointerEvents: 'none',
63
- },
64
-
65
- defaultCell: {},
66
- };
67
-
68
- export type SelectListStyles = ComponentStyles<typeof styles>;
1
+ import { colors, dimensions, helpers } from '../../../theme';
2
+ import { ComponentStyles } from '../../../types';
3
+
4
+ export const ROW_HEIGHT = 40;
5
+ const CONTAINER_PADDING = 10;
6
+ const CELL_PADDING = [10, 20];
7
+
8
+ export const styles = {
9
+ root: {
10
+ borderRadius: dimensions.BORDER_RADIUS_SMALL,
11
+ boxShadow: '0 13px 74px -27px rgba(0, 0, 0, 0.11)',
12
+ boxSizing: 'border-box',
13
+ padding: [CONTAINER_PADDING, 0],
14
+ fontSize: 16,
15
+ overflow: 'hidden',
16
+ },
17
+
18
+ withListHeader: {
19
+ paddingTop: 0,
20
+ },
21
+
22
+ listHeader: {
23
+ '& + $list': {
24
+ borderTop: [1, 'solid', colors.BORDER_LIGHT],
25
+ },
26
+ },
27
+
28
+ list: {
29
+ height: '100%',
30
+ maxHeight: ROW_HEIGHT * 6,
31
+ cursor: 'pointer',
32
+ backgroundColor: colors.CLASSIC_WHITE,
33
+
34
+ ...helpers.withScrollBar,
35
+ },
36
+
37
+ cell: {
38
+ display: 'flex',
39
+ cursor: 'pointer',
40
+ minHeight: ROW_HEIGHT,
41
+ width: 'auto',
42
+ padding: CELL_PADDING,
43
+ alignItems: 'center',
44
+ boxSizing: 'border-box',
45
+ fontSize: 14,
46
+ },
47
+
48
+ noMatchesLabel: {
49
+ pointerEvents: 'none',
50
+ },
51
+
52
+ focused: {},
53
+
54
+ active: {},
55
+
56
+ disabled: {
57
+ cursor: 'default',
58
+ },
59
+
60
+ loading: {
61
+ cursor: 'default',
62
+ pointerEvents: 'none',
63
+ },
64
+
65
+ defaultCell: {},
66
+ };
67
+
68
+ export type SelectListStyles = ComponentStyles<typeof styles>;
@@ -1,139 +1,139 @@
1
- import { ReactNode, useMemo, MouseEvent } from 'react';
2
- import clsx from 'clsx';
3
- import { ScrollIntoViewIfNeeded } from '../../ScrollIntoViewIfNeeded';
4
- import { useTheme } from '../../../hooks';
5
- import { ICommonProps } from '../../../types';
6
- import { addDataAttributes, isNotEmpty } from '../../../helpers';
7
- import { SelectListStyles, styles } from './SelectList.styles';
8
-
9
- export interface ISelectListProps<Value> extends ICommonProps {
10
- tweakStyles?: SelectListStyles;
11
- options: Value[];
12
- focusedIndex?: number;
13
- activeValue?: Value;
14
- noMatchesLabel?: string;
15
- isLoading?: boolean;
16
- loadingLabel?: ReactNode;
17
- defaultOptionLabel?: string;
18
- testId?: string;
19
- shouldScrollToList?: boolean;
20
- customListHeader?: ReactNode;
21
- onOptionClick(index: number, event: MouseEvent<HTMLElement>): void;
22
- isOptionDisabled(value: Value): boolean;
23
- convertValueToString(value: Value): string | undefined;
24
- convertValueToReactNode?(value: Value, isDisabled: boolean): ReactNode;
25
- convertValueToId?(value: Value): string | undefined;
26
- }
27
-
28
- const DEFAULT_OPTION_INDEX = -1;
29
-
30
- export function SelectList<Value>({
31
- options,
32
- focusedIndex,
33
- activeValue,
34
- defaultOptionLabel,
35
- noMatchesLabel = 'Совпадений не найдено',
36
- isLoading,
37
- loadingLabel = 'Загрузка...',
38
- tweakStyles,
39
- testId,
40
- shouldScrollToList = true,
41
- customListHeader,
42
- isOptionDisabled,
43
- onOptionClick,
44
- convertValueToString,
45
- convertValueToReactNode,
46
- convertValueToId = convertValueToString,
47
- }: ISelectListProps<Value>): JSX.Element {
48
- const { classes } = useTheme('SelectList', styles, tweakStyles);
49
- const activeValueId = isNotEmpty(activeValue)
50
- ? convertValueToId(activeValue)
51
- : undefined;
52
-
53
- const isActiveOption = (item: Value): boolean =>
54
- convertValueToId(item) === activeValueId;
55
-
56
- const convertFunction = convertValueToReactNode ?? convertValueToString;
57
-
58
- const optionsDisableMap = useMemo(
59
- () => options.map((o) => isOptionDisabled(o)),
60
- [options, isOptionDisabled],
61
- );
62
-
63
- const listOptions = useMemo(
64
- () => options.map((opt, i) => convertFunction(opt, optionsDisableMap[i])),
65
- [options, convertFunction, optionsDisableMap],
66
- );
67
-
68
- return (
69
- <ScrollIntoViewIfNeeded
70
- active={shouldScrollToList}
71
- className={clsx(classes.root, {
72
- [classes.withListHeader]: isNotEmpty(customListHeader),
73
- })}
74
- >
75
- {isNotEmpty(customListHeader) && (
76
- <div className={classes.listHeader}>{customListHeader}</div>
77
- )}
78
- <div className={classes.list} data-testid={testId}>
79
- {isLoading ? (
80
- <div className={clsx(classes.cell, classes.loading)}>
81
- {loadingLabel}
82
- </div>
83
- ) : (
84
- <>
85
- {defaultOptionLabel !== undefined && (
86
- <ScrollIntoViewIfNeeded
87
- active={focusedIndex === DEFAULT_OPTION_INDEX}
88
- options={{ block: 'nearest' }}
89
- className={clsx(
90
- classes.cell,
91
- classes.defaultCell,
92
- focusedIndex === DEFAULT_OPTION_INDEX && classes.focused,
93
- )}
94
- onClick={(event) => onOptionClick(DEFAULT_OPTION_INDEX, event)}
95
- >
96
- {defaultOptionLabel}
97
- </ScrollIntoViewIfNeeded>
98
- )}
99
- {listOptions.map((opt, i) => {
100
- const optionValue = options[i];
101
- const isFocused = i === focusedIndex;
102
- const isActive = isActiveOption(optionValue);
103
- // проверяем, что опция задизейблена
104
- const isDisabled = optionsDisableMap[i];
105
-
106
- return (
107
- <ScrollIntoViewIfNeeded
108
- active={isFocused}
109
- options={{ block: 'nearest' }}
110
- key={i}
111
- className={clsx(classes.cell, {
112
- [classes.focused]: isFocused,
113
- [classes.active]: isActive,
114
- [classes.disabled]: isDisabled,
115
- })}
116
- {...addDataAttributes({
117
- disabled: isDisabled,
118
- active: isActive,
119
- focused: isFocused,
120
- })}
121
- onClick={
122
- !isDisabled ? (event) => onOptionClick(i, event) : undefined
123
- }
124
- >
125
- {opt}
126
- </ScrollIntoViewIfNeeded>
127
- );
128
- })}
129
- {listOptions.length === 0 && (
130
- <div className={clsx(classes.cell, classes.noMatchesLabel)}>
131
- {noMatchesLabel}
132
- </div>
133
- )}
134
- </>
135
- )}
136
- </div>
137
- </ScrollIntoViewIfNeeded>
138
- );
139
- }
1
+ import { ReactNode, useMemo, MouseEvent } from 'react';
2
+ import clsx from 'clsx';
3
+ import { ScrollIntoViewIfNeeded } from '../../ScrollIntoViewIfNeeded';
4
+ import { useTheme } from '../../../hooks';
5
+ import { ICommonProps } from '../../../types';
6
+ import { addDataAttributes, isNotEmpty } from '../../../helpers';
7
+ import { SelectListStyles, styles } from './SelectList.styles';
8
+
9
+ export interface ISelectListProps<Value> extends ICommonProps {
10
+ tweakStyles?: SelectListStyles;
11
+ options: Value[];
12
+ focusedIndex?: number;
13
+ activeValue?: Value;
14
+ noMatchesLabel?: string;
15
+ isLoading?: boolean;
16
+ loadingLabel?: ReactNode;
17
+ defaultOptionLabel?: string;
18
+ testId?: string;
19
+ shouldScrollToList?: boolean;
20
+ customListHeader?: ReactNode;
21
+ onOptionClick(index: number, event: MouseEvent<HTMLElement>): void;
22
+ isOptionDisabled(value: Value): boolean;
23
+ convertValueToString(value: Value): string | undefined;
24
+ convertValueToReactNode?(value: Value, isDisabled: boolean): ReactNode;
25
+ convertValueToId?(value: Value): string | undefined;
26
+ }
27
+
28
+ const DEFAULT_OPTION_INDEX = -1;
29
+
30
+ export function SelectList<Value>({
31
+ options,
32
+ focusedIndex,
33
+ activeValue,
34
+ defaultOptionLabel,
35
+ noMatchesLabel = 'Совпадений не найдено',
36
+ isLoading,
37
+ loadingLabel = 'Загрузка...',
38
+ tweakStyles,
39
+ testId,
40
+ shouldScrollToList = true,
41
+ customListHeader,
42
+ isOptionDisabled,
43
+ onOptionClick,
44
+ convertValueToString,
45
+ convertValueToReactNode,
46
+ convertValueToId = convertValueToString,
47
+ }: ISelectListProps<Value>): JSX.Element {
48
+ const { classes } = useTheme('SelectList', styles, tweakStyles);
49
+ const activeValueId = isNotEmpty(activeValue)
50
+ ? convertValueToId(activeValue)
51
+ : undefined;
52
+
53
+ const isActiveOption = (item: Value): boolean =>
54
+ convertValueToId(item) === activeValueId;
55
+
56
+ const convertFunction = convertValueToReactNode ?? convertValueToString;
57
+
58
+ const optionsDisableMap = useMemo(
59
+ () => options.map((o) => isOptionDisabled(o)),
60
+ [options, isOptionDisabled],
61
+ );
62
+
63
+ const listOptions = useMemo(
64
+ () => options.map((opt, i) => convertFunction(opt, optionsDisableMap[i])),
65
+ [options, convertFunction, optionsDisableMap],
66
+ );
67
+
68
+ return (
69
+ <ScrollIntoViewIfNeeded
70
+ active={shouldScrollToList}
71
+ className={clsx(classes.root, {
72
+ [classes.withListHeader]: isNotEmpty(customListHeader),
73
+ })}
74
+ >
75
+ {isNotEmpty(customListHeader) && (
76
+ <div className={classes.listHeader}>{customListHeader}</div>
77
+ )}
78
+ <div className={classes.list} data-testid={testId}>
79
+ {isLoading ? (
80
+ <div className={clsx(classes.cell, classes.loading)}>
81
+ {loadingLabel}
82
+ </div>
83
+ ) : (
84
+ <>
85
+ {defaultOptionLabel !== undefined && (
86
+ <ScrollIntoViewIfNeeded
87
+ active={focusedIndex === DEFAULT_OPTION_INDEX}
88
+ options={{ block: 'nearest' }}
89
+ className={clsx(
90
+ classes.cell,
91
+ classes.defaultCell,
92
+ focusedIndex === DEFAULT_OPTION_INDEX && classes.focused,
93
+ )}
94
+ onClick={(event) => onOptionClick(DEFAULT_OPTION_INDEX, event)}
95
+ >
96
+ {defaultOptionLabel}
97
+ </ScrollIntoViewIfNeeded>
98
+ )}
99
+ {listOptions.map((opt, i) => {
100
+ const optionValue = options[i];
101
+ const isFocused = i === focusedIndex;
102
+ const isActive = isActiveOption(optionValue);
103
+ // проверяем, что опция задизейблена
104
+ const isDisabled = optionsDisableMap[i];
105
+
106
+ return (
107
+ <ScrollIntoViewIfNeeded
108
+ active={isFocused}
109
+ options={{ block: 'nearest' }}
110
+ key={i}
111
+ className={clsx(classes.cell, {
112
+ [classes.focused]: isFocused,
113
+ [classes.active]: isActive,
114
+ [classes.disabled]: isDisabled,
115
+ })}
116
+ {...addDataAttributes({
117
+ disabled: isDisabled,
118
+ active: isActive,
119
+ focused: isFocused,
120
+ })}
121
+ onClick={
122
+ !isDisabled ? (event) => onOptionClick(i, event) : undefined
123
+ }
124
+ >
125
+ {opt}
126
+ </ScrollIntoViewIfNeeded>
127
+ );
128
+ })}
129
+ {listOptions.length === 0 && (
130
+ <div className={clsx(classes.cell, classes.noMatchesLabel)}>
131
+ {noMatchesLabel}
132
+ </div>
133
+ )}
134
+ </>
135
+ )}
136
+ </div>
137
+ </ScrollIntoViewIfNeeded>
138
+ );
139
+ }
@@ -1 +1 @@
1
- export * from './SelectList';
1
+ export * from './SelectList';
@@ -1,21 +1,21 @@
1
- import { isNotEmpty } from '../../helpers';
2
-
3
- export const defaultIsOptionDisabled = <Value>(option: Value): boolean =>
4
- typeof option === 'object' &&
5
- option !== null &&
6
- ((option as { isDisabled?: boolean })?.isDisabled ?? false);
7
-
8
- export const defaultConvertFunction = (v: unknown) =>
9
- v === undefined ? undefined : String(v);
10
-
11
- export const defaultCompareFunction = <Value>(v1: Value, v2: Value) =>
12
- v1 === v2;
13
-
14
- export const getActiveValueIndex = <Value>(
15
- options: Value[],
16
- value: Value | undefined,
17
- convertFunc: (v: Value) => string | undefined,
18
- ): number =>
19
- isNotEmpty(value)
20
- ? options.findIndex((o) => convertFunc(o) === convertFunc(value))
21
- : -1;
1
+ import { isNotEmpty } from '../../helpers';
2
+
3
+ export const defaultIsOptionDisabled = <Value>(option: Value): boolean =>
4
+ typeof option === 'object' &&
5
+ option !== null &&
6
+ ((option as { isDisabled?: boolean })?.isDisabled ?? false);
7
+
8
+ export const defaultConvertFunction = (v: unknown) =>
9
+ v === undefined ? undefined : String(v);
10
+
11
+ export const defaultCompareFunction = <Value>(v1: Value, v2: Value) =>
12
+ v1 === v2;
13
+
14
+ export const getActiveValueIndex = <Value>(
15
+ options: Value[],
16
+ value: Value | undefined,
17
+ convertFunc: (v: Value) => string | undefined,
18
+ ): number =>
19
+ isNotEmpty(value)
20
+ ? options.findIndex((o) => convertFunc(o) === convertFunc(value))
21
+ : -1;
@@ -1,3 +1,3 @@
1
- export * from './Select';
2
- export type { SelectStyles } from './Select.styles';
3
- export type { SelectListStyles } from './SelectList/SelectList.styles';
1
+ export * from './Select';
2
+ export type { SelectStyles } from './Select.styles';
3
+ export type { SelectListStyles } from './SelectList/SelectList.styles';
@@ -1,63 +1,63 @@
1
- import { ComponentStory } from '@storybook/react';
2
- import { useState } from 'react';
3
- import { IInputProps } from '../Input';
4
- import { SmartInput, TSmartType } from './SmartInput';
5
-
6
- const types: Array<IInputProps['type']> = [
7
- 'text',
8
- 'password',
9
- 'email',
10
- 'number',
11
- ];
12
- const smartTypes: TSmartType[] = [
13
- 'default',
14
- 'agencyName',
15
- 'surname',
16
- 'name',
17
- 'email',
18
- ];
19
-
20
- export default {
21
- title: 'Inputs/SmartInput',
22
- component: SmartInput,
23
- argTypes: {
24
- type: { control: 'inline-radio', options: types },
25
- smartType: { control: 'inline-radio', options: smartTypes },
26
- },
27
- };
28
-
29
- const Template: ComponentStory<typeof SmartInput> = (args) => {
30
- const [value, setValue] = useState('');
31
-
32
- return (
33
- <div>
34
- <div>Фичи умного инпута:</div>
35
- <ul>
36
- <li>Переключение раскладки при вводе</li>
37
- <li>Транслитерация при копировании текста на русском</li>
38
- <li>
39
- Запрет ввода определённых символов для разных видов полей, например,
40
- только буквы, пробелы и дефис для фамилий и т.д.
41
- </li>
42
- <li>
43
- Фильтрация скопированного значения на предмет запрещённых символов
44
- </li>
45
- <li>Трансформация значения в UPPERCASE</li>
46
- </ul>
47
-
48
- <SmartInput {...args} value={value} onChange={(v) => setValue(v)} />
49
- </div>
50
- );
51
- };
52
-
53
- export const Default = Template.bind({});
54
-
55
- Default.args = {
56
- label: 'Label',
57
- placeholder: 'Placeholder',
58
- type: 'text',
59
- smartType: 'default',
60
- isUpperCase: false,
61
- isDisabled: false,
62
- hasFloatingLabel: true,
63
- };
1
+ import { ComponentStory } from '@storybook/react';
2
+ import { useState } from 'react';
3
+ import { IInputProps } from '../Input';
4
+ import { SmartInput, TSmartType } from './SmartInput';
5
+
6
+ const types: Array<IInputProps['type']> = [
7
+ 'text',
8
+ 'password',
9
+ 'email',
10
+ 'number',
11
+ ];
12
+ const smartTypes: TSmartType[] = [
13
+ 'default',
14
+ 'agencyName',
15
+ 'surname',
16
+ 'name',
17
+ 'email',
18
+ ];
19
+
20
+ export default {
21
+ title: 'Inputs/SmartInput',
22
+ component: SmartInput,
23
+ argTypes: {
24
+ type: { control: 'inline-radio', options: types },
25
+ smartType: { control: 'inline-radio', options: smartTypes },
26
+ },
27
+ };
28
+
29
+ const Template: ComponentStory<typeof SmartInput> = (args) => {
30
+ const [value, setValue] = useState('');
31
+
32
+ return (
33
+ <div>
34
+ <div>Фичи умного инпута:</div>
35
+ <ul>
36
+ <li>Переключение раскладки при вводе</li>
37
+ <li>Транслитерация при копировании текста на русском</li>
38
+ <li>
39
+ Запрет ввода определённых символов для разных видов полей, например,
40
+ только буквы, пробелы и дефис для фамилий и т.д.
41
+ </li>
42
+ <li>
43
+ Фильтрация скопированного значения на предмет запрещённых символов
44
+ </li>
45
+ <li>Трансформация значения в UPPERCASE</li>
46
+ </ul>
47
+
48
+ <SmartInput {...args} value={value} onChange={(v) => setValue(v)} />
49
+ </div>
50
+ );
51
+ };
52
+
53
+ export const Default = Template.bind({});
54
+
55
+ Default.args = {
56
+ label: 'Label',
57
+ placeholder: 'Placeholder',
58
+ type: 'text',
59
+ smartType: 'default',
60
+ isUpperCase: false,
61
+ isDisabled: false,
62
+ hasFloatingLabel: true,
63
+ };