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