@true-engineering/true-react-common-ui-kit 3.45.2 → 4.0.0-alpha1

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 (708) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +0 -40
  3. package/dist/components/AccountInfo/AccountInfo.d.ts +11 -11
  4. package/dist/components/AccountInfo/AccountInfo.stories.d.ts +6 -6
  5. package/dist/components/AccountInfo/AccountInfo.styles.d.ts +6 -6
  6. package/dist/components/AccountInfo/constants.d.ts +1 -1
  7. package/dist/components/AccountInfo/index.d.ts +2 -2
  8. package/dist/components/AddButton/AddButton.d.ts +14 -14
  9. package/dist/components/AddButton/AddButton.stories.d.ts +6 -6
  10. package/dist/components/AddButton/AddButton.styles.d.ts +3 -3
  11. package/dist/components/AddButton/index.d.ts +2 -2
  12. package/dist/components/Button/Button.d.ts +41 -41
  13. package/dist/components/Button/Button.stories.d.ts +6 -6
  14. package/dist/components/Button/Button.styles.d.ts +8 -8
  15. package/dist/components/Button/constants.d.ts +2 -2
  16. package/dist/components/Button/index.d.ts +3 -3
  17. package/dist/components/Button/types.d.ts +3 -3
  18. package/dist/components/Checkbox/Checkbox.d.ts +24 -24
  19. package/dist/components/Checkbox/Checkbox.stories.d.ts +8 -8
  20. package/dist/components/Checkbox/Checkbox.styles.d.ts +3 -3
  21. package/dist/components/Checkbox/index.d.ts +2 -2
  22. package/dist/components/CloseButton/CloseButton.d.ts +10 -10
  23. package/dist/components/CloseButton/CloseButton.stories.d.ts +5 -5
  24. package/dist/components/CloseButton/CloseButton.styles.d.ts +3 -3
  25. package/dist/components/CloseButton/index.d.ts +2 -2
  26. package/dist/components/Colors/Colors.d.ts +2 -2
  27. package/dist/components/Colors/Colors.stories.d.ts +5 -5
  28. package/dist/components/Colors/Colors.styles.d.ts +1 -1
  29. package/dist/components/Colors/index.d.ts +1 -1
  30. package/dist/components/ControlWrapper/ControlWrapper.d.ts +27 -0
  31. package/dist/components/ControlWrapper/ControlWrapper.stories.d.ts +6 -0
  32. package/dist/components/ControlWrapper/ControlWrapper.styles.d.ts +6 -0
  33. package/dist/components/ControlWrapper/index.d.ts +2 -0
  34. package/dist/components/CssBaseline/CssBaseline.d.ts +5 -5
  35. package/dist/components/CssBaseline/CssBaseline.styles.d.ts +3 -3
  36. package/dist/components/CssBaseline/index.d.ts +2 -2
  37. package/dist/components/DateInput/DateInput.d.ts +17 -17
  38. package/dist/components/DateInput/DateInput.stories.d.ts +7 -7
  39. package/dist/components/DateInput/DateInput.styles.d.ts +6 -6
  40. package/dist/components/DateInput/constants.d.ts +2 -2
  41. package/dist/components/DateInput/index.d.ts +3 -3
  42. package/dist/components/DatePicker/DatePicker.d.ts +26 -26
  43. package/dist/components/DatePicker/DatePicker.stories.d.ts +7 -7
  44. package/dist/components/DatePicker/DatePicker.styles.d.ts +6 -6
  45. package/dist/components/DatePicker/components/DatePickerHeader/DatePickerHeader.d.ts +8 -8
  46. package/dist/components/DatePicker/components/DatePickerHeader/DatePickerHeader.styles.d.ts +7 -7
  47. package/dist/components/DatePicker/components/DatePickerHeader/index.d.ts +2 -2
  48. package/dist/components/DatePicker/components/PopperContainer/PopperContainer.d.ts +4 -4
  49. package/dist/components/DatePicker/components/PopperContainer/index.d.ts +1 -1
  50. package/dist/components/DatePicker/components/index.d.ts +2 -2
  51. package/dist/components/DatePicker/constants.d.ts +3 -3
  52. package/dist/components/DatePicker/helpers.d.ts +3 -3
  53. package/dist/components/DatePicker/index.d.ts +4 -4
  54. package/dist/components/DatePicker/types.d.ts +4 -4
  55. package/dist/components/Description/Description.d.ts +13 -13
  56. package/dist/components/Description/Description.stories.d.ts +16 -16
  57. package/dist/components/Description/Description.styles.d.ts +3 -3
  58. package/dist/components/Description/constants.d.ts +1 -1
  59. package/dist/components/Description/index.d.ts +2 -2
  60. package/dist/components/FileInput/FileInput.d.ts +25 -25
  61. package/dist/components/FileInput/FileInput.stories.d.ts +7 -7
  62. package/dist/components/FileInput/FileInput.styles.d.ts +3 -3
  63. package/dist/components/FileInput/helpers.d.ts +2 -2
  64. package/dist/components/FileInput/index.d.ts +2 -2
  65. package/dist/components/FileItem/FileItem.d.ts +31 -31
  66. package/dist/components/FileItem/FileItem.stories.d.ts +8 -8
  67. package/dist/components/FileItem/FileItem.styles.d.ts +11 -11
  68. package/dist/components/FileItem/constants.d.ts +5 -5
  69. package/dist/components/FileItem/helpers.d.ts +4 -4
  70. package/dist/components/FileItem/index.d.ts +4 -4
  71. package/dist/components/FileItem/types.d.ts +8 -8
  72. package/dist/components/FiltersPane/FiltersPane.d.ts +22 -22
  73. package/dist/components/FiltersPane/FiltersPane.stories.d.ts +31 -32
  74. package/dist/components/FiltersPane/FiltersPane.styles.d.ts +11 -11
  75. package/dist/components/FiltersPane/components/Filter/Filter.d.ts +7 -7
  76. package/dist/components/FiltersPane/components/Filter/index.d.ts +1 -1
  77. package/dist/components/FiltersPane/components/FilterInterval/FilterInterval.d.ts +24 -24
  78. package/dist/components/FiltersPane/components/FilterInterval/FilterInterval.styles.d.ts +15 -15
  79. package/dist/components/FiltersPane/components/FilterInterval/index.d.ts +2 -2
  80. package/dist/components/FiltersPane/components/FilterMultiSelect/FilterMultiSelect.d.ts +5 -5
  81. package/dist/components/FiltersPane/components/FilterMultiSelect/index.d.ts +1 -1
  82. package/dist/components/FiltersPane/components/FilterSelect/FilterSelect.d.ts +30 -30
  83. package/dist/components/FiltersPane/components/FilterSelect/FilterSelect.styles.d.ts +15 -15
  84. package/dist/components/FiltersPane/components/FilterSelect/index.d.ts +2 -2
  85. package/dist/components/FiltersPane/components/FilterValueView/FilterValueView.d.ts +5 -5
  86. package/dist/components/FiltersPane/components/FilterValueView/FilterValueView.styles.d.ts +3 -3
  87. package/dist/components/FiltersPane/components/FilterValueView/index.d.ts +2 -2
  88. package/dist/components/FiltersPane/components/FilterWithDates/FilterWithDates.d.ts +16 -16
  89. package/dist/components/FiltersPane/components/FilterWithDates/FilterWithDates.styles.d.ts +26 -26
  90. package/dist/components/FiltersPane/components/FilterWithDates/index.d.ts +2 -2
  91. package/dist/components/FiltersPane/components/FilterWithPeriod/FilterWithPeriod.d.ts +13 -13
  92. package/dist/components/FiltersPane/components/FilterWithPeriod/FilterWithPeriod.styles.d.ts +7 -7
  93. package/dist/components/FiltersPane/components/FilterWithPeriod/index.d.ts +2 -2
  94. package/dist/components/FiltersPane/components/FilterWrapper/FilterWrapper.d.ts +13 -13
  95. package/dist/components/FiltersPane/components/FilterWrapper/FilterWrapper.styles.d.ts +8 -8
  96. package/dist/components/FiltersPane/components/FilterWrapper/helpers.d.ts +1 -1
  97. package/dist/components/FiltersPane/components/FilterWrapper/index.d.ts +2 -2
  98. package/dist/components/FiltersPane/components/FiltersPaneSearch/FiltersPaneSearch.d.ts +20 -21
  99. package/dist/components/FiltersPane/components/FiltersPaneSearch/FiltersPaneSearch.styles.d.ts +10 -10
  100. package/dist/components/FiltersPane/components/FiltersPaneSearch/index.d.ts +2 -2
  101. package/dist/components/FiltersPane/components/index.d.ts +9 -9
  102. package/dist/components/FiltersPane/constants.d.ts +9 -9
  103. package/dist/components/FiltersPane/helpers.d.ts +5 -5
  104. package/dist/components/FiltersPane/index.d.ts +4 -4
  105. package/dist/components/FiltersPane/types.d.ts +108 -108
  106. package/dist/components/Flag/Flag.d.ts +8 -8
  107. package/dist/components/Flag/Flag.stories.d.ts +12 -12
  108. package/dist/components/Flag/Flag.styles.d.ts +3 -3
  109. package/dist/components/Flag/index.d.ts +2 -2
  110. package/dist/components/FlexibleTable/FlexibleTable.d.ts +31 -31
  111. package/dist/components/FlexibleTable/FlexibleTable.stories.d.ts +19 -19
  112. package/dist/components/FlexibleTable/FlexibleTable.styles.d.ts +7 -7
  113. package/dist/components/FlexibleTable/components/FlexibleTableCell/FlexibleTableCell.d.ts +14 -14
  114. package/dist/components/FlexibleTable/components/FlexibleTableCell/FlexibleTableCell.styles.d.ts +3 -3
  115. package/dist/components/FlexibleTable/components/FlexibleTableCell/index.d.ts +2 -2
  116. package/dist/components/FlexibleTable/components/FlexibleTableRow/FlexibleTableRow.d.ts +31 -31
  117. package/dist/components/FlexibleTable/components/FlexibleTableRow/FlexibleTableRow.styles.d.ts +6 -6
  118. package/dist/components/FlexibleTable/components/FlexibleTableRow/index.d.ts +2 -2
  119. package/dist/components/FlexibleTable/components/index.d.ts +2 -2
  120. package/dist/components/FlexibleTable/constants.d.ts +3 -3
  121. package/dist/components/FlexibleTable/helpers.d.ts +3 -3
  122. package/dist/components/FlexibleTable/index.d.ts +4 -4
  123. package/dist/components/FlexibleTable/types.d.ts +57 -57
  124. package/dist/components/Icon/Icon.d.ts +8 -8
  125. package/dist/components/Icon/Icon.stories.d.ts +6 -6
  126. package/dist/components/Icon/Icon.styles.d.ts +3 -3
  127. package/dist/components/Icon/complexIcons/icons.d.ts +10 -10
  128. package/dist/components/Icon/complexIcons/index.d.ts +1 -1
  129. package/dist/components/Icon/components/ComplexIconBoilerplate/ComplexIconBoilerplate.d.ts +6 -6
  130. package/dist/components/Icon/components/ComplexIconBoilerplate/index.d.ts +1 -1
  131. package/dist/components/Icon/components/IconBolerplate/IconBoilerplate.d.ts +6 -6
  132. package/dist/components/Icon/components/IconBolerplate/index.d.ts +1 -1
  133. package/dist/components/Icon/components/index.d.ts +2 -2
  134. package/dist/components/Icon/helpers.d.ts +6 -6
  135. package/dist/components/Icon/icons-list.d.ts +1 -1
  136. package/dist/components/Icon/index.d.ts +5 -5
  137. package/dist/components/Icon/snippet.d.ts +3 -3
  138. package/dist/components/Icon/types.d.ts +13 -13
  139. package/dist/components/IconButton/IconButton.d.ts +19 -19
  140. package/dist/components/IconButton/IconButton.stories.d.ts +6 -6
  141. package/dist/components/IconButton/IconButton.styles.d.ts +3 -3
  142. package/dist/components/IconButton/constants.d.ts +2 -2
  143. package/dist/components/IconButton/index.d.ts +3 -3
  144. package/dist/components/IconButton/types.d.ts +5 -5
  145. package/dist/components/IncrementInput/IncrementInput.d.ts +9 -9
  146. package/dist/components/IncrementInput/IncrementInput.stories.d.ts +6 -6
  147. package/dist/components/IncrementInput/IncrementInput.styles.d.ts +9 -9
  148. package/dist/components/IncrementInput/index.d.ts +2 -2
  149. package/dist/components/Input/Input.d.ts +5 -52
  150. package/dist/components/Input/Input.stories.d.ts +25 -34
  151. package/dist/components/Input/Input.styles.d.ts +8 -7
  152. package/dist/components/Input/InputBase.d.ts +24 -0
  153. package/dist/components/Input/index.d.ts +4 -3
  154. package/dist/components/Input/types.d.ts +3 -4
  155. package/dist/components/List/List.d.ts +9 -9
  156. package/dist/components/List/List.stories.d.ts +5 -5
  157. package/dist/components/List/List.styles.d.ts +5 -5
  158. package/dist/components/List/components/ListItem/ListItem.d.ts +17 -17
  159. package/dist/components/List/components/ListItem/ListItem.styles.d.ts +3 -3
  160. package/dist/components/List/components/ListItem/index.d.ts +2 -2
  161. package/dist/components/List/components/index.d.ts +1 -1
  162. package/dist/components/List/index.d.ts +3 -3
  163. package/dist/components/Modal/Modal.d.ts +34 -34
  164. package/dist/components/Modal/Modal.stories.d.ts +29 -29
  165. package/dist/components/Modal/Modal.styles.d.ts +7 -7
  166. package/dist/components/Modal/index.d.ts +3 -3
  167. package/dist/components/Modal/types.d.ts +3 -3
  168. package/dist/components/MoreMenu/MoreMenu.d.ts +15 -15
  169. package/dist/components/MoreMenu/MoreMenu.stories.d.ts +6 -6
  170. package/dist/components/MoreMenu/MoreMenu.styles.d.ts +6 -6
  171. package/dist/components/MoreMenu/index.d.ts +2 -2
  172. package/dist/components/MultiSelect/MultiSelect.d.ts +23 -23
  173. package/dist/components/MultiSelect/MultiSelect.stories.d.ts +13 -13
  174. package/dist/components/MultiSelect/MultiSelect.styles.d.ts +7 -7
  175. package/dist/components/MultiSelect/components/MultiSelectInput/MultiSelectInput.d.ts +12 -12
  176. package/dist/components/MultiSelect/components/MultiSelectInput/MultiSelectInput.styles.d.ts +3 -3
  177. package/dist/components/MultiSelect/components/MultiSelectInput/index.d.ts +2 -2
  178. package/dist/components/MultiSelect/components/index.d.ts +1 -1
  179. package/dist/components/MultiSelect/index.d.ts +4 -4
  180. package/dist/components/MultiSelect/types.d.ts +1 -1
  181. package/dist/components/MultiSelectList/MultiSelectList.d.ts +25 -25
  182. package/dist/components/MultiSelectList/MultiSelectList.styles.d.ts +13 -13
  183. package/dist/components/MultiSelectList/constants.d.ts +3 -3
  184. package/dist/components/MultiSelectList/helpers.d.ts +3 -3
  185. package/dist/components/MultiSelectList/index.d.ts +3 -3
  186. package/dist/components/MultiSelectList/types.d.ts +12 -12
  187. package/dist/components/NewMoreMenu/NewMoreMenu.d.ts +13 -13
  188. package/dist/components/NewMoreMenu/NewMoreMenu.stories.d.ts +12 -12
  189. package/dist/components/NewMoreMenu/NewMoreMenu.styles.d.ts +8 -8
  190. package/dist/components/NewMoreMenu/index.d.ts +2 -2
  191. package/dist/components/Notification/Notification.d.ts +17 -17
  192. package/dist/components/Notification/Notification.stories.d.ts +8 -8
  193. package/dist/components/Notification/Notification.styles.d.ts +3 -3
  194. package/dist/components/Notification/index.d.ts +3 -3
  195. package/dist/components/Notification/types.d.ts +1 -1
  196. package/dist/components/NumberInput/NumberInput.d.ts +18 -18
  197. package/dist/components/NumberInput/NumberInput.stories.d.ts +7 -7
  198. package/dist/components/NumberInput/helpers.d.ts +4 -4
  199. package/dist/components/NumberInput/index.d.ts +1 -1
  200. package/dist/components/PhoneInput/PhoneInput.d.ts +17 -17
  201. package/dist/components/PhoneInput/PhoneInput.stories.d.ts +28 -28
  202. package/dist/components/PhoneInput/PhoneInput.styles.d.ts +9 -9
  203. package/dist/components/PhoneInput/components/PhoneInputCountryList/PhoneInputCountryList.d.ts +14 -13
  204. package/dist/components/PhoneInput/components/PhoneInputCountryList/PhoneInputCountryList.stories.d.ts +5 -5
  205. package/dist/components/PhoneInput/components/PhoneInputCountryList/PhoneInputCountryList.styles.d.ts +7 -7
  206. package/dist/components/PhoneInput/components/PhoneInputCountryList/index.d.ts +2 -2
  207. package/dist/components/PhoneInput/components/index.d.ts +1 -1
  208. package/dist/components/PhoneInput/constants.d.ts +2 -2
  209. package/dist/components/PhoneInput/index.d.ts +4 -4
  210. package/dist/components/PhoneInput/types.d.ts +17 -15
  211. package/dist/components/RadioButton/RadioButton.d.ts +15 -15
  212. package/dist/components/RadioButton/RadioButton.stories.d.ts +7 -7
  213. package/dist/components/RadioButton/RadioButton.styles.d.ts +3 -3
  214. package/dist/components/RadioButton/index.d.ts +2 -2
  215. package/dist/components/ScrollIntoViewIfNeeded/ScrollIntoViewIfNeeded.d.ts +386 -386
  216. package/dist/components/ScrollIntoViewIfNeeded/constants.d.ts +3 -3
  217. package/dist/components/ScrollIntoViewIfNeeded/index.d.ts +1 -1
  218. package/dist/components/SearchInput/SearchInput.d.ts +6 -8
  219. package/dist/components/SearchInput/SearchInput.stories.d.ts +16 -6
  220. package/dist/components/SearchInput/SearchInput.styles.d.ts +7 -7
  221. package/dist/components/SearchInput/index.d.ts +2 -2
  222. package/dist/components/Select/CustomSelect.stories.d.ts +11 -11
  223. package/dist/components/Select/MultiSelect.stories.d.ts +15 -15
  224. package/dist/components/Select/Select.d.ts +52 -52
  225. package/dist/components/Select/Select.stories.d.ts +15 -15
  226. package/dist/components/Select/Select.styles.d.ts +34 -33
  227. package/dist/components/Select/components/SelectList/SelectList.d.ts +23 -23
  228. package/dist/components/Select/components/SelectList/SelectList.styles.d.ts +6 -6
  229. package/dist/components/Select/components/SelectList/index.d.ts +2 -2
  230. package/dist/components/Select/components/SelectListItem/SelectListItem.d.ts +15 -15
  231. package/dist/components/Select/components/SelectListItem/SelectListItem.styles.d.ts +2 -2
  232. package/dist/components/Select/components/SelectListItem/index.d.ts +1 -1
  233. package/dist/components/Select/components/index.d.ts +2 -2
  234. package/dist/components/Select/constants.d.ts +2 -2
  235. package/dist/components/Select/helpers.d.ts +4 -4
  236. package/dist/components/Select/index.d.ts +4 -4
  237. package/dist/components/Select/types.d.ts +4 -1
  238. package/dist/components/Selector/Selector.d.ts +22 -22
  239. package/dist/components/Selector/Selector.stories.d.ts +7 -7
  240. package/dist/components/Selector/Selector.styles.d.ts +9 -9
  241. package/dist/components/Selector/index.d.ts +2 -2
  242. package/dist/components/Selector/types.d.ts +10 -10
  243. package/dist/components/Skeleton/Skeleton.d.ts +7 -7
  244. package/dist/components/Skeleton/Skeleton.stories.d.ts +6 -6
  245. package/dist/components/Skeleton/Skeleton.styles.d.ts +3 -3
  246. package/dist/components/Skeleton/index.d.ts +2 -2
  247. package/dist/components/SmartInput/SmartInput.d.ts +14 -14
  248. package/dist/components/SmartInput/SmartInput.stories.d.ts +18 -18
  249. package/dist/components/SmartInput/constants.d.ts +16 -16
  250. package/dist/components/SmartInput/helpers.d.ts +2 -2
  251. package/dist/components/SmartInput/index.d.ts +2 -2
  252. package/dist/components/SmartInput/types.d.ts +6 -6
  253. package/dist/components/Status/Status.d.ts +16 -16
  254. package/dist/components/Status/Status.stories.d.ts +6 -6
  255. package/dist/components/Status/Status.styles.d.ts +3 -3
  256. package/dist/components/Status/constants.d.ts +2 -2
  257. package/dist/components/Status/index.d.ts +2 -2
  258. package/dist/components/Status/types.d.ts +3 -3
  259. package/dist/components/Switch/Switch.d.ts +20 -20
  260. package/dist/components/Switch/Switch.stories.d.ts +16 -16
  261. package/dist/components/Switch/Switch.styles.d.ts +3 -3
  262. package/dist/components/Switch/index.d.ts +3 -3
  263. package/dist/components/Switch/types.d.ts +4 -4
  264. package/dist/components/TextArea/TextArea.d.ts +29 -38
  265. package/dist/components/TextArea/TextArea.stories.d.ts +17 -17
  266. package/dist/components/TextArea/TextArea.styles.d.ts +9 -3
  267. package/dist/components/TextArea/index.d.ts +3 -3
  268. package/dist/components/TextArea/types.d.ts +2 -2
  269. package/dist/components/TextButton/TextButton.d.ts +31 -31
  270. package/dist/components/TextButton/TextButton.stories.d.ts +6 -6
  271. package/dist/components/TextButton/TextButton.styles.d.ts +7 -7
  272. package/dist/components/TextButton/constants.d.ts +2 -2
  273. package/dist/components/TextButton/index.d.ts +3 -3
  274. package/dist/components/TextButton/types.d.ts +5 -5
  275. package/dist/components/TextWithInfo/TextWithInfo.d.ts +15 -15
  276. package/dist/components/TextWithInfo/TextWithInfo.stories.d.ts +12 -12
  277. package/dist/components/TextWithInfo/TextWithInfo.styles.d.ts +3 -3
  278. package/dist/components/TextWithInfo/index.d.ts +2 -2
  279. package/dist/components/TextWithTooltip/TextWithTooltip.d.ts +27 -27
  280. package/dist/components/TextWithTooltip/TextWithTooltip.stories.d.ts +24 -24
  281. package/dist/components/TextWithTooltip/TextWithTooltip.styles.d.ts +6 -6
  282. package/dist/components/TextWithTooltip/index.d.ts +2 -2
  283. package/dist/components/ThemedPreloader/ThemedPreloader.d.ts +11 -11
  284. package/dist/components/ThemedPreloader/ThemedPreloader.stories.d.ts +17 -17
  285. package/dist/components/ThemedPreloader/ThemedPreloader.styles.d.ts +7 -7
  286. package/dist/components/ThemedPreloader/components/DefaultPreloader/DefaultPreloader.d.ts +2 -2
  287. package/dist/components/ThemedPreloader/components/DefaultPreloader/index.d.ts +1 -1
  288. package/dist/components/ThemedPreloader/components/DotsPreloader/DotsPreloader.d.ts +5 -5
  289. package/dist/components/ThemedPreloader/components/DotsPreloader/DotsPreloader.styles.d.ts +3 -3
  290. package/dist/components/ThemedPreloader/components/DotsPreloader/index.d.ts +2 -2
  291. package/dist/components/ThemedPreloader/components/SvgPreloader/SvgPreloader.d.ts +8 -8
  292. package/dist/components/ThemedPreloader/components/SvgPreloader/SvgPreloader.styles.d.ts +3 -3
  293. package/dist/components/ThemedPreloader/components/SvgPreloader/index.d.ts +2 -2
  294. package/dist/components/ThemedPreloader/components/index.d.ts +3 -3
  295. package/dist/components/ThemedPreloader/constants.d.ts +1 -1
  296. package/dist/components/ThemedPreloader/index.d.ts +4 -4
  297. package/dist/components/ThemedPreloader/types.d.ts +2 -2
  298. package/dist/components/Toaster/Toaster.d.ts +23 -23
  299. package/dist/components/Toaster/Toaster.stories.d.ts +5 -5
  300. package/dist/components/Toaster/Toaster.styles.d.ts +6 -6
  301. package/dist/components/Toaster/constants.d.ts +1 -1
  302. package/dist/components/Toaster/index.d.ts +3 -3
  303. package/dist/components/Toaster/types.d.ts +1 -1
  304. package/dist/components/Tooltip/Tooltip.d.ts +11 -11
  305. package/dist/components/Tooltip/Tooltip.stories.d.ts +5 -5
  306. package/dist/components/Tooltip/Tooltip.styles.d.ts +3 -3
  307. package/dist/components/Tooltip/index.d.ts +3 -3
  308. package/dist/components/Tooltip/types.d.ts +1 -1
  309. package/dist/components/WithMessages/WithMessages.d.ts +10 -0
  310. package/dist/components/WithMessages/WithMessages.stories.d.ts +7 -0
  311. package/dist/components/WithMessages/WithMessages.styles.d.ts +3 -0
  312. package/dist/components/WithMessages/index.d.ts +2 -0
  313. package/dist/components/WithPopup/WithPopup.d.ts +33 -40
  314. package/dist/components/WithPopup/WithPopup.stories.d.ts +16 -16
  315. package/dist/components/WithPopup/WithPopup.styles.d.ts +3 -3
  316. package/dist/components/WithPopup/constants.d.ts +2 -2
  317. package/dist/components/WithPopup/index.d.ts +2 -2
  318. package/dist/components/WithPopup/types.d.ts +19 -22
  319. package/dist/components/WithTooltip/WithTooltip.d.ts +18 -18
  320. package/dist/components/WithTooltip/WithTooltip.stories.d.ts +6 -6
  321. package/dist/components/WithTooltip/WithTooltip.styles.d.ts +6 -7
  322. package/dist/components/WithTooltip/index.d.ts +2 -2
  323. package/dist/components/index.d.ts +48 -46
  324. package/dist/constants/index.d.ts +2 -2
  325. package/dist/constants/mime-types.d.ts +76 -76
  326. package/dist/constants/phone-info.d.ts +2 -2
  327. package/dist/helpers/index.d.ts +3 -3
  328. package/dist/helpers/misc.d.ts +21 -21
  329. package/dist/helpers/phone.d.ts +14 -14
  330. package/dist/helpers/popper-helpers.d.ts +2 -2
  331. package/dist/hooks/index.d.ts +7 -7
  332. package/dist/hooks/use-did-mount-effect.d.ts +2 -2
  333. package/dist/hooks/use-dropdown.d.ts +11 -11
  334. package/dist/hooks/use-is-mounted.d.ts +1 -1
  335. package/dist/hooks/use-merged-refs.d.ts +2 -2
  336. package/dist/hooks/use-mixed-styles.d.ts +1 -1
  337. package/dist/hooks/use-on-click-outside.d.ts +5 -5
  338. package/dist/hooks/use-tweak-styles.d.ts +21 -21
  339. package/dist/index.d.ts +6 -6
  340. package/dist/theme/Provider.d.ts +11 -11
  341. package/dist/theme/common.d.ts +111 -103
  342. package/dist/theme/helpers.d.ts +10 -10
  343. package/dist/theme/index.d.ts +4 -4
  344. package/dist/theme/types.d.ts +84 -82
  345. package/dist/true-react-common-ui-kit.js +1258 -1110
  346. package/dist/true-react-common-ui-kit.js.map +1 -1
  347. package/dist/true-react-common-ui-kit.umd.cjs +1238 -1090
  348. package/dist/true-react-common-ui-kit.umd.cjs.map +1 -1
  349. package/dist/types.d.ts +45 -44
  350. package/package.json +99 -99
  351. package/src/components/AccountInfo/AccountInfo.stories.tsx +32 -32
  352. package/src/components/AccountInfo/AccountInfo.styles.ts +52 -52
  353. package/src/components/AccountInfo/AccountInfo.tsx +80 -80
  354. package/src/components/AccountInfo/constants.ts +1 -1
  355. package/src/components/AccountInfo/index.ts +2 -2
  356. package/src/components/AddButton/AddButton.stories.tsx +21 -21
  357. package/src/components/AddButton/AddButton.styles.ts +34 -34
  358. package/src/components/AddButton/AddButton.tsx +52 -52
  359. package/src/components/AddButton/index.ts +2 -2
  360. package/src/components/Button/Button.stories.tsx +50 -54
  361. package/src/components/Button/Button.styles.ts +200 -200
  362. package/src/components/Button/Button.tsx +129 -129
  363. package/src/components/Button/constants.ts +11 -11
  364. package/src/components/Button/index.ts +3 -3
  365. package/src/components/Button/types.ts +5 -5
  366. package/src/components/Checkbox/Checkbox.stories.tsx +54 -54
  367. package/src/components/Checkbox/Checkbox.styles.ts +49 -49
  368. package/src/components/Checkbox/Checkbox.tsx +84 -84
  369. package/src/components/Checkbox/index.ts +2 -2
  370. package/src/components/CloseButton/CloseButton.stories.tsx +11 -11
  371. package/src/components/CloseButton/CloseButton.styles.ts +34 -34
  372. package/src/components/CloseButton/CloseButton.tsx +35 -35
  373. package/src/components/CloseButton/index.ts +2 -2
  374. package/src/components/Colors/Colors.stories.tsx +7 -7
  375. package/src/components/Colors/Colors.styles.ts +36 -36
  376. package/src/components/Colors/Colors.tsx +26 -26
  377. package/src/components/Colors/index.ts +1 -1
  378. package/src/components/ControlWrapper/ControlWrapper.stories.tsx +45 -0
  379. package/src/components/ControlWrapper/ControlWrapper.styles.ts +185 -0
  380. package/src/components/ControlWrapper/ControlWrapper.tsx +151 -0
  381. package/src/components/ControlWrapper/index.ts +2 -0
  382. package/src/components/CssBaseline/CssBaseline.styles.ts +14 -14
  383. package/src/components/CssBaseline/CssBaseline.tsx +13 -13
  384. package/src/components/CssBaseline/index.ts +2 -2
  385. package/src/components/DateInput/DateInput.stories.tsx +61 -61
  386. package/src/components/DateInput/DateInput.styles.ts +13 -18
  387. package/src/components/DateInput/DateInput.tsx +90 -90
  388. package/src/components/DateInput/constants.ts +2 -2
  389. package/src/components/DateInput/index.ts +3 -3
  390. package/src/components/DatePicker/DatePicker.stories.tsx +88 -88
  391. package/src/components/DatePicker/DatePicker.styles.ts +38 -38
  392. package/src/components/DatePicker/DatePicker.tsx +314 -314
  393. package/src/components/DatePicker/components/DatePickerHeader/DatePickerHeader.styles.ts +54 -88
  394. package/src/components/DatePicker/components/DatePickerHeader/DatePickerHeader.tsx +81 -89
  395. package/src/components/DatePicker/components/DatePickerHeader/index.ts +2 -2
  396. package/src/components/DatePicker/components/PopperContainer/PopperContainer.tsx +6 -6
  397. package/src/components/DatePicker/components/PopperContainer/index.ts +1 -1
  398. package/src/components/DatePicker/components/index.ts +2 -2
  399. package/src/components/DatePicker/constants.ts +6 -6
  400. package/src/components/DatePicker/helpers.ts +23 -23
  401. package/src/components/DatePicker/index.ts +4 -4
  402. package/src/components/DatePicker/types.ts +48 -48
  403. package/src/components/Description/Description.stories.tsx +27 -27
  404. package/src/components/Description/Description.styles.ts +30 -30
  405. package/src/components/Description/Description.tsx +61 -61
  406. package/src/components/Description/constants.ts +1 -1
  407. package/src/components/Description/index.ts +2 -2
  408. package/src/components/FileInput/FileInput.stories.tsx +75 -75
  409. package/src/components/FileInput/FileInput.styles.ts +80 -80
  410. package/src/components/FileInput/FileInput.tsx +147 -147
  411. package/src/components/FileInput/helpers.ts +6 -6
  412. package/src/components/FileInput/index.ts +2 -2
  413. package/src/components/FileItem/FileItem.stories.tsx +59 -63
  414. package/src/components/FileItem/FileItem.styles.ts +122 -122
  415. package/src/components/FileItem/FileItem.tsx +157 -157
  416. package/src/components/FileItem/constants.ts +29 -29
  417. package/src/components/FileItem/helpers.ts +27 -27
  418. package/src/components/FileItem/index.ts +4 -4
  419. package/src/components/FileItem/types.ts +11 -11
  420. package/src/components/FiltersPane/FiltersPane.stories.tsx +295 -299
  421. package/src/components/FiltersPane/FiltersPane.styles.ts +92 -92
  422. package/src/components/FiltersPane/FiltersPane.tsx +162 -162
  423. package/src/components/FiltersPane/components/Filter/Filter.tsx +114 -114
  424. package/src/components/FiltersPane/components/Filter/index.ts +1 -1
  425. package/src/components/FiltersPane/components/FilterInterval/FilterInterval.styles.ts +63 -61
  426. package/src/components/FiltersPane/components/FilterInterval/FilterInterval.tsx +147 -154
  427. package/src/components/FiltersPane/components/FilterInterval/index.ts +2 -2
  428. package/src/components/FiltersPane/components/FilterMultiSelect/FilterMultiSelect.tsx +10 -10
  429. package/src/components/FiltersPane/components/FilterMultiSelect/index.ts +1 -1
  430. package/src/components/FiltersPane/components/FilterSelect/FilterSelect.styles.ts +143 -141
  431. package/src/components/FiltersPane/components/FilterSelect/FilterSelect.tsx +361 -361
  432. package/src/components/FiltersPane/components/FilterSelect/index.ts +2 -2
  433. package/src/components/FiltersPane/components/FilterValueView/FilterValueView.styles.tsx +15 -15
  434. package/src/components/FiltersPane/components/FilterValueView/FilterValueView.tsx +166 -166
  435. package/src/components/FiltersPane/components/FilterValueView/index.tsx +2 -2
  436. package/src/components/FiltersPane/components/FilterWithDates/FilterWithDates.styles.ts +68 -68
  437. package/src/components/FiltersPane/components/FilterWithDates/FilterWithDates.tsx +208 -210
  438. package/src/components/FiltersPane/components/FilterWithDates/index.ts +2 -2
  439. package/src/components/FiltersPane/components/FilterWithPeriod/FilterWithPeriod.styles.ts +21 -21
  440. package/src/components/FiltersPane/components/FilterWithPeriod/FilterWithPeriod.tsx +177 -177
  441. package/src/components/FiltersPane/components/FilterWithPeriod/index.ts +2 -2
  442. package/src/components/FiltersPane/components/FilterWrapper/FilterWrapper.styles.ts +99 -99
  443. package/src/components/FiltersPane/components/FilterWrapper/FilterWrapper.tsx +149 -149
  444. package/src/components/FiltersPane/components/FilterWrapper/helpers.ts +14 -14
  445. package/src/components/FiltersPane/components/FilterWrapper/index.ts +2 -2
  446. package/src/components/FiltersPane/components/FiltersPaneSearch/FiltersPaneSearch.styles.ts +124 -123
  447. package/src/components/FiltersPane/components/FiltersPaneSearch/FiltersPaneSearch.tsx +162 -165
  448. package/src/components/FiltersPane/components/FiltersPaneSearch/index.ts +2 -2
  449. package/src/components/FiltersPane/components/index.ts +9 -9
  450. package/src/components/FiltersPane/constants.ts +137 -137
  451. package/src/components/FiltersPane/helpers.ts +26 -26
  452. package/src/components/FiltersPane/index.ts +5 -5
  453. package/src/components/FiltersPane/types.ts +157 -157
  454. package/src/components/Flag/Flag.stories.tsx +29 -29
  455. package/src/components/Flag/Flag.styles.ts +17 -17
  456. package/src/components/Flag/Flag.tsx +26 -26
  457. package/src/components/Flag/augment.d.ts +1 -1
  458. package/src/components/Flag/index.ts +2 -2
  459. package/src/components/FlexibleTable/FlexibleTable.stories.tsx +300 -300
  460. package/src/components/FlexibleTable/FlexibleTable.styles.ts +111 -111
  461. package/src/components/FlexibleTable/FlexibleTable.tsx +308 -308
  462. package/src/components/FlexibleTable/components/FlexibleTableCell/FlexibleTableCell.styles.ts +43 -43
  463. package/src/components/FlexibleTable/components/FlexibleTableCell/FlexibleTableCell.tsx +113 -113
  464. package/src/components/FlexibleTable/components/FlexibleTableCell/index.ts +2 -2
  465. package/src/components/FlexibleTable/components/FlexibleTableRow/FlexibleTableRow.styles.ts +25 -25
  466. package/src/components/FlexibleTable/components/FlexibleTableRow/FlexibleTableRow.tsx +193 -193
  467. package/src/components/FlexibleTable/components/FlexibleTableRow/index.ts +2 -2
  468. package/src/components/FlexibleTable/components/index.ts +2 -2
  469. package/src/components/FlexibleTable/constants.ts +8 -8
  470. package/src/components/FlexibleTable/helpers.ts +16 -16
  471. package/src/components/FlexibleTable/index.ts +4 -4
  472. package/src/components/FlexibleTable/types.ts +82 -82
  473. package/src/components/Icon/Icon.stories.tsx +86 -86
  474. package/src/components/Icon/Icon.styles.ts +10 -10
  475. package/src/components/Icon/Icon.tsx +26 -26
  476. package/src/components/Icon/complexIcons/augment.d.ts +1 -1
  477. package/src/components/Icon/complexIcons/avatarGreen.svg +57 -57
  478. package/src/components/Icon/complexIcons/fileExcel.svg +10 -10
  479. package/src/components/Icon/complexIcons/fileImage.svg +12 -12
  480. package/src/components/Icon/complexIcons/fileOther.svg +9 -9
  481. package/src/components/Icon/complexIcons/filePdf.svg +10 -10
  482. package/src/components/Icon/complexIcons/fileWord.svg +10 -10
  483. package/src/components/Icon/complexIcons/fileXml.svg +12 -12
  484. package/src/components/Icon/complexIcons/fileZip.svg +15 -15
  485. package/src/components/Icon/complexIcons/icons.ts +19 -19
  486. package/src/components/Icon/complexIcons/index.ts +1 -1
  487. package/src/components/Icon/components/ComplexIconBoilerplate/ComplexIconBoilerplate.tsx +16 -16
  488. package/src/components/Icon/components/ComplexIconBoilerplate/index.ts +1 -1
  489. package/src/components/Icon/components/IconBolerplate/IconBoilerplate.tsx +43 -43
  490. package/src/components/Icon/components/IconBolerplate/index.ts +1 -1
  491. package/src/components/Icon/components/index.ts +2 -2
  492. package/src/components/Icon/helpers.tsx +9 -9
  493. package/src/components/Icon/icons-list.ts +855 -855
  494. package/src/components/Icon/index.ts +5 -5
  495. package/src/components/Icon/snippet.tsx +6 -6
  496. package/src/components/Icon/types.ts +18 -18
  497. package/src/components/IconButton/IconButton.stories.tsx +32 -32
  498. package/src/components/IconButton/IconButton.styles.ts +84 -84
  499. package/src/components/IconButton/IconButton.tsx +74 -74
  500. package/src/components/IconButton/constants.ts +3 -3
  501. package/src/components/IconButton/index.ts +3 -3
  502. package/src/components/IconButton/types.ts +11 -11
  503. package/src/components/IncrementInput/IncrementInput.stories.tsx +29 -31
  504. package/src/components/IncrementInput/IncrementInput.styles.ts +78 -78
  505. package/src/components/IncrementInput/IncrementInput.tsx +105 -105
  506. package/src/components/IncrementInput/index.ts +2 -2
  507. package/src/components/Input/Input.stories.tsx +83 -91
  508. package/src/components/Input/Input.styles.ts +101 -308
  509. package/src/components/Input/Input.tsx +33 -296
  510. package/src/components/Input/InputBase.tsx +251 -0
  511. package/src/components/Input/index.ts +4 -3
  512. package/src/components/Input/types.ts +4 -33
  513. package/src/components/List/List.stories.tsx +90 -90
  514. package/src/components/List/List.styles.ts +25 -25
  515. package/src/components/List/List.tsx +68 -68
  516. package/src/components/List/components/ListItem/ListItem.styles.ts +52 -52
  517. package/src/components/List/components/ListItem/ListItem.tsx +68 -68
  518. package/src/components/List/components/ListItem/index.ts +2 -2
  519. package/src/components/List/components/index.ts +1 -1
  520. package/src/components/List/index.ts +3 -3
  521. package/src/components/Modal/Modal.stories.tsx +105 -105
  522. package/src/components/Modal/Modal.styles.ts +318 -318
  523. package/src/components/Modal/Modal.tsx +203 -203
  524. package/src/components/Modal/index.ts +3 -3
  525. package/src/components/Modal/types.ts +17 -17
  526. package/src/components/MoreMenu/MoreMenu.stories.tsx +46 -46
  527. package/src/components/MoreMenu/MoreMenu.styles.ts +69 -69
  528. package/src/components/MoreMenu/MoreMenu.tsx +93 -93
  529. package/src/components/MoreMenu/index.ts +2 -2
  530. package/src/components/MultiSelect/MultiSelect.stories.tsx +46 -46
  531. package/src/components/MultiSelect/MultiSelect.styles.ts +59 -59
  532. package/src/components/MultiSelect/MultiSelect.tsx +106 -106
  533. package/src/components/MultiSelect/components/MultiSelectInput/MultiSelectInput.styles.ts +73 -73
  534. package/src/components/MultiSelect/components/MultiSelectInput/MultiSelectInput.tsx +53 -53
  535. package/src/components/MultiSelect/components/MultiSelectInput/index.ts +2 -2
  536. package/src/components/MultiSelect/components/index.ts +1 -1
  537. package/src/components/MultiSelect/index.ts +4 -4
  538. package/src/components/MultiSelect/types.ts +1 -1
  539. package/src/components/MultiSelectList/MultiSelectList.styles.ts +138 -136
  540. package/src/components/MultiSelectList/MultiSelectList.tsx +461 -461
  541. package/src/components/MultiSelectList/constants.ts +21 -21
  542. package/src/components/MultiSelectList/helpers.ts +11 -11
  543. package/src/components/MultiSelectList/index.ts +3 -3
  544. package/src/components/MultiSelectList/types.ts +15 -15
  545. package/src/components/NewMoreMenu/NewMoreMenu.stories.tsx +74 -74
  546. package/src/components/NewMoreMenu/NewMoreMenu.styles.ts +39 -39
  547. package/src/components/NewMoreMenu/NewMoreMenu.tsx +79 -79
  548. package/src/components/NewMoreMenu/index.ts +2 -2
  549. package/src/components/Notification/Notification.stories.tsx +51 -55
  550. package/src/components/Notification/Notification.styles.ts +57 -57
  551. package/src/components/Notification/Notification.tsx +77 -77
  552. package/src/components/Notification/index.ts +3 -3
  553. package/src/components/Notification/types.ts +1 -1
  554. package/src/components/NumberInput/NumberInput.stories.tsx +33 -35
  555. package/src/components/NumberInput/NumberInput.tsx +134 -137
  556. package/src/components/NumberInput/helpers.ts +84 -84
  557. package/src/components/NumberInput/index.ts +1 -1
  558. package/src/components/PhoneInput/PhoneInput.stories.tsx +66 -70
  559. package/src/components/PhoneInput/PhoneInput.styles.ts +92 -89
  560. package/src/components/PhoneInput/PhoneInput.tsx +211 -214
  561. package/src/components/PhoneInput/components/PhoneInputCountryList/PhoneInputCountryList.stories.tsx +21 -21
  562. package/src/components/PhoneInput/components/PhoneInputCountryList/PhoneInputCountryList.styles.ts +105 -103
  563. package/src/components/PhoneInput/components/PhoneInputCountryList/PhoneInputCountryList.tsx +155 -155
  564. package/src/components/PhoneInput/components/PhoneInputCountryList/index.ts +2 -2
  565. package/src/components/PhoneInput/components/index.ts +1 -1
  566. package/src/components/PhoneInput/constants.ts +3 -3
  567. package/src/components/PhoneInput/index.ts +4 -4
  568. package/src/components/PhoneInput/types.ts +20 -16
  569. package/src/components/RadioButton/RadioButton.stories.tsx +46 -46
  570. package/src/components/RadioButton/RadioButton.styles.ts +37 -37
  571. package/src/components/RadioButton/RadioButton.tsx +57 -57
  572. package/src/components/RadioButton/index.ts +2 -2
  573. package/src/components/ScrollIntoViewIfNeeded/ScrollIntoViewIfNeeded.ts +54 -54
  574. package/src/components/ScrollIntoViewIfNeeded/constants.ts +12 -12
  575. package/src/components/ScrollIntoViewIfNeeded/index.ts +1 -1
  576. package/src/components/SearchInput/SearchInput.stories.tsx +24 -23
  577. package/src/components/SearchInput/SearchInput.styles.ts +44 -54
  578. package/src/components/SearchInput/SearchInput.tsx +49 -70
  579. package/src/components/SearchInput/index.ts +2 -2
  580. package/src/components/Select/CustomSelect.stories.tsx +250 -253
  581. package/src/components/Select/MultiSelect.stories.tsx +232 -240
  582. package/src/components/Select/Select.stories.tsx +228 -236
  583. package/src/components/Select/Select.styles.ts +139 -147
  584. package/src/components/Select/Select.tsx +628 -658
  585. package/src/components/Select/components/SelectList/SelectList.styles.ts +73 -73
  586. package/src/components/Select/components/SelectList/SelectList.tsx +152 -152
  587. package/src/components/Select/components/SelectList/index.ts +2 -2
  588. package/src/components/Select/components/SelectListItem/SelectListItem.styles.ts +14 -14
  589. package/src/components/Select/components/SelectListItem/SelectListItem.tsx +76 -76
  590. package/src/components/Select/components/SelectListItem/index.ts +1 -1
  591. package/src/components/Select/components/index.ts +2 -2
  592. package/src/components/Select/constants.ts +2 -2
  593. package/src/components/Select/helpers.ts +20 -20
  594. package/src/components/Select/index.ts +4 -4
  595. package/src/components/Select/types.ts +6 -1
  596. package/src/components/Selector/Selector.stories.tsx +62 -62
  597. package/src/components/Selector/Selector.styles.ts +165 -165
  598. package/src/components/Selector/Selector.tsx +115 -115
  599. package/src/components/Selector/index.ts +2 -2
  600. package/src/components/Selector/types.ts +12 -12
  601. package/src/components/Skeleton/Skeleton.stories.tsx +19 -19
  602. package/src/components/Skeleton/Skeleton.styles.ts +46 -46
  603. package/src/components/Skeleton/Skeleton.tsx +12 -12
  604. package/src/components/Skeleton/index.ts +2 -2
  605. package/src/components/SmartInput/SmartInput.stories.tsx +51 -52
  606. package/src/components/SmartInput/SmartInput.tsx +116 -116
  607. package/src/components/SmartInput/constants.ts +91 -91
  608. package/src/components/SmartInput/helpers.ts +26 -26
  609. package/src/components/SmartInput/index.ts +2 -2
  610. package/src/components/SmartInput/types.ts +18 -18
  611. package/src/components/Status/Status.stories.tsx +69 -73
  612. package/src/components/Status/Status.styles.ts +143 -143
  613. package/src/components/Status/Status.tsx +49 -49
  614. package/src/components/Status/constants.ts +11 -11
  615. package/src/components/Status/index.ts +3 -3
  616. package/src/components/Status/types.ts +5 -5
  617. package/src/components/Switch/Switch.stories.tsx +40 -40
  618. package/src/components/Switch/Switch.styles.ts +75 -75
  619. package/src/components/Switch/Switch.tsx +75 -75
  620. package/src/components/Switch/index.ts +3 -3
  621. package/src/components/Switch/types.ts +4 -4
  622. package/src/components/TextArea/TextArea.stories.tsx +35 -37
  623. package/src/components/TextArea/TextArea.styles.ts +82 -177
  624. package/src/components/TextArea/TextArea.tsx +161 -183
  625. package/src/components/TextArea/index.ts +3 -3
  626. package/src/components/TextArea/types.ts +6 -6
  627. package/src/components/TextButton/TextButton.stories.tsx +43 -47
  628. package/src/components/TextButton/TextButton.styles.ts +130 -130
  629. package/src/components/TextButton/TextButton.tsx +110 -110
  630. package/src/components/TextButton/constants.ts +3 -3
  631. package/src/components/TextButton/index.ts +3 -3
  632. package/src/components/TextButton/types.ts +11 -11
  633. package/src/components/TextWithInfo/TextWithInfo.stories.tsx +53 -53
  634. package/src/components/TextWithInfo/TextWithInfo.styles.ts +59 -59
  635. package/src/components/TextWithInfo/TextWithInfo.tsx +62 -62
  636. package/src/components/TextWithInfo/index.ts +2 -2
  637. package/src/components/TextWithTooltip/TextWithTooltip.stories.tsx +58 -58
  638. package/src/components/TextWithTooltip/TextWithTooltip.styles.ts +21 -21
  639. package/src/components/TextWithTooltip/TextWithTooltip.tsx +156 -156
  640. package/src/components/TextWithTooltip/index.ts +2 -2
  641. package/src/components/ThemedPreloader/ThemedPreloader.stories.tsx +41 -41
  642. package/src/components/ThemedPreloader/ThemedPreloader.styles.ts +26 -26
  643. package/src/components/ThemedPreloader/ThemedPreloader.tsx +54 -54
  644. package/src/components/ThemedPreloader/components/DefaultPreloader/DefaultPreloader.tsx +29 -29
  645. package/src/components/ThemedPreloader/components/DefaultPreloader/index.ts +1 -1
  646. package/src/components/ThemedPreloader/components/DotsPreloader/DotsPreloader.styles.ts +55 -55
  647. package/src/components/ThemedPreloader/components/DotsPreloader/DotsPreloader.tsx +15 -15
  648. package/src/components/ThemedPreloader/components/DotsPreloader/index.ts +2 -2
  649. package/src/components/ThemedPreloader/components/SvgPreloader/SvgPreloader.styles.ts +11 -11
  650. package/src/components/ThemedPreloader/components/SvgPreloader/SvgPreloader.tsx +24 -24
  651. package/src/components/ThemedPreloader/components/SvgPreloader/index.ts +2 -2
  652. package/src/components/ThemedPreloader/components/index.ts +3 -3
  653. package/src/components/ThemedPreloader/constants.ts +1 -1
  654. package/src/components/ThemedPreloader/index.ts +4 -4
  655. package/src/components/ThemedPreloader/types.ts +3 -3
  656. package/src/components/Toaster/Toaster.stories.tsx +30 -30
  657. package/src/components/Toaster/Toaster.styles.ts +60 -60
  658. package/src/components/Toaster/Toaster.tsx +96 -96
  659. package/src/components/Toaster/constants.ts +1 -1
  660. package/src/components/Toaster/index.ts +3 -3
  661. package/src/components/Toaster/types.ts +1 -1
  662. package/src/components/Tooltip/Tooltip.stories.tsx +19 -19
  663. package/src/components/Tooltip/Tooltip.styles.ts +49 -49
  664. package/src/components/Tooltip/Tooltip.tsx +35 -35
  665. package/src/components/Tooltip/index.ts +3 -3
  666. package/src/components/Tooltip/types.ts +1 -1
  667. package/src/components/WithMessages/WithMessages.stories.tsx +40 -0
  668. package/src/components/WithMessages/WithMessages.styles.ts +47 -0
  669. package/src/components/WithMessages/WithMessages.tsx +59 -0
  670. package/src/components/WithMessages/index.ts +2 -0
  671. package/src/components/WithPopup/WithPopup.stories.tsx +100 -101
  672. package/src/components/WithPopup/WithPopup.styles.ts +45 -47
  673. package/src/components/WithPopup/WithPopup.tsx +184 -210
  674. package/src/components/WithPopup/constants.ts +3 -3
  675. package/src/components/WithPopup/index.ts +2 -2
  676. package/src/components/WithPopup/types.ts +25 -32
  677. package/src/components/WithTooltip/WithTooltip.stories.tsx +56 -56
  678. package/src/components/WithTooltip/WithTooltip.styles.ts +7 -13
  679. package/src/components/WithTooltip/WithTooltip.tsx +67 -72
  680. package/src/components/WithTooltip/index.ts +2 -2
  681. package/src/components/index.ts +48 -46
  682. package/src/constants/index.ts +2 -2
  683. package/src/constants/mime-types.ts +77 -77
  684. package/src/constants/phone-info.ts +2147 -2147
  685. package/src/helpers/index.ts +3 -3
  686. package/src/helpers/misc.ts +160 -160
  687. package/src/helpers/phone.ts +91 -91
  688. package/src/helpers/popper-helpers.ts +17 -17
  689. package/src/hooks/index.ts +7 -7
  690. package/src/hooks/use-did-mount-effect.ts +18 -18
  691. package/src/hooks/use-dropdown.ts +84 -84
  692. package/src/hooks/use-is-mounted.ts +15 -15
  693. package/src/hooks/use-merged-refs.ts +4 -4
  694. package/src/hooks/use-mixed-styles.ts +14 -14
  695. package/src/hooks/use-on-click-outside.ts +77 -77
  696. package/src/hooks/use-tweak-styles.ts +57 -57
  697. package/src/index.ts +6 -6
  698. package/src/theme/Provider.tsx +21 -21
  699. package/src/theme/common.ts +175 -166
  700. package/src/theme/helpers.ts +76 -76
  701. package/src/theme/index.ts +4 -4
  702. package/src/theme/types.ts +162 -158
  703. package/src/types.ts +65 -62
  704. package/src/vite-env.d.ts +1 -1
  705. package/dist/components/Input/constants.d.ts +0 -1
  706. package/dist/components/WithPopup/helpers.d.ts +0 -2
  707. package/src/components/Input/constants.ts +0 -1
  708. package/src/components/WithPopup/helpers.ts +0 -9
@@ -1,658 +1,628 @@
1
- import {
2
- useCallback,
3
- useEffect,
4
- useMemo,
5
- useRef,
6
- useState,
7
- ChangeEvent,
8
- CSSProperties,
9
- FocusEvent,
10
- FormEvent,
11
- KeyboardEvent,
12
- MouseEvent,
13
- ReactNode,
14
- SyntheticEvent,
15
- } from 'react';
16
- import { Portal } from 'react-overlays';
17
- import clsx from 'clsx';
18
- import { debounce } from 'ts-debounce';
19
- import {
20
- createFilter,
21
- getTestId,
22
- isEmpty,
23
- isNotEmpty,
24
- isReactNodeNotEmpty,
25
- isStringNotEmpty,
26
- } from '@true-engineering/true-react-platform-helpers';
27
- import { hasExactParent } from '../../helpers';
28
- import { useDropdown, useIsMounted, useOnClickOutsideWithRef, useTweakStyles } from '../../hooks';
29
- import { IDropdownWithPopperOptions, ICommonProps } from '../../types';
30
- import { renderIcon, IIcon } from '../Icon';
31
- import { Input, IInputProps } from '../Input';
32
- import { SearchInput, ISearchInputProps } from '../SearchInput';
33
- import { SelectList } from './components';
34
- import { ALL_OPTION_INDEX, DEFAULT_OPTION_INDEX } from './constants';
35
- import {
36
- defaultCompareFunction,
37
- defaultConvertFunction,
38
- defaultIsOptionDisabled,
39
- getDefaultConvertToIdFunction,
40
- } from './helpers';
41
- import { IMultipleSelectValue } from './types';
42
- import { getInputStyles, searchInputStyles, useStyles, ISelectStyles } from './Select.styles';
43
-
44
- export interface ISelectProps<Value>
45
- extends Omit<IInputProps, 'value' | 'onChange' | 'onBlur' | 'type' | 'tweakStyles'>,
46
- ICommonProps<ISelectStyles> {
47
- header?: ReactNode;
48
- footer?: ReactNode;
49
- defaultOptionLabel?: ReactNode;
50
- allOptionsLabel?: string;
51
- noMatchesLabel?: string;
52
- loadingLabel?: ReactNode;
53
- /** @default 'normal' */
54
- optionsMode?: 'search' | 'dynamic' | 'normal';
55
- /** @default 400 */
56
- debounceTime?: number;
57
- /** @default 0 */
58
- minSymbolsCountToOpenList?: number;
59
- dropdownOptions?: IDropdownWithPopperOptions;
60
- /** @default 'chevron-down' */
61
- dropdownIcon?: IIcon;
62
- options: Value[] | Readonly<Value[]>;
63
- value: Value | undefined;
64
- /** @default true */
65
- shouldScrollToList?: boolean;
66
- isMultiSelect?: false;
67
- searchInput?: { shouldRenderInList: true } & Pick<ISearchInputProps, 'placeholder'>;
68
- isOptionDisabled?: (option: Value) => boolean;
69
- onChange: (
70
- value: Value | undefined,
71
- event:
72
- | MouseEvent<HTMLElement>
73
- | KeyboardEvent
74
- | ChangeEvent<HTMLElement>
75
- | FormEvent<HTMLElement>,
76
- ) => void; // подумать как возвращать индекс
77
- onBlur?: (event: Event | SyntheticEvent) => void;
78
- onType?: (value: string) => Promise<void>;
79
- optionsFilter?: (options: Value[], query: string) => Value[];
80
- onOpen?: () => void;
81
- compareValuesOnChange?: (v1?: Value, v2?: Value) => boolean;
82
- /** @description Функция должна быть мемоизирована с целью избежания ререндера */
83
- convertValueToString?: (value: Value) => string | undefined;
84
- /** @description Функция должна быть мемоизирована с целью избежания ререндера */
85
- convertValueToReactNode?: (value: Value, isDisabled: boolean) => ReactNode;
86
- /** @description Функция должна быть мемоизирована с целью избежания ререндера */
87
- convertValueToId?: (value: Value) => string | undefined;
88
- }
89
-
90
- export interface IMultipleSelectProps<Value>
91
- extends Omit<
92
- ISelectProps<Value>,
93
- 'value' | 'onChange' | 'compareValuesOnChange' | 'isMultiSelect'
94
- > {
95
- isMultiSelect: true;
96
- value: IMultipleSelectValue<Value> | undefined;
97
- onChange: (
98
- value: IMultipleSelectValue<Value> | undefined,
99
- event:
100
- | MouseEvent<HTMLElement>
101
- | KeyboardEvent
102
- | ChangeEvent<HTMLElement>
103
- | FormEvent<HTMLElement>,
104
- ) => void;
105
- compareValuesOnChange?: (
106
- v1?: IMultipleSelectValue<Value>,
107
- v2?: IMultipleSelectValue<Value>,
108
- ) => boolean;
109
- }
110
-
111
- export function Select<Value>(
112
- props: ISelectProps<Value> | IMultipleSelectProps<Value>,
113
- ): JSX.Element {
114
- const {
115
- options,
116
- isMultiSelect,
117
- value,
118
- header,
119
- footer,
120
- defaultOptionLabel,
121
- allOptionsLabel,
122
- debounceTime = 400,
123
- optionsMode = 'normal',
124
- noMatchesLabel,
125
- loadingLabel,
126
- tweakStyles,
127
- testId,
128
- isActive,
129
- isReadonly,
130
- isDisabled,
131
- dropdownOptions,
132
- minSymbolsCountToOpenList = 0,
133
- dropdownIcon = 'chevron-down',
134
- shouldScrollToList = true,
135
- searchInput,
136
- iconType,
137
- onChange,
138
- onFocus,
139
- onBlur,
140
- onType,
141
- onOpen,
142
- isOptionDisabled = defaultIsOptionDisabled,
143
- compareValuesOnChange = defaultCompareFunction,
144
- convertValueToString = defaultConvertFunction,
145
- convertValueToId,
146
- convertValueToReactNode,
147
- optionsFilter,
148
- ...inputProps
149
- } = props;
150
- const classes = useStyles({ theme: tweakStyles });
151
-
152
- const { shouldRenderInList: shouldRenderSearchInputInList = false, ...searchInputProps } =
153
- searchInput ?? {};
154
- const hasSearchInputInList = optionsMode !== 'normal' && shouldRenderSearchInputInList;
155
- const hasReadonlyInput = isReadonly || optionsMode === 'normal' || shouldRenderSearchInputInList;
156
-
157
- const tweakInputStyles = useTweakStyles({
158
- innerStyles: getInputStyles({ hasReadonlyInput, isMultiSelect }),
159
- tweakStyles,
160
- className: 'tweakInput',
161
- currentComponentName: 'Select',
162
- });
163
-
164
- const tweakSearchInputStyles = useTweakStyles({
165
- innerStyles: searchInputStyles,
166
- tweakStyles,
167
- className: 'tweakSearchInput',
168
- currentComponentName: 'Select',
169
- });
170
-
171
- const tweakSelectListStyles = useTweakStyles({
172
- tweakStyles,
173
- className: 'tweakSelectList',
174
- currentComponentName: 'Select',
175
- });
176
-
177
- const isMounted = useIsMounted();
178
- const [isListOpen, setIsListOpen] = useState(false);
179
- const [areOptionsLoading, setAreOptionsLoading] = useState(false);
180
- const hasDefaultOption = isReactNodeNotEmpty(defaultOptionLabel);
181
-
182
- const [focusedListCellIndex, setFocusedListCellIndex] = useState(DEFAULT_OPTION_INDEX);
183
- const [searchValue, setSearchValue] = useState('');
184
- // если мы ввели что то в строку поиска - то этот булеан будет отключаться
185
- // вынесен отдельно, из-за проблем с дебаунсом при динамич. опциях
186
- const [shouldShowDefaultOption, setShouldShowDefaultOption] = useState(true);
187
-
188
- const root = useRef<HTMLDivElement>(null);
189
- const inputWrapper = useRef<HTMLDivElement>(null);
190
- const list = useRef<HTMLDivElement>(null);
191
- const input = useRef<HTMLInputElement>(null); // TODO ref снаружи?
192
-
193
- const strValue = isMultiSelect ? value?.[0] : value;
194
- const shouldShowAllOption =
195
- isMultiSelect && isStringNotEmpty(allOptionsLabel) && searchValue === '';
196
-
197
- const filteredOptions = useMemo(() => {
198
- if (optionsMode !== 'search') {
199
- return options;
200
- }
201
-
202
- const filter =
203
- optionsFilter ?? createFilter<Value>((option) => [convertValueToString(option) ?? '']);
204
-
205
- return filter(options as Value[], searchValue);
206
- }, [optionsFilter, options, convertValueToString, searchValue, optionsMode]);
207
-
208
- const availableOptions = useMemo(
209
- () => options.filter((option) => !isOptionDisabled(option)),
210
- [options, isOptionDisabled],
211
- );
212
-
213
- const areAllOptionsSelected = isMultiSelect && value?.length === availableOptions.length;
214
- const shouldShowMultiSelectCounter =
215
- isMultiSelect && isNotEmpty(value) && value.length > 1 && !areAllOptionsSelected;
216
-
217
- const optionsIndexesForNavigation = useMemo(() => {
218
- const result: number[] = [];
219
- if (shouldShowDefaultOption && hasDefaultOption) {
220
- result.push(DEFAULT_OPTION_INDEX);
221
- }
222
- if (shouldShowAllOption) {
223
- result.push(ALL_OPTION_INDEX);
224
- }
225
- return result.concat(
226
- filteredOptions.reduce((acc, cur, i) => {
227
- if (!isOptionDisabled(cur)) {
228
- acc.push(i);
229
- }
230
- return acc;
231
- }, [] as number[]),
232
- );
233
- }, [
234
- filteredOptions,
235
- hasDefaultOption,
236
- isOptionDisabled,
237
- shouldShowAllOption,
238
- shouldShowDefaultOption,
239
- ]);
240
-
241
- const stringValue = isNotEmpty(strValue) ? convertValueToString(strValue) : undefined;
242
- // Для мультиселекта пытаемся показать "Все опции" если выбраны все опции
243
- const showedStringValue =
244
- areAllOptionsSelected && isNotEmpty(allOptionsLabel) ? allOptionsLabel : stringValue;
245
-
246
- const convertToId = useCallback(
247
- (v: Value) => (convertValueToId ?? getDefaultConvertToIdFunction(convertValueToString))(v),
248
- [convertValueToId, convertValueToString],
249
- );
250
-
251
- const getDropdownOffset = () => {
252
- if (isEmpty(input.current) || inputProps.errorPosition === 'top') {
253
- return 0;
254
- }
255
-
256
- // Высота элемента inputWrapper у компонента Input
257
- return input.current.parentElement?.offsetHeight ?? 0;
258
- };
259
-
260
- const closeList = useCallback(() => {
261
- setIsListOpen(false);
262
- setSearchValue('');
263
- setShouldShowDefaultOption(true);
264
-
265
- if (!dropdownOptions?.shouldUsePopper) {
266
- root.current?.style.removeProperty('--dropdown-offset');
267
- }
268
- }, [dropdownOptions?.shouldUsePopper]);
269
-
270
- const handleListClose = useCallback(
271
- (event: Event | SyntheticEvent) => {
272
- closeList();
273
- onBlur?.(event);
274
- },
275
- [closeList, onBlur],
276
- );
277
-
278
- const handleListOpen = () => {
279
- if (isReadonly) {
280
- return;
281
- }
282
-
283
- if (!isListOpen) {
284
- setIsListOpen(true);
285
-
286
- if (!dropdownOptions?.shouldUsePopper) {
287
- root.current?.style.setProperty('--dropdown-offset', `${getDropdownOffset()}px`);
288
- }
289
- }
290
- };
291
-
292
- const handleFocus = (event: FocusEvent<HTMLInputElement>) => {
293
- onFocus?.(event);
294
- handleListOpen();
295
- };
296
-
297
- const handleOnClick = () => {
298
- handleListOpen();
299
- };
300
-
301
- const handleBlur = (event: FocusEvent<HTMLInputElement>) => {
302
- // Когда что-то блокирует открытие листа, но блур все равно должен сработать
303
- // например minSymbolsCount
304
- if (isListOpen && !isOpen) {
305
- handleListClose(event);
306
- return;
307
- }
308
-
309
- if (
310
- !isNotEmpty(event.relatedTarget) ||
311
- !isNotEmpty(list.current) ||
312
- !isNotEmpty(inputWrapper.current)
313
- ) {
314
- return;
315
- }
316
-
317
- const isActionInsideSelect =
318
- hasExactParent(event.relatedTarget, list.current) ||
319
- hasExactParent(event.relatedTarget, inputWrapper.current);
320
-
321
- // Ничего не делаем, если клик был внутри селекта
322
- if (!isActionInsideSelect) {
323
- handleListClose(event);
324
- }
325
- };
326
-
327
- const handleChange = useCallback(
328
- (
329
- newValue: Value | IMultipleSelectValue<Value> | undefined,
330
- event:
331
- | MouseEvent<HTMLElement>
332
- | KeyboardEvent
333
- | ChangeEvent<HTMLElement>
334
- | FormEvent<HTMLElement>,
335
- ) => {
336
- // Тут беда с типами, сорри
337
- if (!compareValuesOnChange(value as never, newValue as never)) {
338
- onChange(newValue as (Value & IMultipleSelectValue<Value>) | undefined, event);
339
- }
340
- },
341
- [value, compareValuesOnChange, onChange],
342
- );
343
-
344
- const handleOptionSelect = useCallback(
345
- (index: number, event: MouseEvent<HTMLElement> | KeyboardEvent) => {
346
- handleChange(index === DEFAULT_OPTION_INDEX ? undefined : filteredOptions[index], event);
347
- handleListClose(event);
348
- input.current?.blur();
349
- },
350
- [handleChange, handleListClose, filteredOptions],
351
- );
352
-
353
- // MultiSelect
354
- const handleToggleOptionCheckbox = useCallback(
355
- (index: number, isSelected: boolean, event: ChangeEvent<HTMLElement> | KeyboardEvent) => {
356
- if (!isMultiSelect) {
357
- return;
358
- }
359
-
360
- // Если выбрана не дефолтная опция, которая сетит андеф
361
- if (index === DEFAULT_OPTION_INDEX || (index === ALL_OPTION_INDEX && !isSelected)) {
362
- handleChange(undefined, event);
363
- return;
364
- }
365
- if (index === ALL_OPTION_INDEX && isSelected) {
366
- handleChange(availableOptions as IMultipleSelectValue<Value>, event);
367
- return;
368
- }
369
- const option = filteredOptions[index];
370
- handleChange(
371
- isSelected
372
- ? // Добавляем
373
- ([...(value ?? []), option] as IMultipleSelectValue<Value>)
374
- : // Убираем
375
- value?.filter((o) => convertToId(o) !== convertToId(option)),
376
- event,
377
- );
378
- },
379
- [isMultiSelect, filteredOptions, handleChange, value, availableOptions, convertToId],
380
- );
381
-
382
- const handleOnType = useCallback(
383
- async (v: string) => {
384
- if (onType === undefined) {
385
- return;
386
- }
387
- if (isMounted()) {
388
- setAreOptionsLoading(true);
389
- }
390
- await onType(v);
391
- if (isMounted()) {
392
- setAreOptionsLoading(false);
393
- }
394
- if (optionsMode === 'dynamic') {
395
- setShouldShowDefaultOption(v === '');
396
- }
397
- },
398
- [isMounted, onType, optionsMode],
399
- );
400
-
401
- const debounceHandleOnType = useMemo(
402
- () => debounce(handleOnType, debounceTime, { isImmediate: debounceTime === 0 }),
403
- [handleOnType, debounceTime],
404
- );
405
-
406
- const handleInputChange = (v: string, event: FormEvent<HTMLElement>) => {
407
- if (onType !== undefined) {
408
- debounceHandleOnType(v);
409
- }
410
-
411
- if (optionsMode !== 'dynamic') {
412
- setShouldShowDefaultOption(v === '');
413
- }
414
-
415
- if (v === '' && !hasSearchInputInList) {
416
- handleChange(undefined, event);
417
- }
418
-
419
- setSearchValue(v);
420
- };
421
-
422
- const handleKeyDown = (event: KeyboardEvent) => {
423
- if (!isListOpen) {
424
- return;
425
- }
426
-
427
- event.stopPropagation();
428
- const curIndexInNavigation = optionsIndexesForNavigation.findIndex(
429
- (index) => index === focusedListCellIndex,
430
- );
431
-
432
- switch (event.code) {
433
- case 'Enter':
434
- case 'NumpadEnter': {
435
- let indexToSelect = focusedListCellIndex;
436
-
437
- // если осталась одна опция в списке,
438
- // то выбираем ее нажатием на enter
439
- if (indexToSelect === DEFAULT_OPTION_INDEX && filteredOptions.length === 1) {
440
- indexToSelect = 0;
441
- }
442
-
443
- if (isMultiSelect) {
444
- let isThisValueAlreadySelected: boolean | undefined;
445
- if (indexToSelect === ALL_OPTION_INDEX) {
446
- isThisValueAlreadySelected = areAllOptionsSelected;
447
- } else {
448
- // подумать над концептом реального фокуса на опциях, а не вот эти вот focusedCell
449
- const option = filteredOptions[indexToSelect];
450
- const valueIdToSelect = convertToId(option);
451
- isThisValueAlreadySelected =
452
- value?.some((opt) => convertToId(opt) === valueIdToSelect) ?? false;
453
- }
454
- handleToggleOptionCheckbox(indexToSelect, !isThisValueAlreadySelected, event);
455
- } else {
456
- handleOptionSelect(indexToSelect, event);
457
- }
458
- break;
459
- }
460
-
461
- case 'ArrowDown': {
462
- // чтобы убрать перемещение курсора в инпуте
463
- event.preventDefault();
464
- const targetIndexInNavigation =
465
- (curIndexInNavigation + 1) % optionsIndexesForNavigation.length;
466
- setFocusedListCellIndex(optionsIndexesForNavigation[targetIndexInNavigation]);
467
- break;
468
- }
469
-
470
- case 'ArrowUp': {
471
- // чтобы убрать перемещение курсора в инпуте
472
- event.preventDefault();
473
- const targetIndexInNavigation =
474
- (curIndexInNavigation - 1 + optionsIndexesForNavigation.length) %
475
- optionsIndexesForNavigation.length;
476
- setFocusedListCellIndex(optionsIndexesForNavigation[targetIndexInNavigation]);
477
- break;
478
- }
479
- }
480
- };
481
-
482
- const onArrowClick = () => {
483
- if (isListOpen) {
484
- input.current?.blur();
485
- closeList();
486
- } else {
487
- input.current?.focus();
488
- }
489
- };
490
-
491
- useOnClickOutsideWithRef(list, handleListClose, inputWrapper);
492
-
493
- const hasEnoughSymbolsToSearch = searchValue.trim().length >= minSymbolsCountToOpenList;
494
-
495
- const isOpen =
496
- // Пользователь пытается открыть лист
497
- isListOpen &&
498
- // Нам есть что показать:
499
- // Есть опции
500
- (filteredOptions.length > 0 ||
501
- // Дефолтная опция
502
- (defaultOptionLabel !== undefined && !hasEnoughSymbolsToSearch) ||
503
- // Текст "Загрузка..."
504
- inputProps.isLoading ||
505
- // Текст "Совпадений не найдено"
506
- noMatchesLabel !== undefined ||
507
- // У нас есть инпут с поиском внутри листа
508
- hasSearchInputInList) &&
509
- // Последняя проверка на случай, если мы че то ищем в опциях
510
- (optionsMode === 'normal' || hasEnoughSymbolsToSearch);
511
-
512
- // Эти значения ставятся в false по дефолту также в useDropdown
513
- const {
514
- shouldUsePopper = false,
515
- shouldRenderInBody = false,
516
- shouldHideOnScroll = false,
517
- } = dropdownOptions ?? {};
518
-
519
- const popperData = useDropdown({
520
- isOpen,
521
- onDropdownClose: handleListClose,
522
- referenceElement: input.current?.parentElement ?? inputWrapper.current,
523
- dropdownElement: list.current,
524
- options: dropdownOptions,
525
- dependenciesForPositionUpdating: [inputProps.isLoading, filteredOptions.length],
526
- });
527
-
528
- useEffect(() => {
529
- const focusedCellIndex = isNotEmpty(strValue)
530
- ? optionsIndexesForNavigation.find((index) => {
531
- const option = filteredOptions[index];
532
- return isNotEmpty(option) && convertToId(option) === convertToId(strValue);
533
- })
534
- : undefined;
535
-
536
- setFocusedListCellIndex(focusedCellIndex ?? optionsIndexesForNavigation[0]);
537
- }, [strValue, filteredOptions, optionsIndexesForNavigation, convertToId]);
538
-
539
- useEffect(() => {
540
- if (isOpen) {
541
- onOpen?.();
542
- }
543
- }, [isOpen]);
544
-
545
- const searchInputEl = hasSearchInputInList && (
546
- <SearchInput
547
- value={searchValue}
548
- onChange={handleInputChange}
549
- tweakStyles={tweakSearchInputStyles}
550
- placeholder="Поиск"
551
- {...searchInputProps}
552
- />
553
- );
554
-
555
- // Т.к. используется для проверки на пустой элемент `isReactNodeNotEmpty` внутри `SelectList`, то
556
- // он пропускает React.Fragment
557
- const customHeader = (isReactNodeNotEmpty(searchInputEl) || isReactNodeNotEmpty(header)) && (
558
- <>
559
- {searchInputEl}
560
- {header}
561
- </>
562
- );
563
-
564
- const listEl = (
565
- <div
566
- className={clsx(classes.listWrapper, {
567
- [classes.withoutPopper]: !shouldUsePopper,
568
- [classes.listWrapperInBody]: shouldRenderInBody,
569
- })}
570
- ref={list}
571
- style={popperData?.styles.popper as CSSProperties}
572
- tabIndex={0}
573
- onBlur={handleBlur} // обработка для Tab из списка
574
- {...popperData?.attributes.popper}
575
- >
576
- {isOpen && (
577
- <SelectList
578
- options={filteredOptions}
579
- defaultOptionLabel={hasDefaultOption && shouldShowDefaultOption && defaultOptionLabel}
580
- allOptionsLabel={shouldShowAllOption && allOptionsLabel}
581
- areAllOptionsSelected={areAllOptionsSelected}
582
- customListHeader={customHeader}
583
- customListFooter={footer}
584
- noMatchesLabel={noMatchesLabel}
585
- focusedIndex={focusedListCellIndex}
586
- activeValue={value}
587
- isLoading={inputProps.isLoading}
588
- loadingLabel={loadingLabel}
589
- tweakStyles={tweakSelectListStyles}
590
- testId={getTestId(testId, 'list')}
591
- isMultiSelect={isMultiSelect}
592
- // скролл не работает с включеным поппером
593
- shouldScrollToList={shouldScrollToList && !shouldUsePopper && !shouldHideOnScroll}
594
- isOptionDisabled={isOptionDisabled}
595
- convertValueToString={convertValueToString}
596
- convertValueToReactNode={convertValueToReactNode}
597
- convertValueToId={convertToId}
598
- onOptionSelect={handleOptionSelect}
599
- onToggleCheckbox={handleToggleOptionCheckbox}
600
- />
601
- )}
602
- </div>
603
- );
604
-
605
- const multiSelectCounterWithIcon =
606
- shouldShowMultiSelectCounter || isNotEmpty(iconType) ? (
607
- <>
608
- {shouldShowMultiSelectCounter && (
609
- <div className={classes.counter}>(+{value.length - 1})</div>
610
- )}
611
- {isNotEmpty(iconType) && <div className={classes.icon}>{renderIcon(iconType)}</div>}
612
- </>
613
- ) : undefined;
614
-
615
- return (
616
- <div className={classes.root} onKeyDown={handleKeyDown} ref={root}>
617
- <div
618
- className={clsx(classes.inputWrapper, isDisabled && classes.disabled)}
619
- onClick={isDisabled || isReadonly ? undefined : handleOnClick}
620
- ref={inputWrapper}
621
- >
622
- <Input
623
- value={
624
- searchValue !== '' && !shouldRenderSearchInputInList ? searchValue : showedStringValue
625
- }
626
- onChange={handleInputChange}
627
- isActive={isListOpen || isActive}
628
- isReadonly={hasReadonlyInput}
629
- onFocus={handleFocus}
630
- onBlur={handleBlur}
631
- isDisabled={isDisabled}
632
- ref={input}
633
- isLoading={areOptionsLoading}
634
- tweakStyles={tweakInputStyles}
635
- testId={testId}
636
- iconType={isMultiSelect ? multiSelectCounterWithIcon : iconType}
637
- {...inputProps}
638
- />
639
- <div
640
- onMouseDown={(event: MouseEvent) => {
641
- event.preventDefault();
642
- }}
643
- onClick={onArrowClick}
644
- className={clsx(classes.arrow, isOpen && classes.activeArrow)}
645
- >
646
- {renderIcon(dropdownIcon)}
647
- </div>
648
- </div>
649
- {shouldUsePopper ? (
650
- <Portal container={shouldRenderInBody ? document.body : inputWrapper.current}>
651
- <>{listEl}</>
652
- </Portal>
653
- ) : (
654
- <>{isOpen && listEl}</>
655
- )}
656
- </div>
657
- );
658
- }
1
+ import {
2
+ ChangeEvent,
3
+ CSSProperties,
4
+ FocusEvent,
5
+ KeyboardEvent,
6
+ MouseEvent,
7
+ ReactNode,
8
+ SyntheticEvent,
9
+ useCallback,
10
+ useEffect,
11
+ useMemo,
12
+ useRef,
13
+ useState,
14
+ } from 'react';
15
+ import { Portal } from 'react-overlays';
16
+ import clsx from 'clsx';
17
+ import { debounce } from 'ts-debounce';
18
+ import {
19
+ createFilter,
20
+ getTestId,
21
+ isNotEmpty,
22
+ isReactNodeNotEmpty,
23
+ isStringNotEmpty,
24
+ } from '@true-engineering/true-react-platform-helpers';
25
+ import { hasExactParent } from '../../helpers';
26
+ import { useDropdown, useIsMounted, useOnClickOutsideWithRef, useTweakStyles } from '../../hooks';
27
+ import { ICommonProps, IDropdownWithPopperOptions } from '../../types';
28
+ import { IIcon, renderIcon } from '../Icon';
29
+ import { IChangeInputEvent, IInputProps, InputBase } from '../Input';
30
+ import { ISearchInputProps, SearchInput } from '../SearchInput';
31
+ import { WithMessages } from '../WithMessages';
32
+ import { SelectList } from './components';
33
+ import { ALL_OPTION_INDEX, DEFAULT_OPTION_INDEX } from './constants';
34
+ import {
35
+ defaultCompareFunction,
36
+ defaultConvertFunction,
37
+ defaultIsOptionDisabled,
38
+ getDefaultConvertToIdFunction,
39
+ } from './helpers';
40
+ import { IChangeSelectEvent, IMultipleSelectValue } from './types';
41
+ import { getInputStyles, ISelectStyles, useStyles } from './Select.styles';
42
+
43
+ export interface ISelectProps<Value>
44
+ extends Omit<IInputProps, 'value' | 'onChange' | 'onBlur' | 'type' | 'tweakStyles'>,
45
+ ICommonProps<ISelectStyles> {
46
+ header?: ReactNode;
47
+ footer?: ReactNode;
48
+ defaultOptionLabel?: ReactNode;
49
+ allOptionsLabel?: string;
50
+ noMatchesLabel?: string;
51
+ loadingLabel?: ReactNode;
52
+ /** @default 'normal' */
53
+ optionsMode?: 'search' | 'dynamic' | 'normal';
54
+ /** @default 400 */
55
+ debounceTime?: number;
56
+ /** @default 0 */
57
+ minSymbolsCountToOpenList?: number;
58
+ dropdownOptions?: IDropdownWithPopperOptions;
59
+ /** @default 'chevron-down' */
60
+ dropdownIcon?: IIcon;
61
+ options: Value[] | Readonly<Value[]>;
62
+ value: Value | undefined;
63
+ /** @default true */
64
+ shouldScrollToList?: boolean;
65
+ isMultiSelect?: false;
66
+ searchInput?: { shouldRenderInList: true } & Pick<ISearchInputProps, 'placeholder'>;
67
+ isOptionDisabled?: (option: Value) => boolean;
68
+ onChange: (value: Value | undefined, event: IChangeSelectEvent) => void; // подумать как возвращать индекс
69
+ onBlur?: (event: Event | SyntheticEvent) => void;
70
+ onType?: (value: string) => Promise<void>;
71
+ optionsFilter?: (options: Value[], query: string) => Value[];
72
+ onOpen?: () => void;
73
+ compareValuesOnChange?: (v1?: Value, v2?: Value) => boolean;
74
+ /** @description Функция должна быть мемоизирована с целью избежания ререндера */
75
+ convertValueToString?: (value: Value) => string | undefined;
76
+ /** @description Функция должна быть мемоизирована с целью избежания ререндера */
77
+ convertValueToReactNode?: (value: Value, isDisabled: boolean) => ReactNode;
78
+ /** @description Функция должна быть мемоизирована с целью избежания ререндера */
79
+ convertValueToId?: (value: Value) => string | undefined;
80
+ }
81
+
82
+ export interface IMultipleSelectProps<Value>
83
+ extends Omit<
84
+ ISelectProps<Value>,
85
+ 'value' | 'onChange' | 'compareValuesOnChange' | 'isMultiSelect'
86
+ > {
87
+ isMultiSelect: true;
88
+ value: IMultipleSelectValue<Value> | undefined;
89
+ onChange: (value: IMultipleSelectValue<Value> | undefined, event: IChangeSelectEvent) => void;
90
+ compareValuesOnChange?: (
91
+ v1?: IMultipleSelectValue<Value>,
92
+ v2?: IMultipleSelectValue<Value>,
93
+ ) => boolean;
94
+ }
95
+
96
+ export function Select<Value>(
97
+ props: ISelectProps<Value> | IMultipleSelectProps<Value>,
98
+ ): JSX.Element {
99
+ const {
100
+ options,
101
+ isMultiSelect,
102
+ value,
103
+ header,
104
+ footer,
105
+ defaultOptionLabel,
106
+ allOptionsLabel,
107
+ debounceTime = 400,
108
+ optionsMode = 'normal',
109
+ noMatchesLabel,
110
+ loadingLabel,
111
+ tweakStyles,
112
+ testId,
113
+ isActive,
114
+ isReadonly,
115
+ isDisabled,
116
+ dropdownOptions,
117
+ minSymbolsCountToOpenList = 0,
118
+ dropdownIcon = 'chevron-down',
119
+ shouldScrollToList = true,
120
+ searchInput,
121
+ icon,
122
+ onChange,
123
+ onFocus,
124
+ onBlur,
125
+ onType,
126
+ onOpen,
127
+ isOptionDisabled = defaultIsOptionDisabled,
128
+ compareValuesOnChange = defaultCompareFunction,
129
+ convertValueToString = defaultConvertFunction,
130
+ convertValueToId,
131
+ convertValueToReactNode,
132
+ optionsFilter,
133
+ infoMessage,
134
+ errorMessage,
135
+ ...inputProps
136
+ } = props;
137
+ const classes = useStyles({ theme: tweakStyles });
138
+
139
+ const { shouldRenderInList: shouldRenderSearchInputInList = false, ...searchInputProps } =
140
+ searchInput ?? {};
141
+ const hasSearchInputInList = optionsMode !== 'normal' && shouldRenderSearchInputInList;
142
+ const hasReadonlyInput = isReadonly || optionsMode === 'normal' || shouldRenderSearchInputInList;
143
+
144
+ const tweakWithMessagesStyles = useTweakStyles({
145
+ tweakStyles,
146
+ className: 'tweakWithMessages',
147
+ currentComponentName: 'Select',
148
+ });
149
+
150
+ const tweakInputStyles = useTweakStyles({
151
+ innerStyles: getInputStyles({ hasReadonlyInput, isMultiSelect }),
152
+ tweakStyles,
153
+ className: 'tweakInput',
154
+ currentComponentName: 'Select',
155
+ });
156
+
157
+ const tweakSearchInputStyles = useTweakStyles({
158
+ tweakStyles,
159
+ className: 'tweakSearchInput',
160
+ currentComponentName: 'Select',
161
+ });
162
+
163
+ const tweakSelectListStyles = useTweakStyles({
164
+ tweakStyles,
165
+ className: 'tweakSelectList',
166
+ currentComponentName: 'Select',
167
+ });
168
+
169
+ const isMounted = useIsMounted();
170
+ const [isListOpen, setIsListOpen] = useState(false);
171
+ const [areOptionsLoading, setAreOptionsLoading] = useState(false);
172
+ const hasDefaultOption = isReactNodeNotEmpty(defaultOptionLabel);
173
+
174
+ const [focusedListCellIndex, setFocusedListCellIndex] = useState(DEFAULT_OPTION_INDEX);
175
+ const [searchValue, setSearchValue] = useState('');
176
+ // если мы ввели что то в строку поиска - то этот булеан будет отключаться
177
+ // вынесен отдельно, из-за проблем с дебаунсом при динамич. опциях
178
+ const [shouldShowDefaultOption, setShouldShowDefaultOption] = useState(true);
179
+
180
+ const root = useRef<HTMLDivElement>(null);
181
+ const inputWrapper = useRef<HTMLDivElement>(null);
182
+ const list = useRef<HTMLDivElement>(null);
183
+ const input = useRef<HTMLInputElement>(null); // TODO ref снаружи?
184
+
185
+ const strValue = isMultiSelect ? value?.[0] : value;
186
+ const shouldShowAllOption =
187
+ isMultiSelect && isStringNotEmpty(allOptionsLabel) && searchValue === '';
188
+
189
+ const filteredOptions = useMemo(() => {
190
+ if (optionsMode !== 'search') {
191
+ return options;
192
+ }
193
+
194
+ const filter =
195
+ optionsFilter ?? createFilter<Value>((option) => [convertValueToString(option) ?? '']);
196
+
197
+ return filter(options as Value[], searchValue);
198
+ }, [optionsFilter, options, convertValueToString, searchValue, optionsMode]);
199
+
200
+ const availableOptions = useMemo(
201
+ () => options.filter((option) => !isOptionDisabled(option)),
202
+ [options, isOptionDisabled],
203
+ );
204
+
205
+ const areAllOptionsSelected = isMultiSelect && value?.length === availableOptions.length;
206
+ const shouldShowMultiSelectCounter =
207
+ isMultiSelect && isNotEmpty(value) && value.length > 1 && !areAllOptionsSelected;
208
+
209
+ const optionsIndexesForNavigation = useMemo(() => {
210
+ const result: number[] = [];
211
+ if (shouldShowDefaultOption && hasDefaultOption) {
212
+ result.push(DEFAULT_OPTION_INDEX);
213
+ }
214
+ if (shouldShowAllOption) {
215
+ result.push(ALL_OPTION_INDEX);
216
+ }
217
+ return result.concat(
218
+ filteredOptions.reduce((acc, cur, i) => {
219
+ if (!isOptionDisabled(cur)) {
220
+ acc.push(i);
221
+ }
222
+ return acc;
223
+ }, [] as number[]),
224
+ );
225
+ }, [
226
+ filteredOptions,
227
+ hasDefaultOption,
228
+ isOptionDisabled,
229
+ shouldShowAllOption,
230
+ shouldShowDefaultOption,
231
+ ]);
232
+
233
+ const stringValue = isNotEmpty(strValue) ? convertValueToString(strValue) : undefined;
234
+ // Для мультиселекта пытаемся показать "Все опции" если выбраны все опции
235
+ const showedStringValue =
236
+ areAllOptionsSelected && isNotEmpty(allOptionsLabel) ? allOptionsLabel : stringValue;
237
+
238
+ const convertToId = useCallback(
239
+ (v: Value) => (convertValueToId ?? getDefaultConvertToIdFunction(convertValueToString))(v),
240
+ [convertValueToId, convertValueToString],
241
+ );
242
+
243
+ const closeList = useCallback(() => {
244
+ setIsListOpen(false);
245
+ setSearchValue('');
246
+ setShouldShowDefaultOption(true);
247
+ }, [dropdownOptions?.shouldUsePopper]);
248
+
249
+ const handleListClose = useCallback(
250
+ (event: Event | SyntheticEvent) => {
251
+ closeList();
252
+ onBlur?.(event);
253
+ },
254
+ [closeList, onBlur],
255
+ );
256
+
257
+ const handleListOpen = () => {
258
+ if (!isReadonly && !isListOpen) {
259
+ setIsListOpen(true);
260
+ }
261
+ };
262
+
263
+ const handleFocus = (event: FocusEvent<HTMLInputElement>) => {
264
+ onFocus?.(event);
265
+ handleListOpen();
266
+ };
267
+
268
+ const handleOnClick = () => {
269
+ handleListOpen();
270
+ };
271
+
272
+ const handleBlur = (event: FocusEvent<HTMLInputElement>) => {
273
+ // Когда что-то блокирует открытие листа, но блур все равно должен сработать
274
+ // например minSymbolsCount
275
+ if (isListOpen && !isOpen) {
276
+ handleListClose(event);
277
+ return;
278
+ }
279
+
280
+ if (
281
+ !isNotEmpty(event.relatedTarget) ||
282
+ !isNotEmpty(list.current) ||
283
+ !isNotEmpty(inputWrapper.current)
284
+ ) {
285
+ return;
286
+ }
287
+
288
+ const isActionInsideSelect =
289
+ hasExactParent(event.relatedTarget, list.current) ||
290
+ hasExactParent(event.relatedTarget, inputWrapper.current);
291
+
292
+ // Ничего не делаем, если клик был внутри селекта
293
+ if (!isActionInsideSelect) {
294
+ handleListClose(event);
295
+ }
296
+ };
297
+
298
+ const handleChange = useCallback(
299
+ (newValue: Value | IMultipleSelectValue<Value> | undefined, event: IChangeSelectEvent) => {
300
+ // Тут беда с типами, сорри
301
+ if (!compareValuesOnChange(value as never, newValue as never)) {
302
+ onChange(newValue as (Value & IMultipleSelectValue<Value>) | undefined, event);
303
+ }
304
+ },
305
+ [value, compareValuesOnChange, onChange],
306
+ );
307
+
308
+ const handleOptionSelect = useCallback(
309
+ (index: number, event: MouseEvent<HTMLElement> | KeyboardEvent) => {
310
+ handleChange(index === DEFAULT_OPTION_INDEX ? undefined : filteredOptions[index], event);
311
+ handleListClose(event);
312
+ input.current?.blur();
313
+ },
314
+ [handleChange, handleListClose, filteredOptions],
315
+ );
316
+
317
+ // MultiSelect
318
+ const handleToggleOptionCheckbox = useCallback(
319
+ (index: number, isSelected: boolean, event: ChangeEvent<HTMLElement> | KeyboardEvent) => {
320
+ if (!isMultiSelect) {
321
+ return;
322
+ }
323
+
324
+ // Если выбрана не дефолтная опция, которая сетит андеф
325
+ if (index === DEFAULT_OPTION_INDEX || (index === ALL_OPTION_INDEX && !isSelected)) {
326
+ handleChange(undefined, event);
327
+ return;
328
+ }
329
+ if (index === ALL_OPTION_INDEX && isSelected) {
330
+ handleChange(availableOptions as IMultipleSelectValue<Value>, event);
331
+ return;
332
+ }
333
+ const option = filteredOptions[index];
334
+ handleChange(
335
+ isSelected
336
+ ? // Добавляем
337
+ ([...(value ?? []), option] as IMultipleSelectValue<Value>)
338
+ : // Убираем
339
+ value?.filter((o) => convertToId(o) !== convertToId(option)),
340
+ event,
341
+ );
342
+ },
343
+ [isMultiSelect, filteredOptions, handleChange, value, availableOptions, convertToId],
344
+ );
345
+
346
+ const handleOnType = useCallback(
347
+ async (v: string) => {
348
+ if (onType === undefined) {
349
+ return;
350
+ }
351
+ if (isMounted()) {
352
+ setAreOptionsLoading(true);
353
+ }
354
+ await onType(v);
355
+ if (isMounted()) {
356
+ setAreOptionsLoading(false);
357
+ }
358
+ if (optionsMode === 'dynamic') {
359
+ setShouldShowDefaultOption(v === '');
360
+ }
361
+ },
362
+ [isMounted, onType, optionsMode],
363
+ );
364
+
365
+ const debounceHandleOnType = useMemo(
366
+ () => debounce(handleOnType, debounceTime, { isImmediate: debounceTime === 0 }),
367
+ [handleOnType, debounceTime],
368
+ );
369
+
370
+ const handleInputChange = (v: string, event: IChangeInputEvent) => {
371
+ if (onType !== undefined) {
372
+ debounceHandleOnType(v);
373
+ }
374
+
375
+ if (optionsMode !== 'dynamic') {
376
+ setShouldShowDefaultOption(v === '');
377
+ }
378
+
379
+ if (v === '' && !hasSearchInputInList) {
380
+ handleChange(undefined, event);
381
+ }
382
+
383
+ setSearchValue(v);
384
+ };
385
+
386
+ const handleKeyDown = (event: KeyboardEvent) => {
387
+ if (!isListOpen) {
388
+ return;
389
+ }
390
+
391
+ event.stopPropagation();
392
+ const curIndexInNavigation = optionsIndexesForNavigation.findIndex(
393
+ (index) => index === focusedListCellIndex,
394
+ );
395
+
396
+ switch (event.code) {
397
+ case 'Enter':
398
+ case 'NumpadEnter': {
399
+ let indexToSelect = focusedListCellIndex;
400
+
401
+ // если осталась одна опция в списке,
402
+ // то выбираем ее нажатием на enter
403
+ if (indexToSelect === DEFAULT_OPTION_INDEX && filteredOptions.length === 1) {
404
+ indexToSelect = 0;
405
+ }
406
+
407
+ if (isMultiSelect) {
408
+ let isThisValueAlreadySelected: boolean | undefined;
409
+ if (indexToSelect === ALL_OPTION_INDEX) {
410
+ isThisValueAlreadySelected = areAllOptionsSelected;
411
+ } else {
412
+ // подумать над концептом реального фокуса на опциях, а не вот эти вот focusedCell
413
+ const option = filteredOptions[indexToSelect];
414
+ const valueIdToSelect = convertToId(option);
415
+ isThisValueAlreadySelected =
416
+ value?.some((opt) => convertToId(opt) === valueIdToSelect) ?? false;
417
+ }
418
+ handleToggleOptionCheckbox(indexToSelect, !isThisValueAlreadySelected, event);
419
+ } else {
420
+ handleOptionSelect(indexToSelect, event);
421
+ }
422
+ break;
423
+ }
424
+
425
+ case 'ArrowDown': {
426
+ // чтобы убрать перемещение курсора в инпуте
427
+ event.preventDefault();
428
+ const targetIndexInNavigation =
429
+ (curIndexInNavigation + 1) % optionsIndexesForNavigation.length;
430
+ setFocusedListCellIndex(optionsIndexesForNavigation[targetIndexInNavigation]);
431
+ break;
432
+ }
433
+
434
+ case 'ArrowUp': {
435
+ // чтобы убрать перемещение курсора в инпуте
436
+ event.preventDefault();
437
+ const targetIndexInNavigation =
438
+ (curIndexInNavigation - 1 + optionsIndexesForNavigation.length) %
439
+ optionsIndexesForNavigation.length;
440
+ setFocusedListCellIndex(optionsIndexesForNavigation[targetIndexInNavigation]);
441
+ break;
442
+ }
443
+ }
444
+ };
445
+
446
+ const onArrowClick = () => {
447
+ if (isListOpen) {
448
+ input.current?.blur();
449
+ closeList();
450
+ } else {
451
+ input.current?.focus();
452
+ }
453
+ };
454
+
455
+ useOnClickOutsideWithRef(list, handleListClose, inputWrapper);
456
+
457
+ const hasEnoughSymbolsToSearch = searchValue.trim().length >= minSymbolsCountToOpenList;
458
+
459
+ const isOpen =
460
+ // Пользователь пытается открыть лист
461
+ isListOpen &&
462
+ // Нам есть что показать:
463
+ // Есть опции
464
+ (filteredOptions.length > 0 ||
465
+ // Дефолтная опция
466
+ (defaultOptionLabel !== undefined && !hasEnoughSymbolsToSearch) ||
467
+ // Текст "Загрузка..."
468
+ inputProps.isLoading ||
469
+ // Текст "Совпадений не найдено"
470
+ noMatchesLabel !== undefined ||
471
+ // У нас есть инпут с поиском внутри листа
472
+ hasSearchInputInList) &&
473
+ // Последняя проверка на случай, если мы че то ищем в опциях
474
+ (optionsMode === 'normal' || hasEnoughSymbolsToSearch);
475
+
476
+ // Эти значения ставятся в false по дефолту также в useDropdown
477
+ const {
478
+ shouldUsePopper = false,
479
+ shouldRenderInBody = false,
480
+ shouldHideOnScroll = false,
481
+ } = dropdownOptions ?? {};
482
+
483
+ const popperData = useDropdown({
484
+ isOpen,
485
+ onDropdownClose: handleListClose,
486
+ referenceElement: input.current?.parentElement ?? inputWrapper.current,
487
+ dropdownElement: list.current,
488
+ options: dropdownOptions,
489
+ dependenciesForPositionUpdating: [inputProps.isLoading, filteredOptions.length],
490
+ });
491
+
492
+ useEffect(() => {
493
+ const focusedCellIndex = isNotEmpty(strValue)
494
+ ? optionsIndexesForNavigation.find((index) => {
495
+ const option = filteredOptions[index];
496
+ return isNotEmpty(option) && convertToId(option) === convertToId(strValue);
497
+ })
498
+ : undefined;
499
+
500
+ setFocusedListCellIndex(focusedCellIndex ?? optionsIndexesForNavigation[0]);
501
+ }, [strValue, filteredOptions, optionsIndexesForNavigation, convertToId]);
502
+
503
+ useEffect(() => {
504
+ if (isOpen) {
505
+ onOpen?.();
506
+ }
507
+ }, [isOpen]);
508
+
509
+ const searchInputEl = hasSearchInputInList && (
510
+ <SearchInput
511
+ value={searchValue}
512
+ onChange={handleInputChange}
513
+ tweakStyles={tweakSearchInputStyles}
514
+ placeholder="Поиск"
515
+ {...searchInputProps}
516
+ />
517
+ );
518
+
519
+ // Т.к. используется для проверки на пустой элемент `isReactNodeNotEmpty` внутри `SelectList`, то
520
+ // он пропускает React.Fragment
521
+ const customHeader = (isReactNodeNotEmpty(searchInputEl) || isReactNodeNotEmpty(header)) && (
522
+ <>
523
+ {searchInputEl}
524
+ {header}
525
+ </>
526
+ );
527
+
528
+ const listEl = (
529
+ <div
530
+ className={clsx(classes.listWrapper, {
531
+ [classes.withoutPopper]: !shouldUsePopper,
532
+ [classes.listWrapperInBody]: shouldRenderInBody,
533
+ })}
534
+ ref={list}
535
+ style={popperData?.styles.popper as CSSProperties}
536
+ tabIndex={0}
537
+ onBlur={handleBlur} // обработка для Tab из списка
538
+ {...popperData?.attributes.popper}
539
+ >
540
+ {isOpen && (
541
+ <SelectList
542
+ options={filteredOptions}
543
+ defaultOptionLabel={hasDefaultOption && shouldShowDefaultOption && defaultOptionLabel}
544
+ allOptionsLabel={shouldShowAllOption && allOptionsLabel}
545
+ areAllOptionsSelected={areAllOptionsSelected}
546
+ customListHeader={customHeader}
547
+ customListFooter={footer}
548
+ noMatchesLabel={noMatchesLabel}
549
+ focusedIndex={focusedListCellIndex}
550
+ activeValue={value}
551
+ isLoading={inputProps.isLoading}
552
+ loadingLabel={loadingLabel}
553
+ tweakStyles={tweakSelectListStyles}
554
+ testId={getTestId(testId, 'list')}
555
+ isMultiSelect={isMultiSelect}
556
+ // скролл не работает с включеным поппером
557
+ shouldScrollToList={shouldScrollToList && !shouldUsePopper && !shouldHideOnScroll}
558
+ isOptionDisabled={isOptionDisabled}
559
+ convertValueToString={convertValueToString}
560
+ convertValueToReactNode={convertValueToReactNode}
561
+ convertValueToId={convertToId}
562
+ onOptionSelect={handleOptionSelect}
563
+ onToggleCheckbox={handleToggleOptionCheckbox}
564
+ />
565
+ )}
566
+ </div>
567
+ );
568
+
569
+ const multiSelectCounterWithIcon =
570
+ shouldShowMultiSelectCounter || isNotEmpty(icon) ? (
571
+ <div className={classes.iconWrapper}>
572
+ {shouldShowMultiSelectCounter && (
573
+ <div className={classes.counter}>(+{value.length - 1})</div>
574
+ )}
575
+ {isNotEmpty(icon) && <div className={classes.icon}>{renderIcon(icon)}</div>}
576
+ </div>
577
+ ) : undefined;
578
+
579
+ return (
580
+ <WithMessages
581
+ errorMessage={errorMessage}
582
+ infoMessage={infoMessage}
583
+ tweakStyles={tweakWithMessagesStyles}
584
+ >
585
+ <div className={classes.root} onKeyDown={handleKeyDown} ref={root}>
586
+ <div
587
+ className={clsx(classes.inputWrapper, isDisabled && classes.disabled)}
588
+ onClick={isDisabled || isReadonly ? undefined : handleOnClick}
589
+ ref={inputWrapper}
590
+ >
591
+ <InputBase
592
+ value={
593
+ searchValue !== '' && !shouldRenderSearchInputInList ? searchValue : showedStringValue
594
+ }
595
+ onChange={handleInputChange}
596
+ isActive={isListOpen || isActive}
597
+ isReadonly={hasReadonlyInput}
598
+ onFocus={handleFocus}
599
+ onBlur={handleBlur}
600
+ isDisabled={isDisabled}
601
+ ref={input}
602
+ isLoading={areOptionsLoading}
603
+ tweakStyles={tweakInputStyles}
604
+ testId={testId}
605
+ icon={isMultiSelect ? multiSelectCounterWithIcon : icon}
606
+ {...inputProps}
607
+ />
608
+ <div
609
+ onMouseDown={(event: MouseEvent) => {
610
+ event.preventDefault();
611
+ }}
612
+ onClick={onArrowClick}
613
+ className={clsx(classes.arrow, isOpen && classes.activeArrow)}
614
+ >
615
+ {renderIcon(dropdownIcon)}
616
+ </div>
617
+ </div>
618
+ {shouldUsePopper ? (
619
+ <Portal container={shouldRenderInBody ? document.body : inputWrapper.current}>
620
+ <>{listEl}</>
621
+ </Portal>
622
+ ) : (
623
+ <>{isOpen && listEl}</>
624
+ )}
625
+ </div>
626
+ </WithMessages>
627
+ );
628
+ }