@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,63 +1,63 @@
1
- import { FC } from 'react';
2
-
3
- import { useTheme, useTweakStyles } from '../../hooks';
4
- import { getTestId, addDataAttributes, addDataTestId } from '../../helpers';
5
- import { Icon } from '../Icon';
6
- import { IInputProps, Input } from '../Input';
7
-
8
- import { SearchInputStyles, styles } from './SearchInput.styles';
9
-
10
- export type ISearchInputProps = Omit<
11
- IInputProps,
12
- | 'type'
13
- | 'isInvalid'
14
- | 'errorMessage'
15
- | 'label'
16
- | 'isActive'
17
- | 'errorPosition'
18
- | 'hasFloatingLabel'
19
- | 'border'
20
- > & {
21
- tweakStyles?: SearchInputStyles;
22
- };
23
-
24
- export const SearchInput: FC<ISearchInputProps> = ({
25
- isClearable = true,
26
- tweakStyles,
27
- testId,
28
- data,
29
- ...props
30
- }) => {
31
- const { classes, componentStyles } = useTheme(
32
- 'SearchInput',
33
- styles,
34
- tweakStyles,
35
- );
36
-
37
- const tweakInputStyles = useTweakStyles(
38
- componentStyles,
39
- tweakStyles,
40
- 'tweakInput',
41
- );
42
-
43
- return (
44
- <div
45
- className={classes.root}
46
- {...addDataTestId(testId)}
47
- {...addDataAttributes(data)}
48
- >
49
- <div className={classes.icon}>
50
- <Icon type="search" />
51
- </div>
52
- <Input
53
- isClearable={isClearable}
54
- isActive={props.value !== '' && props.value !== undefined}
55
- testId={getTestId(testId, 'input')}
56
- tweakStyles={tweakInputStyles}
57
- hasFloatingLabel={false}
58
- label={props.placeholder}
59
- {...props}
60
- />
61
- </div>
62
- );
63
- };
1
+ import { FC } from 'react';
2
+
3
+ import { useTheme, useTweakStyles } from '../../hooks';
4
+ import { getTestId, addDataAttributes, addDataTestId } from '../../helpers';
5
+ import { Icon } from '../Icon';
6
+ import { IInputProps, Input } from '../Input';
7
+
8
+ import { SearchInputStyles, styles } from './SearchInput.styles';
9
+
10
+ export type ISearchInputProps = Omit<
11
+ IInputProps,
12
+ | 'type'
13
+ | 'isInvalid'
14
+ | 'errorMessage'
15
+ | 'label'
16
+ | 'isActive'
17
+ | 'errorPosition'
18
+ | 'hasFloatingLabel'
19
+ | 'border'
20
+ > & {
21
+ tweakStyles?: SearchInputStyles;
22
+ };
23
+
24
+ export const SearchInput: FC<ISearchInputProps> = ({
25
+ isClearable = true,
26
+ tweakStyles,
27
+ testId,
28
+ data,
29
+ ...props
30
+ }) => {
31
+ const { classes, componentStyles } = useTheme(
32
+ 'SearchInput',
33
+ styles,
34
+ tweakStyles,
35
+ );
36
+
37
+ const tweakInputStyles = useTweakStyles(
38
+ componentStyles,
39
+ tweakStyles,
40
+ 'tweakInput',
41
+ );
42
+
43
+ return (
44
+ <div
45
+ className={classes.root}
46
+ {...addDataTestId(testId)}
47
+ {...addDataAttributes(data)}
48
+ >
49
+ <div className={classes.icon}>
50
+ <Icon type="search" />
51
+ </div>
52
+ <Input
53
+ isClearable={isClearable}
54
+ isActive={props.value !== '' && props.value !== undefined}
55
+ testId={getTestId(testId, 'input')}
56
+ tweakStyles={tweakInputStyles}
57
+ hasFloatingLabel={false}
58
+ label={props.placeholder}
59
+ {...props}
60
+ />
61
+ </div>
62
+ );
63
+ };
@@ -1,2 +1,2 @@
1
- export * from './SearchInput';
2
- export type { SearchInputStyles } from './SearchInput.styles';
1
+ export * from './SearchInput';
2
+ export type { SearchInputStyles } from './SearchInput.styles';
@@ -1,242 +1,258 @@
1
- import { ReactNode, useEffect, useState } from 'react';
2
- import { Select, ISelectProps } from './Select';
3
- import { ComponentMeta, ComponentStory } from '@storybook/react';
4
-
5
- interface ObjectValue {
6
- name: string;
7
- age: number;
8
- isDisabled?: boolean;
9
- }
10
-
11
- const inlineStyles = [undefined, 'left', 'right', 'middle'];
12
- const borders: Array<ISelectProps<any>['border']> = [
13
- undefined,
14
- 'left',
15
- 'top',
16
- 'right',
17
- 'bottom',
18
- ];
19
- const errorPositions: Array<ISelectProps<any>['errorPosition']> = [
20
- 'bottom',
21
- 'top',
22
- ];
23
-
24
- const genLetters = (qnt = 1): string =>
25
- Math.random()
26
- .toString(36)
27
- .replace(/[^a-z]+/g, '')
28
- .substr(0, qnt);
29
-
30
- const convertObjectToString = (v: ObjectValue): string => v.name;
31
-
32
- const convertObjectToId = (v: ObjectValue): string => `${v.name}${v.age}`;
33
-
34
- const convertObjectToReactNode = (
35
- v: ObjectValue,
36
- isDisabled: boolean,
37
- ): ReactNode => (
38
- <span style={{ color: isDisabled ? 'red' : undefined }}>
39
- <i>{v.name}</i>, {v.age}
40
- </span>
41
- );
42
-
43
- const convertStringToReactNode = (v: string): ReactNode => <i>{v}</i>;
44
-
45
- const isOptionDisabled = (option: string) => option.startsWith('Опция');
46
- const isObjectOptionDisabled = (option: ObjectValue) => option.age > 30;
47
-
48
- const stringOptions = [
49
- 'Опция 1',
50
- 'Опция 11',
51
- 'Еще одна опция',
52
- 'Еще выбор',
53
- 'Очень длинная опция вот такой текст',
54
- '1',
55
- '2',
56
- '3',
57
- '4',
58
- ];
59
-
60
- const objectOptions: ObjectValue[] = [
61
- { name: 'Ivan', age: 34 },
62
- { name: 'Ivan', age: 42 },
63
- { name: 'Konstantin', age: 11 },
64
- { name: 'Mikhail', age: 24 },
65
- { name: 'Maria', age: 45, isDisabled: true },
66
- { name: 'Elena', age: 14 },
67
- { name: 'Artem', age: 23 },
68
- ];
69
-
70
- // Максимум не включается, минимум включается
71
- const getRandomInt = (min: number, max: number) =>
72
- Math.floor(Math.random() * (Math.floor(max) - Math.ceil(min))) +
73
- Math.ceil(min);
74
-
75
- interface ISelectWithCustomProps<T> extends ISelectProps<T> {
76
- valuesType: 'strings' | 'objects';
77
- shouldUseReactNodes?: boolean;
78
- shouldUsePopper?: boolean;
79
- shouldRenderInBody?: boolean;
80
- shouldHideOnScroll?: boolean;
81
- shouldUseCustomIsDisabledFunction?: boolean;
82
- canBeFlipped?: boolean;
83
- scrollParent?: 'document' | 'auto';
84
- }
85
-
86
- function SelectWithCustomProps<T>({
87
- valuesType,
88
- optionsMode,
89
- shouldUseReactNodes,
90
- shouldUsePopper,
91
- shouldRenderInBody,
92
- shouldHideOnScroll,
93
- shouldUseCustomIsDisabledFunction,
94
- canBeFlipped,
95
- scrollParent,
96
- ...rest
97
- }: ISelectWithCustomProps<T>) {
98
- const [stringValue, setStringValue] = useState<string>();
99
- const stringHandler = (newValue?: string) => {
100
- setStringValue(newValue);
101
- };
102
-
103
- const [objectValue, setObjectValue] = useState<ObjectValue>();
104
- const objectHandler = (newValue?: ObjectValue) => {
105
- setObjectValue(newValue);
106
- };
107
-
108
- const selectValuesType = valuesType;
109
- const shouldRenderAsReactNodes = shouldUseReactNodes;
110
-
111
- const getOptions = async (): Promise<Array<string | ObjectValue>> =>
112
- new Promise((resolve) =>
113
- setTimeout(() => {
114
- resolve(
115
- [...Array(10)].map((_) => {
116
- if (selectValuesType === 'strings') {
117
- return genLetters(getRandomInt(3, 10));
118
- }
119
- return {
120
- name: genLetters(getRandomInt(3, 10)),
121
- age: getRandomInt(10, 70),
122
- } as ObjectValue;
123
- }),
124
- );
125
- }, 1000),
126
- );
127
-
128
- const [dynamicOptions, setDynamicOptions] = useState<
129
- Array<string | ObjectValue>
130
- >([]);
131
-
132
- const handleOpen = () => {
133
- console.log('isOpen');
134
- };
135
-
136
- useEffect(() => {
137
- const api = async () => {
138
- setDynamicOptions(await getOptions());
139
- };
140
-
141
- api();
142
- }, [selectValuesType]);
143
-
144
- const props =
145
- selectValuesType === 'strings'
146
- ? {
147
- onChange: stringHandler,
148
- value: stringValue,
149
- options: optionsMode === 'dynamic' ? dynamicOptions : stringOptions,
150
- convertValueToReactNode: shouldRenderAsReactNodes
151
- ? convertStringToReactNode
152
- : undefined,
153
- isOptionDisabled: shouldUseCustomIsDisabledFunction
154
- ? isOptionDisabled
155
- : undefined,
156
- }
157
- : {
158
- onChange: objectHandler,
159
- value: objectValue,
160
- options: optionsMode === 'dynamic' ? dynamicOptions : objectOptions,
161
- convertValueToString: convertObjectToString,
162
- convertValueToId: convertObjectToId,
163
- convertValueToReactNode: shouldRenderAsReactNodes
164
- ? convertObjectToReactNode
165
- : undefined,
166
- isOptionDisabled: shouldUseCustomIsDisabledFunction
167
- ? isObjectOptionDisabled
168
- : undefined,
169
- };
170
-
171
- return (
172
- <Select
173
- {...rest}
174
- {...(props as unknown as ISelectProps<any>)}
175
- optionsMode={optionsMode}
176
- onType={async () => setDynamicOptions(await getOptions())}
177
- onOpen={handleOpen}
178
- dropdownOptions={{
179
- shouldUsePopper,
180
- shouldRenderInBody,
181
- shouldHideOnScroll,
182
- canBeFlipped,
183
- scrollParent,
184
- }}
185
- />
186
- );
187
- }
188
-
189
- export default {
190
- title: 'Select',
191
- component: SelectWithCustomProps,
192
- argTypes: {
193
- debounceTime: {
194
- control: { type: 'range', min: 0, max: 1000, step: 100 },
195
- },
196
- errorPosition: { control: 'inline-radio', options: errorPositions },
197
- border: { control: 'inline-radio', options: borders },
198
- inlineStyle: { control: 'select', options: inlineStyles },
199
- optionsMode: {
200
- control: 'inline-radio',
201
- options: ['normal', 'search', 'dynamic'],
202
- },
203
- valuesType: {
204
- control: 'inline-radio',
205
- options: ['strings', 'objects'],
206
- },
207
- },
208
- } as ComponentMeta<typeof SelectWithCustomProps>;
209
-
210
- const Template: ComponentStory<typeof SelectWithCustomProps> = (args) => (
211
- <SelectWithCustomProps {...args} />
212
- );
213
-
214
- export const Default = Template.bind({});
215
-
216
- Default.args = {
217
- label: 'Dropdown',
218
- defaultOptionLabel: 'Default Option',
219
- noMatchesLabel: 'No matches',
220
- border: undefined,
221
- isInvalid: false,
222
- errorMessage: 'Error Text',
223
- errorPosition: 'bottom',
224
- hasFloatingLabel: true,
225
- hasRequiredLabel: true,
226
- isDisabled: false,
227
- isRequired: false,
228
- isClearable: false,
229
- isLoading: false,
230
- debounceTime: 400,
231
- // custom options
232
- shouldUseReactNodes: false,
233
- valuesType: 'strings',
234
- optionsMode: 'normal',
235
- shouldUsePopper: false,
236
- shouldRenderInBody: false,
237
- shouldHideOnScroll: false,
238
- shouldUseCustomIsDisabledFunction: false,
239
- shouldScrollToList: true,
240
- canBeFlipped: false,
241
- scrollParent: 'document',
242
- };
1
+ import { ReactNode, useEffect, useState } from 'react';
2
+ import { Select, ISelectProps } from './Select';
3
+ import { ComponentMeta, ComponentStory } from '@storybook/react';
4
+ import { isNotEmpty } from '../../helpers';
5
+
6
+ interface ObjectValue {
7
+ name: string;
8
+ age: number;
9
+ isDisabled?: boolean;
10
+ }
11
+
12
+ const inlineStyles = [undefined, 'left', 'right', 'middle'];
13
+ const borders: Array<ISelectProps<any>['border']> = [
14
+ undefined,
15
+ 'left',
16
+ 'top',
17
+ 'right',
18
+ 'bottom',
19
+ ];
20
+ const errorPositions: Array<ISelectProps<any>['errorPosition']> = [
21
+ 'bottom',
22
+ 'top',
23
+ ];
24
+
25
+ const genLetters = (qnt = 1): string =>
26
+ Math.random()
27
+ .toString(36)
28
+ .replace(/[^a-z]+/g, '')
29
+ .substr(0, qnt);
30
+
31
+ const convertObjectToString = (v: ObjectValue): string => v.name;
32
+
33
+ const convertObjectToId = (v: ObjectValue): string => `${v.name}${v.age}`;
34
+
35
+ const convertObjectToReactNode = (
36
+ v: ObjectValue,
37
+ isDisabled: boolean,
38
+ ): ReactNode => (
39
+ <span style={{ color: isDisabled ? 'red' : undefined }}>
40
+ <i>{v.name}</i>, {v.age}
41
+ </span>
42
+ );
43
+
44
+ const convertStringToReactNode = (v: string): ReactNode => <i>{v}</i>;
45
+
46
+ const isOptionDisabled = (option: string) => option.startsWith('Опция');
47
+ const isObjectOptionDisabled = (option: ObjectValue) => option.age > 30;
48
+
49
+ const stringOptions = [
50
+ 'Опция 1',
51
+ 'Опция 11',
52
+ 'Еще одна опция',
53
+ 'Еще выбор',
54
+ 'Очень длинная опция вот такой текст',
55
+ '1',
56
+ '2',
57
+ '3',
58
+ '4',
59
+ ];
60
+
61
+ const objectOptions: ObjectValue[] = [
62
+ { name: 'Ivan', age: 34 },
63
+ { name: 'Ivan', age: 42 },
64
+ { name: 'Konstantin', age: 11 },
65
+ { name: 'Mikhail', age: 24 },
66
+ { name: 'Maria', age: 45, isDisabled: true },
67
+ { name: 'Elena', age: 14 },
68
+ { name: 'Artem', age: 23 },
69
+ ];
70
+
71
+ // Максимум не включается, минимум включается
72
+ const getRandomInt = (min: number, max: number) =>
73
+ Math.floor(Math.random() * (Math.floor(max) - Math.ceil(min))) +
74
+ Math.ceil(min);
75
+
76
+ interface ISelectWithCustomProps<T> extends ISelectProps<T> {
77
+ valuesType: 'strings' | 'objects';
78
+ shouldUseReactNodes?: boolean;
79
+ shouldUsePopper?: boolean;
80
+ shouldRenderInBody?: boolean;
81
+ shouldHideOnScroll?: boolean;
82
+ shouldUseCustomIsDisabledFunction?: boolean;
83
+ shouldRenderSearchInputInList?: boolean;
84
+ canBeFlipped?: boolean;
85
+ scrollParent?: 'document' | 'auto';
86
+ }
87
+
88
+ function SelectWithCustomProps<T>({
89
+ valuesType,
90
+ optionsMode,
91
+ shouldUseReactNodes,
92
+ shouldUsePopper,
93
+ shouldRenderInBody,
94
+ shouldHideOnScroll,
95
+ shouldUseCustomIsDisabledFunction,
96
+ shouldRenderSearchInputInList,
97
+ canBeFlipped,
98
+ scrollParent,
99
+ noMatchesLabel,
100
+ ...rest
101
+ }: ISelectWithCustomProps<T>) {
102
+ const [stringValue, setStringValue] = useState<string>();
103
+ const stringHandler = (newValue?: string) => {
104
+ console.log('change');
105
+ setStringValue(newValue);
106
+ };
107
+
108
+ const [objectValue, setObjectValue] = useState<ObjectValue>();
109
+ const objectHandler = (newValue?: ObjectValue) => {
110
+ console.log('change');
111
+ setObjectValue(newValue);
112
+ };
113
+
114
+ const selectValuesType = valuesType;
115
+ const shouldRenderAsReactNodes = shouldUseReactNodes;
116
+
117
+ const getOptions = async (): Promise<Array<string | ObjectValue>> =>
118
+ new Promise((resolve) =>
119
+ setTimeout(() => {
120
+ resolve(
121
+ [...Array(10)].map((_) => {
122
+ if (selectValuesType === 'strings') {
123
+ return genLetters(getRandomInt(3, 10));
124
+ }
125
+ return {
126
+ name: genLetters(getRandomInt(3, 10)),
127
+ age: getRandomInt(10, 70),
128
+ } as ObjectValue;
129
+ }),
130
+ );
131
+ }, 1000),
132
+ );
133
+
134
+ const [dynamicOptions, setDynamicOptions] = useState<
135
+ Array<string | ObjectValue>
136
+ >([]);
137
+
138
+ const handleOpen = () => {
139
+ console.log('isOpen');
140
+ };
141
+
142
+ const handleBlur = () => {
143
+ console.log('blur');
144
+ };
145
+
146
+ useEffect(() => {
147
+ const api = async () => {
148
+ setDynamicOptions(await getOptions());
149
+ };
150
+
151
+ api();
152
+ }, [selectValuesType]);
153
+
154
+ const props =
155
+ selectValuesType === 'strings'
156
+ ? {
157
+ onChange: stringHandler,
158
+ value: stringValue,
159
+ options: optionsMode === 'dynamic' ? dynamicOptions : stringOptions,
160
+ convertValueToReactNode: shouldRenderAsReactNodes
161
+ ? convertStringToReactNode
162
+ : undefined,
163
+ isOptionDisabled: shouldUseCustomIsDisabledFunction
164
+ ? isOptionDisabled
165
+ : undefined,
166
+ }
167
+ : {
168
+ onChange: objectHandler,
169
+ value: objectValue,
170
+ options: optionsMode === 'dynamic' ? dynamicOptions : objectOptions,
171
+ convertValueToString: convertObjectToString,
172
+ convertValueToId: convertObjectToId,
173
+ convertValueToReactNode: shouldRenderAsReactNodes
174
+ ? convertObjectToReactNode
175
+ : undefined,
176
+ isOptionDisabled: shouldUseCustomIsDisabledFunction
177
+ ? isObjectOptionDisabled
178
+ : undefined,
179
+ };
180
+
181
+ return (
182
+ <Select
183
+ {...rest}
184
+ {...(props as unknown as ISelectProps<any>)}
185
+ {...(shouldRenderSearchInputInList && {
186
+ searchInput: { shouldRenderInList: true },
187
+ })}
188
+ noMatchesLabel={isNotEmpty(noMatchesLabel) ? noMatchesLabel : undefined}
189
+ optionsMode={optionsMode}
190
+ onType={async () => setDynamicOptions(await getOptions())}
191
+ onOpen={handleOpen}
192
+ onBlur={handleBlur}
193
+ dropdownOptions={{
194
+ shouldUsePopper,
195
+ shouldRenderInBody,
196
+ shouldHideOnScroll,
197
+ canBeFlipped,
198
+ scrollParent,
199
+ }}
200
+ />
201
+ );
202
+ }
203
+
204
+ export default {
205
+ title: 'Select',
206
+ component: SelectWithCustomProps,
207
+ argTypes: {
208
+ debounceTime: {
209
+ control: { type: 'range', min: 0, max: 1000, step: 100 },
210
+ },
211
+ errorPosition: { control: 'inline-radio', options: errorPositions },
212
+ border: { control: 'inline-radio', options: borders },
213
+ inlineStyle: { control: 'select', options: inlineStyles },
214
+ optionsMode: {
215
+ control: 'inline-radio',
216
+ options: ['normal', 'search', 'dynamic'],
217
+ },
218
+ valuesType: {
219
+ control: 'inline-radio',
220
+ options: ['strings', 'objects'],
221
+ },
222
+ },
223
+ } as ComponentMeta<typeof SelectWithCustomProps>;
224
+
225
+ const Template: ComponentStory<typeof SelectWithCustomProps> = (args) => (
226
+ <SelectWithCustomProps {...args} />
227
+ );
228
+
229
+ export const Default = Template.bind({});
230
+
231
+ Default.args = {
232
+ label: 'Dropdown',
233
+ defaultOptionLabel: 'Default Option',
234
+ noMatchesLabel: 'No matches',
235
+ border: undefined,
236
+ isInvalid: false,
237
+ errorMessage: 'Error Text',
238
+ errorPosition: 'bottom',
239
+ hasFloatingLabel: true,
240
+ hasRequiredLabel: true,
241
+ isDisabled: false,
242
+ isRequired: false,
243
+ isClearable: false,
244
+ isLoading: false,
245
+ debounceTime: 400,
246
+ // custom options
247
+ shouldUseReactNodes: false,
248
+ valuesType: 'strings',
249
+ optionsMode: 'normal',
250
+ shouldUsePopper: false,
251
+ shouldRenderInBody: false,
252
+ shouldHideOnScroll: false,
253
+ shouldUseCustomIsDisabledFunction: false,
254
+ shouldRenderSearchInputInList: false,
255
+ shouldScrollToList: true,
256
+ canBeFlipped: false,
257
+ scrollParent: 'document',
258
+ };