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