@true-engineering/true-react-common-ui-kit 3.7.0 → 3.8.1

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