@jetbrains/ring-ui 5.1.1 → 6.0.1-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (702) hide show
  1. package/README.md +1 -6
  2. package/components/alert/alert.d.ts +1 -1
  3. package/components/alert/container.css +3 -0
  4. package/components/alert-service/alert-service.d.ts +2 -2
  5. package/components/analytics/analytics.d.ts +21 -7
  6. package/components/analytics/analytics.js +19 -24
  7. package/components/analytics/analytics__custom-plugin.d.ts +6 -16
  8. package/components/analytics/analytics__custom-plugin.js +12 -52
  9. package/components/analytics/analytics__fus-plugin.d.ts +15 -25
  10. package/components/analytics/analytics__fus-plugin.js +15 -73
  11. package/components/analytics/analytics__ga-plugin.d.ts +13 -3
  12. package/components/analytics/analytics__ga-plugin.js +35 -5
  13. package/components/analytics/analytics__plugin-utils.d.ts +16 -0
  14. package/components/analytics/analytics__plugin-utils.js +26 -1
  15. package/components/auth/auth__core.d.ts +5 -4
  16. package/components/auth/auth__core.js +44 -27
  17. package/components/auth-dialog/auth-dialog.d.ts +2 -2
  18. package/components/auth-dialog/auth-dialog.js +3 -1
  19. package/components/auth-dialog-service/auth-dialog-service.js +4 -1
  20. package/components/avatar/avatar.d.ts +3 -3
  21. package/components/avatar/fallback-avatar.d.ts +2 -2
  22. package/components/avatar/fallback-avatar.js +2 -1
  23. package/components/avatar-editor-ng/avatar-editor-ng.css +1 -1
  24. package/components/badge/badge.d.ts +2 -2
  25. package/components/button/button.css +7 -7
  26. package/components/button/button.d.ts +3 -4
  27. package/components/button/button.js +0 -1
  28. package/components/button-group/button-group.css +2 -2
  29. package/components/button-group/button-group.d.ts +2 -2
  30. package/components/button-group/caption.d.ts +2 -2
  31. package/components/button-ng/button-ng.examples.js +2 -2
  32. package/components/button-ng/button-ng.js +1 -1
  33. package/components/button-set/button-set.d.ts +2 -2
  34. package/components/button-toolbar/button-toolbar.d.ts +2 -2
  35. package/components/checkbox/checkbox.css +2 -2
  36. package/components/checkbox/checkbox.d.ts +2 -2
  37. package/components/code/code.d.ts +1 -1
  38. package/components/confirm/confirm.d.ts +1 -1
  39. package/components/confirm/confirm.js +3 -3
  40. package/components/confirm-ng/confirm-ng.examples.js +1 -1
  41. package/components/confirm-service/confirm-service.js +2 -2
  42. package/components/content-layout/content-layout.d.ts +2 -2
  43. package/components/content-layout/sidebar.d.ts +2 -2
  44. package/components/contenteditable/contenteditable.d.ts +3 -3
  45. package/components/control-label/control-label.css +23 -0
  46. package/components/control-label/control-label.d.ts +11 -0
  47. package/components/control-label/control-label.js +22 -0
  48. package/components/data-list/data-list.css +2 -1
  49. package/components/data-list/data-list.d.ts +3 -3
  50. package/components/data-list/data-list.mock.d.ts +2 -2
  51. package/components/data-list/item.d.ts +3 -3
  52. package/components/data-list/title.d.ts +1 -1
  53. package/components/date-picker/consts.d.ts +5 -5
  54. package/components/date-picker/date-input.d.ts +3 -12
  55. package/components/date-picker/date-input.js +9 -15
  56. package/components/date-picker/date-picker.css +1 -1
  57. package/components/date-picker/date-picker.d.ts +8 -6
  58. package/components/date-picker/date-picker.js +9 -15
  59. package/components/date-picker/date-popup.d.ts +1 -1
  60. package/components/date-picker/date-popup.js +2 -1
  61. package/components/date-picker/day.d.ts +2 -2
  62. package/components/date-picker/month-names.d.ts +2 -2
  63. package/components/date-picker/month-names.js +2 -2
  64. package/components/date-picker/month-slider.d.ts +2 -2
  65. package/components/date-picker/month.d.ts +2 -2
  66. package/components/date-picker/months.d.ts +2 -2
  67. package/components/date-picker/months.js +46 -29
  68. package/components/date-picker/weekdays.d.ts +2 -2
  69. package/components/date-picker/years.d.ts +6 -2
  70. package/components/date-picker/years.js +26 -14
  71. package/components/dialog/dialog.css +1 -1
  72. package/components/dialog/dialog.d.ts +4 -16
  73. package/components/dialog/dialog.js +4 -2
  74. package/components/dialog-ng/dialog-ng.examples.js +1 -1
  75. package/components/dialog-ng/dialog-ng.js +4 -5
  76. package/components/dropdown/anchor.d.ts +1 -1
  77. package/components/dropdown/dropdown.d.ts +8 -1
  78. package/components/editable-heading/editable-heading.css +20 -7
  79. package/components/editable-heading/editable-heading.d.ts +2 -2
  80. package/components/editable-heading/editable-heading.js +39 -12
  81. package/components/error-bubble/error-bubble.d.ts +2 -2
  82. package/components/error-message/error-message.d.ts +2 -2
  83. package/components/footer/footer.js +1 -0
  84. package/components/form/form.examples.js +1 -0
  85. package/components/global/angular-component-factory.js +13 -7
  86. package/components/global/angular-component-factory.test.js +30 -10
  87. package/components/global/controls-height.d.ts +2 -0
  88. package/components/global/controls-height.js +8 -0
  89. package/components/global/create-stateful-context.d.ts +1 -1
  90. package/components/global/focus-sensor-hoc.d.ts +1 -0
  91. package/components/global/focus-sensor-hoc.js +5 -4
  92. package/components/global/react-dom-renderer.d.ts +4 -4
  93. package/components/global/react-dom-renderer.js +5 -5
  94. package/components/global/react-render-adapter.js +19 -31
  95. package/components/global/ring-angular-component.js +1 -3
  96. package/components/global/ring-angular-component.test.js +2 -1
  97. package/components/global/use-event-callback.d.ts +1 -0
  98. package/components/global/use-event-callback.js +14 -0
  99. package/components/global/variables_dark.css +2 -2
  100. package/components/grid/col.d.ts +2 -2
  101. package/components/grid/grid.d.ts +2 -2
  102. package/components/grid/row.d.ts +2 -2
  103. package/components/group/group.d.ts +2 -2
  104. package/components/header/header.d.ts +2 -2
  105. package/components/header/logo.d.ts +2 -2
  106. package/components/header/profile.d.ts +4 -2
  107. package/components/header/profile.js +15 -11
  108. package/components/header/services-link.d.ts +2 -2
  109. package/components/header/services.d.ts +2 -2
  110. package/components/header/smart-profile.d.ts +2 -2
  111. package/components/header/smart-services.d.ts +2 -2
  112. package/components/header/tray-icon.d.ts +2 -2
  113. package/components/header/tray.d.ts +2 -2
  114. package/components/heading/heading.css +8 -8
  115. package/components/http/http.d.ts +16 -6
  116. package/components/http/http.js +26 -0
  117. package/components/hub-source/hub-source__users-groups.d.ts +1 -1
  118. package/components/i18n/README.md +46 -0
  119. package/components/i18n/i18n-context.d.ts +13 -0
  120. package/components/i18n/i18n-context.js +14 -0
  121. package/components/i18n/i18n.d.ts +59 -0
  122. package/components/i18n/i18n.js +26 -0
  123. package/components/i18n/messages.json +53 -0
  124. package/components/icon/icon.d.ts +3 -3
  125. package/components/icon/icon__svg.d.ts +1 -1
  126. package/components/input/input-legacy.css +3 -3
  127. package/components/input/input.css +8 -21
  128. package/components/input/input.d.ts +7 -1
  129. package/components/input/input.js +18 -14
  130. package/components/input-ng/input-ng.examples.js +3 -1
  131. package/components/input-ng/input-ng.js +3 -2
  132. package/components/input-size/input-size.examples.js +1 -0
  133. package/components/island/adaptive-island-hoc.d.ts +2 -2
  134. package/components/island/content.d.ts +1 -1
  135. package/components/island/header.d.ts +2 -2
  136. package/components/island/island.css +1 -1
  137. package/components/island/island.d.ts +3 -3
  138. package/components/island-legacy/content-legacy.d.ts +2 -2
  139. package/components/island-legacy/header-legacy.d.ts +2 -2
  140. package/components/island-legacy/island-legacy.d.ts +2 -2
  141. package/components/island-ng/island-ng.js +3 -3
  142. package/components/link/clickableLink.d.ts +1 -1
  143. package/components/link/link.css +1 -1
  144. package/components/link/link.d.ts +8 -9
  145. package/components/link/link.js +0 -1
  146. package/components/list/consts.js +3 -0
  147. package/components/list/list.css +2 -2
  148. package/components/list/list.d.ts +7 -7
  149. package/components/list/list.js +4 -1
  150. package/components/list/list__custom.d.ts +1 -1
  151. package/components/list/list__hint.d.ts +2 -2
  152. package/components/list/list__item.d.ts +2 -2
  153. package/components/list/list__link.d.ts +2 -2
  154. package/components/list/list__separator.d.ts +2 -2
  155. package/components/list/list__title.d.ts +2 -2
  156. package/components/loader/loader.d.ts +2 -2
  157. package/components/loader-inline/loader-inline.d.ts +2 -2
  158. package/components/loader-ng/loader-ng.js +1 -1
  159. package/components/loader-screen/loader-screen.d.ts +2 -2
  160. package/components/login-dialog/login-dialog.d.ts +2 -2
  161. package/components/login-dialog/service.js +4 -1
  162. package/components/markdown/code.d.ts +2 -2
  163. package/components/markdown/heading.d.ts +2 -2
  164. package/components/markdown/link.d.ts +2 -2
  165. package/components/markdown/markdown.d.ts +2 -2
  166. package/components/message/message.d.ts +3 -7
  167. package/components/message/message.js +17 -16
  168. package/components/pager/pager.d.ts +8 -13
  169. package/components/pager/pager.js +12 -14
  170. package/components/panel/panel.css +1 -1
  171. package/components/panel/panel.d.ts +2 -2
  172. package/components/popup/popup.d.ts +2 -2
  173. package/components/popup/popup.js +1 -1
  174. package/components/popup/position.d.ts +1 -1
  175. package/components/popup/position.js +43 -33
  176. package/components/popup-menu/popup-menu.d.ts +2 -2
  177. package/components/progress-bar/progress-bar.d.ts +2 -2
  178. package/components/promised-click-ng/promised-click-ng.js +1 -1
  179. package/components/query-assist/query-assist.css +16 -11
  180. package/components/query-assist/query-assist.d.ts +3 -7
  181. package/components/query-assist/query-assist.js +50 -31
  182. package/components/query-assist/query-assist__suggestions.d.ts +2 -2
  183. package/components/radio/radio.css +1 -1
  184. package/components/radio/radio.d.ts +1 -1
  185. package/components/radio/radio__item.d.ts +1 -1
  186. package/components/select/select-popup.css +2 -2
  187. package/components/select/select.css +9 -5
  188. package/components/select/select.d.ts +20 -9
  189. package/components/select/select.js +47 -23
  190. package/components/select/select__filter.d.ts +2 -3
  191. package/components/select/select__filter.js +4 -2
  192. package/components/select/select__popup.d.ts +48 -8
  193. package/components/select/select__popup.js +29 -8
  194. package/components/shortcuts/shortcuts-hoc.d.ts +2 -2
  195. package/components/shortcuts/shortcuts.d.ts +1 -1
  196. package/components/shortcuts-hint-ng/shortcuts-hint-ng.js +1 -2
  197. package/components/sidebar-ng/sidebar-ng.js +1 -2
  198. package/components/tab-trap/tab-trap.d.ts +1 -1
  199. package/components/table/cell.d.ts +2 -2
  200. package/components/table/disable-hover-hoc.d.ts +2 -2
  201. package/components/table/header-cell.d.ts +2 -2
  202. package/components/table/header.d.ts +3 -14
  203. package/components/table/header.js +5 -49
  204. package/components/table/multitable.d.ts +2 -2
  205. package/components/table/row-with-focus-sensor.d.ts +1 -1
  206. package/components/table/row.d.ts +2 -1
  207. package/components/table/row.js +4 -3
  208. package/components/table/smart-table.d.ts +3 -1
  209. package/components/table/table.css +9 -26
  210. package/components/table/table.d.ts +6 -4
  211. package/components/table/table.js +5 -3
  212. package/components/tabs/collapsible-more.d.ts +3 -3
  213. package/components/tabs/collapsible-tab.d.ts +1 -1
  214. package/components/tabs/collapsible-tabs.d.ts +2 -2
  215. package/components/tabs/dumb-tabs.d.ts +5 -3
  216. package/components/tabs/dumb-tabs.js +3 -2
  217. package/components/tabs/smart-tabs.d.ts +2 -2
  218. package/components/tabs/tab-link.d.ts +1 -1
  219. package/components/tabs/tab.d.ts +2 -2
  220. package/components/tabs/tab.js +3 -3
  221. package/components/tabs/tabs.css +4 -1
  222. package/components/tag/tag.css +3 -3
  223. package/components/tag/tag.d.ts +5 -5
  224. package/components/tags-input/tags-input.css +1 -1
  225. package/components/tags-input/tags-input.d.ts +9 -4
  226. package/components/tags-input/tags-input.js +7 -7
  227. package/components/tags-list/tags-list.d.ts +2 -2
  228. package/components/template-ng/template-ng.js +1 -2
  229. package/components/text/text.css +12 -0
  230. package/components/text/text.d.ts +8 -2
  231. package/components/text/text.js +12 -2
  232. package/components/toggle/toggle.css +1 -1
  233. package/components/toggle/toggle.d.ts +2 -2
  234. package/components/tooltip/tooltip.d.ts +1 -1
  235. package/components/user-agreement/service.js +4 -1
  236. package/components/user-agreement/user-agreement.d.ts +3 -11
  237. package/components/user-agreement/user-agreement.js +31 -30
  238. package/components/user-card/card.d.ts +22 -21
  239. package/components/user-card/card.js +29 -29
  240. package/components/user-card/smart-user-card-tooltip.d.ts +3 -3
  241. package/components/user-card/tooltip.d.ts +11 -6
  242. package/components/user-card/tooltip.js +1 -1
  243. package/components/user-card/user-card.css +10 -1
  244. package/dist/_helpers/_rollupPluginBabelHelpers.js +614 -1
  245. package/dist/_helpers/anchor.js +7 -8
  246. package/dist/_helpers/badge.js +1 -1
  247. package/dist/_helpers/button-group.js +1 -1
  248. package/dist/_helpers/button-set.js +1 -1
  249. package/dist/_helpers/button-toolbar.js +1 -1
  250. package/dist/_helpers/button__classes.js +17 -29
  251. package/dist/_helpers/card.js +100 -91
  252. package/dist/_helpers/checkbox.js +1 -1
  253. package/dist/_helpers/control-label.js +3 -0
  254. package/dist/_helpers/date-picker.js +1 -1
  255. package/dist/_helpers/dialog__body-scroll-preventer.js +21 -12
  256. package/dist/_helpers/error-message.js +1 -1
  257. package/dist/_helpers/footer.js +31 -35
  258. package/dist/_helpers/grid.js +1 -1
  259. package/dist/_helpers/group.js +1 -1
  260. package/dist/_helpers/header.js +1 -1
  261. package/dist/_helpers/icon.js +1 -1
  262. package/dist/_helpers/input.js +1 -1
  263. package/dist/_helpers/island.js +1 -1
  264. package/dist/_helpers/link.js +1 -1
  265. package/dist/_helpers/list.js +1 -1
  266. package/dist/_helpers/loader-inline.js +1 -1
  267. package/dist/_helpers/loader-screen.js +1 -1
  268. package/dist/_helpers/panel.js +1 -1
  269. package/dist/_helpers/query-assist__suggestions.js +92 -75
  270. package/dist/_helpers/radio.js +1 -1
  271. package/dist/_helpers/select__filter.js +69 -42
  272. package/dist/_helpers/services-link.js +33 -21
  273. package/dist/_helpers/sidebar.js +87 -86
  274. package/dist/_helpers/table.js +1 -1
  275. package/dist/_helpers/tabs.js +1 -1
  276. package/dist/_helpers/theme.js +43 -36
  277. package/dist/_helpers/title.js +66 -56
  278. package/dist/alert/alert.d.ts +1 -1
  279. package/dist/alert/alert.js +164 -127
  280. package/dist/alert/container.js +40 -29
  281. package/dist/alert-service/alert-service.d.ts +2 -2
  282. package/dist/alert-service/alert-service.js +169 -103
  283. package/dist/analytics/analytics.d.ts +21 -7
  284. package/dist/analytics/analytics.js +90 -71
  285. package/dist/analytics/analytics__custom-plugin.d.ts +6 -16
  286. package/dist/analytics/analytics__custom-plugin.js +74 -87
  287. package/dist/analytics/analytics__fus-plugin.d.ts +15 -25
  288. package/dist/analytics/analytics__fus-plugin.js +31 -89
  289. package/dist/analytics/analytics__ga-plugin.d.ts +13 -3
  290. package/dist/analytics/analytics__ga-plugin.js +76 -25
  291. package/dist/analytics/analytics__plugin-utils.d.ts +16 -0
  292. package/dist/analytics/analytics__plugin-utils.js +52 -21
  293. package/dist/auth/auth.js +39 -5
  294. package/dist/auth/auth__core.d.ts +5 -4
  295. package/dist/auth/auth__core.js +1459 -719
  296. package/dist/auth/background-flow.js +125 -84
  297. package/dist/auth/down-notification.js +76 -32
  298. package/dist/auth/iframe-flow.js +129 -69
  299. package/dist/auth/landing.js +93 -31
  300. package/dist/auth/request-builder.js +79 -45
  301. package/dist/auth/response-parser.js +117 -85
  302. package/dist/auth/storage.js +322 -161
  303. package/dist/auth/token-validator.js +239 -128
  304. package/dist/auth/window-flow.js +126 -83
  305. package/dist/auth-dialog/auth-dialog.d.ts +2 -2
  306. package/dist/auth-dialog/auth-dialog.js +152 -94
  307. package/dist/auth-dialog-service/auth-dialog-service.js +36 -10
  308. package/dist/auth-ng/auth-ng.js +73 -35
  309. package/dist/auth-ng/auth-ng.mock.js +6 -6
  310. package/dist/autofocus-ng/autofocus-ng.js +23 -8
  311. package/dist/avatar/avatar-example-datauri.js +1 -23
  312. package/dist/avatar/avatar.d.ts +3 -3
  313. package/dist/avatar/avatar.js +132 -99
  314. package/dist/avatar/fallback-avatar.d.ts +2 -2
  315. package/dist/avatar/fallback-avatar.js +44 -24
  316. package/dist/avatar-editor-ng/avatar-editor-ng.js +57 -25
  317. package/dist/avatar-editor-ng/avatar-editor-ng__template.js +1 -28
  318. package/dist/avatar-ng/avatar-ng.js +22 -0
  319. package/dist/badge/badge.d.ts +2 -2
  320. package/dist/badge/badge.js +34 -26
  321. package/dist/badge-ng/badge-ng.js +12 -0
  322. package/dist/breadcrumb-ng/breadcrumb-ng.js +17 -32
  323. package/dist/button/button.d.ts +3 -4
  324. package/dist/button/button.js +89 -69
  325. package/dist/button/button__classes.js +1 -0
  326. package/dist/button-group/button-group.d.ts +2 -2
  327. package/dist/button-group/button-group.js +31 -15
  328. package/dist/button-group/caption.d.ts +2 -2
  329. package/dist/button-group/caption.js +19 -11
  330. package/dist/button-group-ng/button-group-ng.js +13 -7
  331. package/dist/button-ng/button-ng.js +132 -112
  332. package/dist/button-set/button-set.d.ts +2 -2
  333. package/dist/button-set/button-set.js +29 -15
  334. package/dist/button-set-ng/button-set-ng.js +2 -2
  335. package/dist/button-toolbar/button-toolbar.d.ts +2 -2
  336. package/dist/button-toolbar/button-toolbar.js +28 -14
  337. package/dist/button-toolbar-ng/button-toolbar-ng.js +5 -3
  338. package/dist/caret/caret.js +223 -188
  339. package/dist/checkbox/checkbox.d.ts +2 -2
  340. package/dist/checkbox/checkbox.js +83 -58
  341. package/dist/checkbox-ng/checkbox-ng.js +18 -28
  342. package/dist/clipboard/clipboard-fallback.js +10 -10
  343. package/dist/clipboard/clipboard.js +131 -35
  344. package/dist/code/code.d.ts +1 -1
  345. package/dist/code/code.js +153 -81
  346. package/dist/compiler-ng/compiler-ng.js +18 -15
  347. package/dist/confirm/confirm.d.ts +1 -1
  348. package/dist/confirm/confirm.js +85 -47
  349. package/dist/confirm-ng/confirm-ng.js +34 -6
  350. package/dist/confirm-service/confirm-service.js +67 -44
  351. package/dist/content-layout/content-layout.d.ts +2 -2
  352. package/dist/content-layout/content-layout.js +53 -35
  353. package/dist/content-layout/sidebar.d.ts +2 -2
  354. package/dist/content-layout/sidebar.js +1 -0
  355. package/dist/contenteditable/contenteditable.d.ts +3 -3
  356. package/dist/contenteditable/contenteditable.js +54 -43
  357. package/dist/control-label/control-label.d.ts +11 -0
  358. package/dist/control-label/control-label.js +31 -0
  359. package/dist/data-list/data-list.d.ts +3 -3
  360. package/dist/data-list/data-list.js +164 -114
  361. package/dist/data-list/data-list.mock.d.ts +2 -2
  362. package/dist/data-list/data-list.mock.js +11 -3
  363. package/dist/data-list/item.d.ts +3 -3
  364. package/dist/data-list/item.js +140 -113
  365. package/dist/data-list/selection.js +139 -77
  366. package/dist/data-list/title.d.ts +1 -1
  367. package/dist/data-list/title.js +12 -0
  368. package/dist/data-list-ng/data-list-ng.js +30 -1
  369. package/dist/date-picker/consts.d.ts +5 -5
  370. package/dist/date-picker/consts.js +18 -15
  371. package/dist/date-picker/date-input.d.ts +3 -12
  372. package/dist/date-picker/date-input.js +131 -107
  373. package/dist/date-picker/date-picker.d.ts +8 -6
  374. package/dist/date-picker/date-picker.js +214 -160
  375. package/dist/date-picker/date-popup.d.ts +1 -1
  376. package/dist/date-picker/date-popup.js +340 -297
  377. package/dist/date-picker/day.d.ts +2 -2
  378. package/dist/date-picker/day.js +78 -68
  379. package/dist/date-picker/month-names.d.ts +2 -2
  380. package/dist/date-picker/month-names.js +59 -41
  381. package/dist/date-picker/month-slider.d.ts +2 -2
  382. package/dist/date-picker/month-slider.js +59 -40
  383. package/dist/date-picker/month.d.ts +2 -2
  384. package/dist/date-picker/month.js +21 -15
  385. package/dist/date-picker/months.d.ts +2 -2
  386. package/dist/date-picker/months.js +80 -56
  387. package/dist/date-picker/weekdays.d.ts +2 -2
  388. package/dist/date-picker/weekdays.js +18 -12
  389. package/dist/date-picker/years.d.ts +6 -2
  390. package/dist/date-picker/years.js +102 -66
  391. package/dist/dialog/dialog.d.ts +4 -16
  392. package/dist/dialog/dialog.js +148 -98
  393. package/dist/dialog/dialog__body-scroll-preventer.js +5 -0
  394. package/dist/dialog-ng/dialog-ng.js +404 -291
  395. package/dist/dialog-ng/dialog-ng__template.js +1 -70
  396. package/dist/docked-panel-ng/docked-panel-ng.js +33 -19
  397. package/dist/dropdown/anchor.d.ts +1 -1
  398. package/dist/dropdown/anchor.js +10 -1
  399. package/dist/dropdown/dropdown.d.ts +8 -1
  400. package/dist/dropdown/dropdown.js +158 -130
  401. package/dist/dropdown-menu/dropdown-menu.js +102 -73
  402. package/dist/editable-heading/editable-heading.d.ts +2 -2
  403. package/dist/editable-heading/editable-heading.js +133 -62
  404. package/dist/error-bubble/error-bubble.d.ts +2 -2
  405. package/dist/error-bubble/error-bubble.js +60 -27
  406. package/dist/error-message/error-message.d.ts +2 -2
  407. package/dist/error-message/error-message.js +52 -29
  408. package/dist/error-message-ng/error-message-ng.js +12 -24
  409. package/dist/footer/footer.js +11 -2
  410. package/dist/footer-ng/footer-ng.js +52 -27
  411. package/dist/form-ng/form-ng.js +67 -57
  412. package/dist/global/angular-component-factory.js +78 -50
  413. package/dist/global/compose.js +10 -1
  414. package/dist/global/composeRefs.js +12 -7
  415. package/dist/global/controls-height.d.ts +2 -0
  416. package/dist/global/controls-height.js +10 -2
  417. package/dist/global/create-stateful-context.d.ts +1 -1
  418. package/dist/global/create-stateful-context.js +19 -19
  419. package/dist/global/data-tests.js +15 -7
  420. package/dist/global/dom.js +93 -55
  421. package/dist/global/focus-sensor-hoc.d.ts +1 -0
  422. package/dist/global/focus-sensor-hoc.js +118 -102
  423. package/dist/global/fuzzy-highlight.js +41 -27
  424. package/dist/global/get-event-key.js +8 -8
  425. package/dist/global/get-uid.js +8 -4
  426. package/dist/global/inject-styles.js +15 -10
  427. package/dist/global/linear-function.js +2 -2
  428. package/dist/global/listeners.js +50 -28
  429. package/dist/global/memoize.js +13 -6
  430. package/dist/global/normalize-indent.js +51 -19
  431. package/dist/global/promise-with-timeout.js +8 -6
  432. package/dist/global/prop-types.js +5 -3
  433. package/dist/global/react-dom-renderer.d.ts +4 -4
  434. package/dist/global/react-dom-renderer.js +44 -28
  435. package/dist/global/react-render-adapter.js +21 -15
  436. package/dist/global/rerender-hoc.js +40 -19
  437. package/dist/global/ring-angular-component.js +18 -10
  438. package/dist/global/schedule-raf.js +6 -5
  439. package/dist/global/sniffer.js +1 -1
  440. package/dist/global/theme.js +24 -0
  441. package/dist/global/trivial-template-tag.js +10 -3
  442. package/dist/global/typescript-utils.js +6 -2
  443. package/dist/global/url.js +27 -21
  444. package/dist/global/use-event-callback.d.ts +1 -0
  445. package/dist/global/use-event-callback.js +17 -0
  446. package/dist/grid/col.d.ts +2 -2
  447. package/dist/grid/col.js +42 -23
  448. package/dist/grid/grid.d.ts +2 -2
  449. package/dist/grid/grid.js +32 -13
  450. package/dist/grid/row.d.ts +2 -2
  451. package/dist/grid/row.js +32 -20
  452. package/dist/group/group.d.ts +2 -2
  453. package/dist/group/group.js +23 -13
  454. package/dist/group-ng/group-ng.js +2 -2
  455. package/dist/header/header.d.ts +2 -2
  456. package/dist/header/header.js +75 -25
  457. package/dist/header/logo.d.ts +2 -2
  458. package/dist/header/logo.js +31 -12
  459. package/dist/header/profile.d.ts +4 -2
  460. package/dist/header/profile.js +154 -105
  461. package/dist/header/services-link.d.ts +2 -2
  462. package/dist/header/services-link.js +9 -1
  463. package/dist/header/services.d.ts +2 -2
  464. package/dist/header/services.js +104 -63
  465. package/dist/header/smart-profile.d.ts +2 -2
  466. package/dist/header/smart-profile.js +194 -98
  467. package/dist/header/smart-services.d.ts +2 -2
  468. package/dist/header/smart-services.js +104 -52
  469. package/dist/header/tray-icon.d.ts +2 -2
  470. package/dist/header/tray-icon.js +36 -20
  471. package/dist/header/tray.d.ts +2 -2
  472. package/dist/header/tray.js +30 -17
  473. package/dist/heading/heading.js +26 -27
  474. package/dist/heading-ng/heading-ng.js +10 -0
  475. package/dist/http/http.d.ts +16 -6
  476. package/dist/http/http.js +357 -170
  477. package/dist/http/http.mock.js +105 -50
  478. package/dist/hub-source/hub-source.js +183 -77
  479. package/dist/hub-source/hub-source__user.js +45 -12
  480. package/dist/hub-source/hub-source__users-groups.d.ts +1 -1
  481. package/dist/hub-source/hub-source__users-groups.js +63 -34
  482. package/dist/i18n/i18n-context.d.ts +13 -0
  483. package/dist/i18n/i18n-context.js +28 -0
  484. package/dist/i18n/i18n.d.ts +59 -0
  485. package/dist/i18n/i18n.js +140 -0
  486. package/dist/icon/icon.d.ts +3 -3
  487. package/dist/icon/icon.js +77 -59
  488. package/dist/icon/icon__svg.d.ts +1 -1
  489. package/dist/icon/icon__svg.js +31 -24
  490. package/dist/icon/index.js +9 -0
  491. package/dist/icon-ng/icon-ng.js +27 -16
  492. package/dist/input/input.d.ts +7 -1
  493. package/dist/input/input.js +178 -131
  494. package/dist/input-ng/input-ng.js +77 -99
  495. package/dist/island/adaptive-island-hoc.d.ts +2 -2
  496. package/dist/island/adaptive-island-hoc.js +38 -27
  497. package/dist/island/content.d.ts +1 -1
  498. package/dist/island/content.js +104 -92
  499. package/dist/island/header.d.ts +2 -2
  500. package/dist/island/header.js +60 -47
  501. package/dist/island/island.d.ts +3 -3
  502. package/dist/island/island.js +33 -21
  503. package/dist/island-legacy/content-legacy.d.ts +2 -2
  504. package/dist/island-legacy/content-legacy.js +23 -13
  505. package/dist/island-legacy/header-legacy.d.ts +2 -2
  506. package/dist/island-legacy/header-legacy.js +25 -15
  507. package/dist/island-legacy/island-legacy.d.ts +2 -2
  508. package/dist/island-legacy/island-legacy.js +23 -13
  509. package/dist/island-ng/island-content-ng.js +17 -26
  510. package/dist/island-ng/island-header-ng.js +9 -12
  511. package/dist/island-ng/island-ng-class-fixer.js +3 -0
  512. package/dist/island-ng/island-ng.js +6 -10
  513. package/dist/link/clickableLink.d.ts +1 -1
  514. package/dist/link/clickableLink.js +43 -29
  515. package/dist/link/link.d.ts +8 -9
  516. package/dist/link/link.js +72 -62
  517. package/dist/link-ng/link-ng.js +5 -7
  518. package/dist/list/consts.js +4 -1
  519. package/dist/list/list.d.ts +7 -7
  520. package/dist/list/list.js +499 -402
  521. package/dist/list/list__custom.d.ts +1 -1
  522. package/dist/list/list__custom.js +60 -47
  523. package/dist/list/list__hint.d.ts +2 -2
  524. package/dist/list/list__hint.js +18 -8
  525. package/dist/list/list__item.d.ts +2 -2
  526. package/dist/list/list__item.js +167 -132
  527. package/dist/list/list__link.d.ts +2 -2
  528. package/dist/list/list__link.js +54 -38
  529. package/dist/list/list__separator.d.ts +2 -2
  530. package/dist/list/list__separator.js +24 -14
  531. package/dist/list/list__title.d.ts +2 -2
  532. package/dist/list/list__title.js +32 -22
  533. package/dist/list/list__users-groups-source.js +130 -54
  534. package/dist/loader/loader.d.ts +2 -2
  535. package/dist/loader/loader.js +66 -34
  536. package/dist/loader/loader__core.js +197 -129
  537. package/dist/loader-inline/loader-inline.d.ts +2 -2
  538. package/dist/loader-inline/loader-inline.js +32 -18
  539. package/dist/loader-inline-ng/loader-inline-ng.js +2 -2
  540. package/dist/loader-ng/loader-ng.js +44 -18
  541. package/dist/loader-screen/loader-screen.d.ts +2 -2
  542. package/dist/loader-screen/loader-screen.js +43 -20
  543. package/dist/loader-screen-ng/loader-screen-ng.js +45 -30
  544. package/dist/login-dialog/login-dialog.d.ts +2 -2
  545. package/dist/login-dialog/login-dialog.js +125 -78
  546. package/dist/login-dialog/service.js +39 -10
  547. package/dist/markdown/code.d.ts +2 -2
  548. package/dist/markdown/code.js +30 -9
  549. package/dist/markdown/heading.d.ts +2 -2
  550. package/dist/markdown/heading.js +3 -5
  551. package/dist/markdown/link.d.ts +2 -2
  552. package/dist/markdown/link.js +13 -7
  553. package/dist/markdown/markdown.d.ts +2 -2
  554. package/dist/markdown/markdown.js +67 -35
  555. package/dist/message/message.d.ts +3 -7
  556. package/dist/message/message.js +153 -119
  557. package/dist/message-bundle-ng/message-bundle-ng.js +130 -46
  558. package/dist/old-browsers-message/old-browsers-message.js +19 -11
  559. package/dist/old-browsers-message/old-browsers-message__stop.js +8 -0
  560. package/dist/old-browsers-message/white-list.js +17 -10
  561. package/dist/pager/pager.d.ts +8 -13
  562. package/dist/pager/pager.js +259 -188
  563. package/dist/pager-ng/pager-ng.js +39 -2
  564. package/dist/panel/panel.d.ts +2 -2
  565. package/dist/panel/panel.js +23 -13
  566. package/dist/panel-ng/panel-ng.js +13 -1
  567. package/dist/permissions/permissions.js +166 -122
  568. package/dist/permissions/permissions__cache.js +220 -191
  569. package/dist/permissions-ng/permissions-ng.js +89 -36
  570. package/dist/place-under-ng/place-under-ng.js +67 -45
  571. package/dist/popup/popup.consts.js +1 -1
  572. package/dist/popup/popup.d.ts +2 -2
  573. package/dist/popup/popup.js +299 -236
  574. package/dist/popup/popup.target.js +8 -9
  575. package/dist/popup/position.d.ts +1 -1
  576. package/dist/popup/position.js +175 -154
  577. package/dist/popup-menu/popup-menu.d.ts +2 -2
  578. package/dist/popup-menu/popup-menu.js +80 -42
  579. package/dist/progress-bar/progress-bar.d.ts +2 -2
  580. package/dist/progress-bar/progress-bar.js +66 -52
  581. package/dist/progress-bar-ng/progress-bar-ng.js +10 -0
  582. package/dist/promised-click-ng/promised-click-ng.js +93 -60
  583. package/dist/proxy-attrs/proxy-attrs.js +18 -9
  584. package/dist/query-assist/query-assist.d.ts +3 -7
  585. package/dist/query-assist/query-assist.js +677 -567
  586. package/dist/query-assist/query-assist__suggestions.d.ts +2 -2
  587. package/dist/query-assist/query-assist__suggestions.js +33 -2
  588. package/dist/query-assist-ng/query-assist-ng.js +41 -2
  589. package/dist/radio/radio.d.ts +1 -1
  590. package/dist/radio/radio.js +28 -14
  591. package/dist/radio/radio__item.d.ts +1 -1
  592. package/dist/radio/radio__item.js +60 -44
  593. package/dist/radio-ng/radio-ng.js +14 -25
  594. package/dist/save-field-ng/save-field-ng.js +90 -56
  595. package/dist/save-field-ng/save-field-ng__template.js +1 -32
  596. package/dist/select/select.d.ts +20 -9
  597. package/dist/select/select.js +831 -699
  598. package/dist/select/select__filter.d.ts +2 -3
  599. package/dist/select/select__filter.js +37 -2
  600. package/dist/select/select__popup.d.ts +48 -8
  601. package/dist/select/select__popup.js +430 -293
  602. package/dist/select-ng/select-ng.js +130 -77
  603. package/dist/select-ng/select-ng__lazy.js +104 -51
  604. package/dist/select-ng/select-ng__options.js +93 -68
  605. package/dist/shortcuts/core.js +197 -146
  606. package/dist/shortcuts/shortcut-title.js +11 -6
  607. package/dist/shortcuts/shortcuts-hoc.d.ts +2 -2
  608. package/dist/shortcuts/shortcuts-hoc.js +43 -19
  609. package/dist/shortcuts/shortcuts.d.ts +1 -1
  610. package/dist/shortcuts/shortcuts.js +69 -43
  611. package/dist/shortcuts-hint-ng/shortcuts-hint-ng.js +109 -58
  612. package/dist/shortcuts-hint-ng/shortcuts-hint-ng__template.js +1 -48
  613. package/dist/shortcuts-ng/shortcuts-ng.js +110 -76
  614. package/dist/sidebar-ng/sidebar-ng.js +55 -25
  615. package/dist/sidebar-ng/sidebar-ng__button-template.js +1 -18
  616. package/dist/sidebar-ng/sidebar-ng__template.js +1 -10
  617. package/dist/storage/storage.js +34 -4
  618. package/dist/storage/storage__fallback.js +217 -143
  619. package/dist/storage/storage__local.js +155 -90
  620. package/dist/style.css +1 -1
  621. package/dist/tab-trap/tab-trap.d.ts +1 -1
  622. package/dist/tab-trap/tab-trap.js +117 -84
  623. package/dist/table/cell.d.ts +2 -2
  624. package/dist/table/cell.js +23 -9
  625. package/dist/table/disable-hover-hoc.d.ts +2 -2
  626. package/dist/table/disable-hover-hoc.js +44 -26
  627. package/dist/table/header-cell.d.ts +2 -2
  628. package/dist/table/header-cell.js +74 -54
  629. package/dist/table/header.d.ts +3 -14
  630. package/dist/table/header.js +102 -131
  631. package/dist/table/multitable.d.ts +2 -2
  632. package/dist/table/multitable.js +102 -86
  633. package/dist/table/row-with-focus-sensor.d.ts +1 -1
  634. package/dist/table/row-with-focus-sensor.js +69 -24
  635. package/dist/table/row.d.ts +2 -1
  636. package/dist/table/row.js +191 -155
  637. package/dist/table/selection-adapter.js +3 -1
  638. package/dist/table/selection-shortcuts-hoc.js +132 -131
  639. package/dist/table/selection.js +220 -150
  640. package/dist/table/smart-table.d.ts +3 -1
  641. package/dist/table/smart-table.js +87 -50
  642. package/dist/table/table.d.ts +6 -4
  643. package/dist/table/table.js +311 -247
  644. package/dist/table-legacy-ng/table-legacy-ng.js +120 -103
  645. package/dist/table-legacy-ng/table-legacy-ng__pager.js +46 -12
  646. package/dist/table-legacy-ng/table-legacy-ng__selection-navigate-actions.js +92 -69
  647. package/dist/table-legacy-ng/table-legacy-ng__selection.js +167 -119
  648. package/dist/table-legacy-ng/table-legacy-ng__toolbar.js +35 -21
  649. package/dist/table-ng/smart-table-ng.js +30 -2
  650. package/dist/table-ng/table-ng.js +30 -2
  651. package/dist/tabs/collapsible-more.d.ts +3 -3
  652. package/dist/tabs/collapsible-more.js +92 -56
  653. package/dist/tabs/collapsible-tab.d.ts +1 -1
  654. package/dist/tabs/collapsible-tab.js +45 -39
  655. package/dist/tabs/collapsible-tabs.d.ts +2 -2
  656. package/dist/tabs/collapsible-tabs.js +161 -95
  657. package/dist/tabs/custom-item.js +2 -4
  658. package/dist/tabs/dumb-tabs.d.ts +5 -3
  659. package/dist/tabs/dumb-tabs.js +101 -56
  660. package/dist/tabs/smart-tabs.d.ts +2 -2
  661. package/dist/tabs/smart-tabs.js +70 -25
  662. package/dist/tabs/tab-link.d.ts +1 -1
  663. package/dist/tabs/tab-link.js +29 -20
  664. package/dist/tabs/tab.d.ts +2 -2
  665. package/dist/tabs/tab.js +26 -15
  666. package/dist/tabs/tabs.js +35 -1
  667. package/dist/tabs-ng/tabs-ng.js +38 -24
  668. package/dist/tabs-ng/tabs-ng__template.js +1 -38
  669. package/dist/tag/tag.d.ts +5 -5
  670. package/dist/tag/tag.js +146 -113
  671. package/dist/tags-input/tags-input.d.ts +9 -4
  672. package/dist/tags-input/tags-input.js +327 -220
  673. package/dist/tags-input-ng/tags-input-ng.js +40 -2
  674. package/dist/tags-list/tags-list.d.ts +2 -2
  675. package/dist/tags-list/tags-list.js +61 -38
  676. package/dist/template-ng/template-ng.js +45 -35
  677. package/dist/text/text.d.ts +8 -2
  678. package/dist/text/text.js +38 -17
  679. package/dist/title-ng/title-ng.js +28 -23
  680. package/dist/toggle/toggle.d.ts +2 -2
  681. package/dist/toggle/toggle.js +55 -39
  682. package/dist/toggle-ng/toggle-ng.js +13 -0
  683. package/dist/tooltip/tooltip.d.ts +1 -1
  684. package/dist/tooltip/tooltip.js +145 -102
  685. package/dist/tooltip-ng/tooltip-ng.js +51 -25
  686. package/dist/user-agreement/service.js +411 -259
  687. package/dist/user-agreement/toolbox.eula.js +1 -160
  688. package/dist/user-agreement/user-agreement.d.ts +3 -11
  689. package/dist/user-agreement/user-agreement.js +106 -68
  690. package/dist/user-card/card.d.ts +22 -21
  691. package/dist/user-card/card.js +34 -1
  692. package/dist/user-card/smart-user-card-tooltip.d.ts +3 -3
  693. package/dist/user-card/smart-user-card-tooltip.js +139 -76
  694. package/dist/user-card/tooltip.d.ts +11 -6
  695. package/dist/user-card/tooltip.js +75 -32
  696. package/dist/user-card/user-card.js +34 -1
  697. package/dist/user-card-ng/user-card-ng.js +39 -6
  698. package/package.json +86 -82
  699. package/components/input/input-label.d.ts +0 -10
  700. package/components/input/input-label.js +0 -18
  701. package/dist/input/input-label.d.ts +0 -10
  702. package/dist/input/input-label.js +0 -27
@@ -1,6 +1,7 @@
1
- import React, { ButtonHTMLAttributes, Component, CSSProperties, HTMLAttributes, ReactNode, RefCallback, SyntheticEvent } from 'react';
1
+ import React, { ButtonHTMLAttributes, Component, ComponentType, CSSProperties, HTMLAttributes, ReactNode, Ref, RefCallback, SyntheticEvent } from 'react';
2
2
  import { SelectHandlerParams } from '../list/list';
3
3
  import { Size } from '../input/input';
4
+ import { LabelType } from '../control-label/control-label';
4
5
  import { ListDataItem } from '../list/consts';
5
6
  import { Directions } from '../popup/popup.consts';
6
7
  import { ControlsHeight } from '../global/controls-height';
@@ -12,7 +13,7 @@ declare function noop(): void;
12
13
  /**
13
14
  * @enum {number}
14
15
  */
15
- declare enum Type {
16
+ export declare enum Type {
16
17
  BUTTON = "BUTTON",
17
18
  INPUT = "INPUT",
18
19
  CUSTOM = "CUSTOM",
@@ -51,22 +52,27 @@ export type CustomAnchor = ((props: CustomAnchorProps) => ReactNode);
51
52
  export interface BaseSelectProps<T = unknown> {
52
53
  data: readonly SelectItem<T>[];
53
54
  filter: boolean | Filter<T>;
55
+ filterIcon?: string | ComponentType | null | undefined;
56
+ filterRef?: Ref<HTMLInputElement>;
54
57
  clear: boolean;
55
58
  loading: boolean;
56
59
  disabled: boolean;
57
- loadingMessage: string;
58
- notFoundMessage: string;
60
+ loadingMessage?: string;
61
+ notFoundMessage?: string;
59
62
  type: Type;
60
63
  size: Size;
61
64
  hideSelected: boolean;
62
65
  allowAny: boolean;
63
66
  maxHeight: number;
64
67
  hideArrow: boolean;
68
+ showPopup: boolean;
65
69
  directions: readonly Directions[];
66
70
  label: string | null;
67
71
  selectedLabel: ReactNode;
72
+ labelType?: LabelType;
68
73
  inputPlaceholder: string;
69
74
  shortcutsEnabled: boolean;
75
+ tryKeepOpen?: boolean;
70
76
  onBeforeOpen: () => void;
71
77
  onLoadMore: () => void;
72
78
  onOpen: () => void;
@@ -76,11 +82,13 @@ export interface BaseSelectProps<T = unknown> {
76
82
  onKeyDown: (event: React.KeyboardEvent<HTMLInputElement>) => void;
77
83
  onSelect: (selected: SelectItem<T> | null, event?: Event | SyntheticEvent) => void;
78
84
  onDeselect: (selected: SelectItem<T> | null) => void;
85
+ onOutsideClick: (e: PointerEvent) => void;
79
86
  onAdd: (value: string) => void;
80
87
  onDone: () => void;
81
88
  onReset: () => void;
82
89
  dir: 'ltr' | 'rtl';
83
90
  renderBottomToolbar?: () => ReactNode;
91
+ renderTopToolbar?: () => ReactNode;
84
92
  height?: ControlsHeight | undefined;
85
93
  targetElement?: HTMLElement | null | undefined;
86
94
  className?: string | null | undefined;
@@ -151,18 +159,19 @@ export default class Select<T = unknown> extends Component<SelectProps<T>, Selec
151
159
  static defaultProps: {
152
160
  data: never[];
153
161
  filter: boolean;
162
+ filterIcon: null;
163
+ filterRef: typeof noop;
154
164
  multiple: boolean;
155
165
  clear: boolean;
156
166
  loading: boolean;
157
167
  disabled: boolean;
158
- loadingMessage: string;
159
- notFoundMessage: string;
160
168
  type: Type;
161
169
  size: Size;
162
170
  targetElement: null;
163
171
  hideSelected: boolean;
164
172
  allowAny: boolean;
165
173
  hideArrow: boolean;
174
+ showPopup: boolean;
166
175
  maxHeight: number;
167
176
  directions: Directions[];
168
177
  selected: null;
@@ -181,6 +190,7 @@ export default class Select<T = unknown> extends Component<SelectProps<T>, Selec
181
190
  onKeyDown: typeof noop;
182
191
  onSelect: typeof noop;
183
192
  onDeselect: typeof noop;
193
+ onOutsideClick: typeof noop;
184
194
  onChange: typeof noop;
185
195
  onAdd: typeof noop;
186
196
  onDone: typeof noop;
@@ -216,7 +226,8 @@ export default class Select<T = unknown> extends Component<SelectProps<T>, Selec
216
226
  _showPopup(): void;
217
227
  _hidePopup(tryFocusAnchor?: boolean): void;
218
228
  addHandler: () => void;
219
- getToolbar(): JSX.Element | null;
229
+ getToolbar(): React.JSX.Element | null;
230
+ getTopbar(): React.ReactNode;
220
231
  getLowerCaseLabel: typeof getLowerCaseLabel;
221
232
  doesLabelMatch: typeof doesLabelMatch;
222
233
  getFilterFn(): FilterFn<T>;
@@ -254,8 +265,8 @@ export default class Select<T = unknown> extends Component<SelectProps<T>, Selec
254
265
  'shift+down': typeof noop;
255
266
  space: typeof noop;
256
267
  };
257
- renderSelect(activeItemId: string | undefined): JSX.Element;
258
- render(): JSX.Element;
268
+ renderSelect(activeItemId: string | undefined): React.JSX.Element;
269
+ render(): React.JSX.Element;
259
270
  }
260
271
  export type SingleSelectAttrs<T = unknown> = JSX.LibraryManagedAttributes<typeof Select, SingleSelectProps<T>>;
261
272
  export type MultipleSelectAttrs<T = unknown> = JSX.LibraryManagedAttributes<typeof Select, MultipleSelectProps<T>>;
@@ -9,7 +9,7 @@ import Avatar, { Size as AvatarSize } from '../avatar/avatar';
9
9
  import Popup from '../popup/popup';
10
10
  import List, { ActiveItemContext } from '../list/list';
11
11
  import Input, { Size } from '../input/input';
12
- import InputLabel from '../input/input-label';
12
+ import ControlLabel from '../control-label/control-label';
13
13
  import Shortcuts from '../shortcuts/shortcuts';
14
14
  import Button from '../button/button';
15
15
  import dataTests from '../global/data-tests';
@@ -17,6 +17,9 @@ import getUID from '../global/get-uid';
17
17
  import rerenderHOC from '../global/rerender-hoc';
18
18
  import fuzzyHighlight from '../global/fuzzy-highlight';
19
19
  import memoize from '../global/memoize';
20
+ import { I18nContext } from '../i18n/i18n-context';
21
+ import composeRefs from '../global/composeRefs';
22
+ import { refObject } from '../global/prop-types';
20
23
  import { isArray } from '../global/typescript-utils';
21
24
  import { ControlsHeight, ControlsHeightContext } from '../global/controls-height';
22
25
  import inputStyles from '../input/input.css';
@@ -29,7 +32,7 @@ function noop() { }
29
32
  /**
30
33
  * @enum {number}
31
34
  */
32
- var Type;
35
+ export var Type;
33
36
  (function (Type) {
34
37
  Type["BUTTON"] = "BUTTON";
35
38
  Type["INPUT"] = "INPUT";
@@ -179,18 +182,19 @@ export default class Select extends Component {
179
182
  static defaultProps = {
180
183
  data: [],
181
184
  filter: false,
185
+ filterIcon: null,
186
+ filterRef: noop,
182
187
  multiple: false,
183
188
  clear: false,
184
189
  loading: false,
185
190
  disabled: false,
186
- loadingMessage: 'Loading...',
187
- notFoundMessage: 'No options found',
188
191
  type: Type.BUTTON,
189
192
  size: Size.M,
190
193
  targetElement: null,
191
194
  hideSelected: false,
192
195
  allowAny: false,
193
196
  hideArrow: false,
197
+ showPopup: false,
194
198
  maxHeight: 600,
195
199
  directions: [
196
200
  Popup.PopupProps.Directions.BOTTOM_RIGHT,
@@ -214,6 +218,7 @@ export default class Select extends Component {
214
218
  onKeyDown: noop,
215
219
  onSelect: noop,
216
220
  onDeselect: noop,
221
+ onOutsideClick: noop,
217
222
  onChange: noop,
218
223
  onAdd: noop,
219
224
  onDone: noop,
@@ -236,7 +241,7 @@ export default class Select extends Component {
236
241
  if (prevState.selected) {
237
242
  Object.assign(nextState, {
238
243
  selectedIndex: getSelectedIndex(prevState.selected, data),
239
- prevFilterValue: getValueForFilter(prevState.selected, type, filterValue)
244
+ filterValue: getValueForFilter(prevState.selected, type, filterValue)
240
245
  });
241
246
  }
242
247
  }
@@ -245,7 +250,7 @@ export default class Select extends Component {
245
250
  const selectedIndex = getSelectedIndex(selected, data || prevData);
246
251
  Object.assign(nextState, {
247
252
  selected,
248
- prevFilterValue: getValueForFilter(selected, type, filterValue)
253
+ filterValue: getValueForFilter(selected, type, filterValue)
249
254
  });
250
255
  if (!Array.isArray(prevSelected) || !Array.isArray(selected) ||
251
256
  !isSameSelected(prevSelected, selected)) {
@@ -275,7 +280,7 @@ export default class Select extends Component {
275
280
  this.props.filter.value || '',
276
281
  shortcutsEnabled: false,
277
282
  popupShortcuts: false,
278
- showPopup: false,
283
+ showPopup: this.props.showPopup,
279
284
  prevData: this.props.data,
280
285
  prevSelected: null,
281
286
  prevMultiple: this.props.multiple,
@@ -423,15 +428,19 @@ export default class Select extends Component {
423
428
  const anchorElement = this.props.targetElement || this.node;
424
429
  const { showPopup, shownData } = this.state;
425
430
  const _shownData = this._prependResetOption(shownData);
426
- let message;
427
- if (this.props.loading) {
428
- message = this.props.loadingMessage;
429
- }
430
- else if (!shownData.length) {
431
- message = this.props.notFoundMessage;
432
- }
433
- return (<SelectPopup data={_shownData} message={message} toolbar={showPopup && this.getToolbar()} loading={this.props.loading} activeIndex={this.state.selectedIndex} hidden={!showPopup} ref={this.popupRef} maxHeight={this.props.maxHeight} minWidth={this.props.minWidth} directions={this.props.directions} className={this.props.popupClassName} style={this.props.popupStyle} top={this.props.top} left={this.props.left} filter={this.isInputMode() ? false : this.props.filter} // disable popup filter in INPUT mode
434
- multiple={this.props.multiple} filterValue={this.state.filterValue} anchorElement={anchorElement} onCloseAttempt={this._onCloseAttempt} onSelect={this._listSelectHandler} onSelectAll={this._listSelectAllHandler} onFilter={this._filterChangeHandler} onClear={this.clearFilter} onLoadMore={this.props.onLoadMore} isInputMode={this.isInputMode()} selected={this.state.selected} tags={this.props.tags} compact={this.props.compact} renderOptimization={this.props.renderOptimization} ringPopupTarget={this.props.ringPopupTarget} disableMoveOverflow={this.props.disableMoveOverflow} disableScrollToActive={this.props.disableScrollToActive} dir={this.props.dir} onEmptyPopupEnter={this.onEmptyPopupEnter} listId={this.listId}/>);
431
+ return (<I18nContext.Consumer>
432
+ {({ translate }) => {
433
+ let message;
434
+ if (this.props.loading) {
435
+ message = this.props.loadingMessage ?? translate('loading');
436
+ }
437
+ else if (!shownData.length) {
438
+ message = this.props.notFoundMessage ?? translate('noOptionsFound');
439
+ }
440
+ return (<SelectPopup data={_shownData} message={message} toolbar={showPopup && this.getToolbar()} topbar={this.getTopbar()} loading={this.props.loading} activeIndex={this.state.selectedIndex} hidden={!showPopup} ref={this.popupRef} maxHeight={this.props.maxHeight} minWidth={this.props.minWidth} directions={this.props.directions} className={this.props.popupClassName} style={this.props.popupStyle} top={this.props.top} left={this.props.left} filter={this.isInputMode() ? false : this.props.filter} // disable popup filter in INPUT mode
441
+ filterIcon={this.props.filterIcon} filterRef={this.props.filterRef} multiple={this.props.multiple} filterValue={this.state.filterValue} anchorElement={anchorElement} onCloseAttempt={this._onCloseAttempt} onOutsideClick={this.props.onOutsideClick} onSelect={this._listSelectHandler} onSelectAll={this._listSelectAllHandler} onFilter={this._filterChangeHandler} onClear={this.clearFilter} onLoadMore={this.props.onLoadMore} isInputMode={this.isInputMode()} selected={this.state.selected} tags={this.props.tags} compact={this.props.compact} renderOptimization={this.props.renderOptimization} ringPopupTarget={this.props.ringPopupTarget} disableMoveOverflow={this.props.disableMoveOverflow} disableScrollToActive={this.props.disableScrollToActive} dir={this.props.dir} onEmptyPopupEnter={this.onEmptyPopupEnter} listId={this.listId}/>);
442
+ }}
443
+ </I18nContext.Consumer>);
435
444
  }
436
445
  _showPopup() {
437
446
  if (!this.node) {
@@ -439,7 +448,7 @@ export default class Select extends Component {
439
448
  }
440
449
  const shownData = this.getListItems(this.filterValue());
441
450
  this.setState({
442
- showPopup: !!shownData.length || !this.props.allowAny,
451
+ showPopup: true,
443
452
  shownData
444
453
  });
445
454
  }
@@ -481,6 +490,9 @@ export default class Select extends Component {
481
490
  {hint && (<List.ListHint label={hint} data-test="ring-select-toolbar-hint"/>)}
482
491
  </div>);
483
492
  }
493
+ getTopbar() {
494
+ return this.props.renderTopToolbar?.();
495
+ }
484
496
  getLowerCaseLabel = getLowerCaseLabel;
485
497
  doesLabelMatch = doesLabelMatch;
486
498
  getFilterFn() {
@@ -576,8 +588,11 @@ export default class Select extends Component {
576
588
  selected.isResetItem) {
577
589
  return;
578
590
  }
591
+ const tryKeepOpen = this.props.tryKeepOpen ?? opts.tryKeepOpen;
579
592
  if (!this.props.multiple) {
580
- this._hidePopup(isSelectItemEvent);
593
+ if (!tryKeepOpen) {
594
+ this._hidePopup(isSelectItemEvent);
595
+ }
581
596
  this.setState({
582
597
  selected,
583
598
  selectedIndex: this._getSelectedIndex(selected, this.props.data)
@@ -592,7 +607,6 @@ export default class Select extends Component {
592
607
  });
593
608
  }
594
609
  else {
595
- const { tryKeepOpen } = opts;
596
610
  if (!tryKeepOpen) {
597
611
  this._hidePopup(isSelectItemEvent);
598
612
  }
@@ -612,6 +626,7 @@ export default class Select extends Component {
612
626
  }
613
627
  this.props.onChange(nextSelection, event);
614
628
  const nextState = {
629
+ filterValue: '',
615
630
  selected: nextSelection,
616
631
  selectedIndex: this._getSelectedIndex(selected, this.props.data)
617
632
  };
@@ -798,14 +813,14 @@ export default class Select extends Component {
798
813
  case Type.INPUT: return (<>
799
814
  <div ref={this.nodeRef} className={classNames(classes, styles.inputMode)} data-test={dataTests('ring-select', dataTest)}>
800
815
  {shortcutsEnabled && (<Shortcuts map={this.getShortcutsMap()} scope={this.shortcutsScope}/>)}
801
- <Input {...ariaProps} height={this.props.height} autoComplete="off" id={this.props.id} onClick={this._clickHandler} inputRef={this.filterRef} disabled={this.props.disabled} value={this.state.filterValue} borderless={this.props.type === Type.INPUT_WITHOUT_CONTROLS} style={style} size={Size.FULL} onChange={this._filterChangeHandler} onFocus={this._focusHandler} onBlur={this._blurHandler}
816
+ <Input {...ariaProps} height={this.props.height} autoComplete="off" id={this.props.id} onClick={this._clickHandler} inputRef={composeRefs(this.filterRef, this.props.filterRef)} disabled={this.props.disabled} value={this.state.filterValue} borderless={this.props.type === Type.INPUT_WITHOUT_CONTROLS} style={style} size={Size.FULL} onChange={this._filterChangeHandler} onFocus={this._focusHandler} onBlur={this._blurHandler}
802
817
  // Input with error style without description
803
818
  error={this.props.error != null ? '' : null} label={this.props.type === Type.INPUT ? this._getLabel() : null} placeholder={this.props.inputPlaceholder} onKeyDown={this.props.onKeyDown} data-test="ring-select__focus" enableShortcuts={shortcutsEnabled
804
819
  ? Object.keys({
805
820
  ...this.getShortcutsMap(),
806
821
  ...this._popup?.list?.shortcutsMap
807
822
  })
808
- : undefined} afterInput={this.props.type === Type.INPUT && iconsNode}/>
823
+ : undefined} icon={this.props.filterIcon} afterInput={this.props.type === Type.INPUT && iconsNode}/>
809
824
  {this._renderPopup()}
810
825
  </div>
811
826
  {this.props.error && (<div className={classNames(inputStyles.errorText, inputStyles[`size${this.props.size}`])}>
@@ -814,11 +829,12 @@ export default class Select extends Component {
814
829
  </>);
815
830
  case Type.BUTTON:
816
831
  return (<div ref={this.nodeRef} className={classNames(classes, styles.buttonMode)} data-test={dataTests('ring-select', dataTest)}>
817
- {selectedLabel && (<InputLabel label={selectedLabel} disabled={this.props.disabled} htmlFor={this.props.id}/>)}
832
+ {selectedLabel && (<ControlLabel type={this.props.labelType} disabled={this.props.disabled} htmlFor={this.props.id}>{selectedLabel}</ControlLabel>)}
818
833
  {shortcutsEnabled && (<Shortcuts map={this.getShortcutsMap()} scope={this.shortcutsScope}/>)}
819
834
  <div className={styles.buttonContainer}>
820
835
  <Button {...ariaProps} height={this.props.height} id={this.props.id} onClick={this._clickHandler} className={classNames(this.props.buttonClassName, styles.buttonValue, {
821
- [styles.buttonValueOpen]: this.state.showPopup
836
+ [styles.buttonValueOpen]: this.state.showPopup,
837
+ [styles.buttonValueEmpty]: this._selectionIsEmpty()
822
838
  })} disabled={this.props.disabled} style={style} data-test="ring-select__button ring-select__focus">
823
839
  {this._getAvatar()}
824
840
  {this._getPlaceholder()}
@@ -876,6 +892,11 @@ Select.propTypes = {
876
892
  multiple: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
877
893
  allowAny: PropTypes.bool,
878
894
  filter: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
895
+ filterIcon: PropTypes.oneOfType([PropTypes.string, PropTypes.elementType]),
896
+ filterRef: PropTypes.oneOfType([
897
+ PropTypes.func,
898
+ refObject(PropTypes.instanceOf(HTMLInputElement))
899
+ ]),
879
900
  getInitial: PropTypes.func,
880
901
  onClose: PropTypes.func,
881
902
  onOpen: PropTypes.func,
@@ -888,6 +909,7 @@ Select.propTypes = {
888
909
  onBeforeOpen: PropTypes.func,
889
910
  onSelect: PropTypes.func,
890
911
  onDeselect: PropTypes.func,
912
+ onOutsideClick: PropTypes.func,
891
913
  onFocus: PropTypes.func,
892
914
  onBlur: PropTypes.func,
893
915
  onKeyDown: PropTypes.func,
@@ -922,6 +944,8 @@ Select.propTypes = {
922
944
  inputPlaceholder: PropTypes.string,
923
945
  clear: PropTypes.bool,
924
946
  hideArrow: PropTypes.bool,
947
+ showPopup: PropTypes.bool,
948
+ tryKeepOpen: PropTypes.bool,
925
949
  compact: PropTypes.bool,
926
950
  size: PropTypes.oneOf(Object.values(Size)),
927
951
  customAnchor: PropTypes.func,
@@ -1,4 +1,4 @@
1
- import { Component, RefCallback } from 'react';
1
+ import React, { Component, RefCallback } from 'react';
2
2
  import { InputAttrs } from '../input/input';
3
3
  declare function noop(): void;
4
4
  type SelectFilterProps = InputAttrs & {
@@ -7,7 +7,6 @@ type SelectFilterProps = InputAttrs & {
7
7
  };
8
8
  export default class SelectFilter extends Component<SelectFilterProps> {
9
9
  static defaultProps: {
10
- placeholder: string;
11
10
  inputRef: typeof noop;
12
11
  };
13
12
  componentWillUnmount(): void;
@@ -15,6 +14,6 @@ export default class SelectFilter extends Component<SelectFilterProps> {
15
14
  blur(): void;
16
15
  input?: HTMLInputElement | HTMLTextAreaElement | null;
17
16
  inputRef: (el: HTMLInputElement | HTMLTextAreaElement | null) => void;
18
- render(): JSX.Element;
17
+ render(): React.JSX.Element;
19
18
  }
20
19
  export {};
@@ -4,11 +4,11 @@ import classNames from 'classnames';
4
4
  import Input from '../input/input';
5
5
  import sniffr from '../global/sniffer';
6
6
  import { ActiveItemContext } from '../list/list';
7
+ import { I18nContext } from '../i18n/i18n-context';
7
8
  import styles from './select-popup.css';
8
9
  function noop() { }
9
10
  export default class SelectFilter extends Component {
10
11
  static defaultProps = {
11
- placeholder: 'Filter items',
12
12
  inputRef: noop
13
13
  };
14
14
  componentWillUnmount() {
@@ -34,7 +34,9 @@ export default class SelectFilter extends Component {
34
34
  const { className, listId, ...restProps } = this.props;
35
35
  const classes = classNames(styles.filter, className);
36
36
  return (<ActiveItemContext.ValueContext.Consumer>
37
- {activeItemId => (<Input {...restProps} aria-owns={listId} aria-activedescendant={activeItemId} autoComplete="off" autoFocus borderless inputRef={this.inputRef} className={classes}/>)}
37
+ {activeItemId => (<I18nContext.Consumer>
38
+ {({ translate }) => (<Input {...restProps} placeholder={restProps.placeholder ?? translate('filterItems')} aria-owns={listId} aria-activedescendant={activeItemId} autoComplete="off" autoFocus borderless inputRef={this.inputRef} className={classes}/>)}
39
+ </I18nContext.Consumer>)}
38
40
  </ActiveItemContext.ValueContext.Consumer>);
39
41
  }
40
42
  }
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * @description Displays a popup with select's options.
3
3
  */
4
- import React, { CSSProperties, PureComponent, ReactNode, SyntheticEvent } from 'react';
4
+ import React, { ComponentType, CSSProperties, PureComponent, ReactNode, Ref, SyntheticEvent } from 'react';
5
+ import PropTypes from 'prop-types';
5
6
  import { IconType } from '../icon/icon';
6
7
  import Popup from '../popup/popup';
7
8
  import { Directions } from '../popup/position';
@@ -9,6 +10,7 @@ import List, { SelectHandlerParams } from '../list/list';
9
10
  import Caret from '../caret/caret';
10
11
  import { ListDataItem } from '../list/consts';
11
12
  import { ShortcutsMap } from '../shortcuts/core';
13
+ import { TagAttrs } from '../tag/tag';
12
14
  import { SelectItem } from './select';
13
15
  export type FilterFn<T> = (itemToCheck: SelectItem<T>, checkString: string, data: readonly SelectItem<T>[]) => boolean;
14
16
  export interface Filter<T = unknown> {
@@ -33,12 +35,16 @@ export interface TagsReset {
33
35
  }
34
36
  export interface Tags {
35
37
  reset?: TagsReset | null | undefined;
38
+ customTagComponent?: (tag: TagAttrs) => ReactNode;
36
39
  }
37
40
  export interface SelectPopupProps<T = unknown> {
38
41
  data: readonly ListDataItem<T>[];
39
42
  activeIndex: number | null;
40
43
  toolbar: ReactNode;
44
+ topbar: ReactNode;
41
45
  filter: boolean | Filter<T>;
46
+ filterIcon?: string | ComponentType | null | undefined;
47
+ filterRef?: Ref<HTMLInputElement>;
42
48
  message: string | null;
43
49
  anchorElement: HTMLElement | null;
44
50
  maxHeight: number;
@@ -46,6 +52,7 @@ export interface SelectPopupProps<T = unknown> {
46
52
  loading: boolean;
47
53
  onSelect: (item: ListDataItem<T>, event: Event, params?: SelectHandlerParams) => void;
48
54
  onCloseAttempt: (e?: Event | SyntheticEvent, isEsc?: boolean | undefined) => void;
55
+ onOutsideClick: (e: PointerEvent) => void;
49
56
  onFilter: (e: React.ChangeEvent<HTMLInputElement>) => void;
50
57
  onClear: (e: React.MouseEvent<HTMLButtonElement>) => void;
51
58
  onLoadMore: () => void;
@@ -101,16 +108,49 @@ export default class SelectPopup<T = unknown> extends PureComponent<SelectPopupP
101
108
  onListSelect: (selected: ListDataItem<T>, event?: Event | SyntheticEvent, opts?: SelectHandlerParams) => void;
102
109
  tabPress: (event: Event) => void;
103
110
  onClickHandler: () => void | undefined;
104
- getFilter(): JSX.Element | null;
111
+ getFilter(): React.JSX.Element | null;
105
112
  handleRemoveTag: (arg: ListDataItem<T>) => (event: SyntheticEvent) => void;
106
113
  handleTagClick: (arg: ListDataItem<T>) => () => void;
107
- getTags(): false | JSX.Element;
108
- getFilterWithTags(): JSX.Element | null;
109
- getBottomLine(): "" | JSX.Element | null;
114
+ getCustomTag(tags: Tags | boolean | null): ((tag: Pick<Pick<import("../tag/tag").TagProps, keyof import("../tag/tag").TagProps> & Pick<PropTypes.InferProps<{
115
+ onRemove: PropTypes.Requireable<(...args: any[]) => any>;
116
+ onClick: PropTypes.Requireable<(...args: any[]) => any>;
117
+ rgTagIcon: PropTypes.Requireable<NonNullable<PropTypes.ReactComponentLike | null | undefined>>;
118
+ icon: PropTypes.Requireable<string>;
119
+ avatar: PropTypes.Requireable<string>;
120
+ rgTagTitle: PropTypes.Requireable<string>;
121
+ readOnly: PropTypes.Requireable<boolean>;
122
+ disabled: PropTypes.Requireable<boolean>;
123
+ focused: PropTypes.Requireable<boolean>;
124
+ angled: PropTypes.Requireable<boolean>;
125
+ backgroundColor: PropTypes.Requireable<string>;
126
+ textColor: PropTypes.Requireable<string>;
127
+ children: PropTypes.Requireable<PropTypes.ReactNodeLike>;
128
+ className: PropTypes.Requireable<string>;
129
+ render: PropTypes.Requireable<(...args: any[]) => any>;
130
+ }>, never> & Pick<import("../tag/tag").TagProps, never>, never> & {
131
+ className?: string | null | undefined;
132
+ children?: React.ReactNode;
133
+ onClick?: ((event: React.MouseEvent<HTMLElement, MouseEvent>) => void) | undefined;
134
+ icon?: string | undefined;
135
+ disabled?: boolean | undefined;
136
+ avatar?: string | null | undefined;
137
+ readOnly?: boolean | undefined;
138
+ focused?: boolean | undefined;
139
+ render?: ((props: import("../tag/tag").TagRenderProps) => React.ReactNode) | undefined;
140
+ onRemove?: ((event: React.MouseEvent<HTMLElement, MouseEvent>) => void) | undefined;
141
+ rgTagIcon?: string | IconType | null | undefined;
142
+ rgTagTitle?: string | undefined;
143
+ angled?: boolean | null | undefined;
144
+ textColor?: string | undefined;
145
+ backgroundColor?: string | undefined;
146
+ } & {}) => React.ReactNode) | undefined;
147
+ getTags(): false | React.JSX.Element;
148
+ getFilterWithTags(): React.JSX.Element | null;
149
+ getBottomLine(): "" | React.JSX.Element | null;
110
150
  handleListResize: () => void;
111
- getList(ringPopupTarget: string | Element | undefined): JSX.Element | null;
151
+ getList(ringPopupTarget: string | Element | undefined): React.JSX.Element | null;
112
152
  handleSelectAll: () => void;
113
- getSelectAll: () => false | JSX.Element;
153
+ getSelectAll: () => false | React.JSX.Element;
114
154
  private _adjustListMaxHeight;
115
155
  popupRef: (el: Popup | null) => void;
116
156
  list?: List<T> | null;
@@ -121,6 +161,6 @@ export default class SelectPopup<T = unknown> extends PureComponent<SelectPopupP
121
161
  tab: (event: Event) => void;
122
162
  };
123
163
  popupFilterShortcutsMap: ShortcutsMap;
124
- render(): JSX.Element;
164
+ render(): React.JSX.Element;
125
165
  }
126
166
  export type SelectPopupAttrs<T = unknown> = JSX.LibraryManagedAttributes<typeof SelectPopup, SelectPopupProps<T>>;
@@ -22,6 +22,8 @@ import Shortcuts from '../shortcuts/shortcuts';
22
22
  import Button from '../button/button';
23
23
  import Text from '../text/text';
24
24
  import { ControlsHeight } from '../global/controls-height';
25
+ import { refObject } from '../global/prop-types';
26
+ import composeRefs from '../global/composeRefs';
25
27
  import { DEFAULT_DIRECTIONS } from '../popup/popup.consts';
26
28
  import SelectFilter from './select__filter';
27
29
  import styles from './select-popup.css';
@@ -34,7 +36,10 @@ export default class SelectPopup extends PureComponent {
34
36
  data: [],
35
37
  activeIndex: null,
36
38
  toolbar: null,
39
+ topbar: null,
37
40
  filter: false,
41
+ filterIcon: null,
42
+ filterRef: noop,
38
43
  multiple: false,
39
44
  message: null,
40
45
  anchorElement: null,
@@ -43,6 +48,7 @@ export default class SelectPopup extends PureComponent {
43
48
  loading: false,
44
49
  onSelect: noop,
45
50
  onCloseAttempt: noop,
51
+ onOutsideClick: noop,
46
52
  onFilter: noop,
47
53
  onClear: noop,
48
54
  onLoadMore: noop,
@@ -75,7 +81,8 @@ export default class SelectPopup extends PureComponent {
75
81
  }
76
82
  caret;
77
83
  handleNavigation(event, navigateLeft) {
78
- if (this.isEventTargetFilter(event) && this.caret != null && this.caret.getPosition() > 0 ||
84
+ if (this.isEventTargetFilter(event) && this.caret != null &&
85
+ Number(this.caret.getPosition()) > 0 ||
79
86
  !Array.isArray(this.props.selected)) {
80
87
  return;
81
88
  }
@@ -177,8 +184,8 @@ export default class SelectPopup extends PureComponent {
177
184
  getFilter() {
178
185
  if (this.props.filter || this.props.tags) {
179
186
  return (<div className={styles.filterWrapper} data-test="ring-select-popup-filter">
180
- {!this.props.tags && (<Icon glyph={searchIcon} className={styles.filterIcon} data-test-custom="ring-select-popup-filter-icon"/>)}
181
- <FilterWithShortcuts rgShortcutsOptions={this.state.popupFilterShortcutsOptions} rgShortcutsMap={this.popupFilterShortcutsMap} value={this.props.filterValue} inputRef={this.filterRef} onBlur={this.popupFilterOnBlur} onFocus={this.onFilterFocus} className="ring-js-shortcuts" inputClassName={classNames({ [styles.filterWithTagsInput]: this.props.tags })} placeholder={typeof this.props.filter === 'object'
187
+ {!this.props.tags && (<Icon glyph={this.props.filterIcon ?? searchIcon} className={styles.filterIcon} data-test-custom="ring-select-popup-filter-icon"/>)}
188
+ <FilterWithShortcuts rgShortcutsOptions={this.state.popupFilterShortcutsOptions} rgShortcutsMap={this.popupFilterShortcutsMap} value={this.props.filterValue} inputRef={composeRefs(this.filterRef, this.props.filterRef)} onBlur={this.popupFilterOnBlur} onFocus={this.onFilterFocus} className="ring-js-shortcuts" inputClassName={classNames({ [styles.filterWithTagsInput]: this.props.tags })} placeholder={typeof this.props.filter === 'object'
182
189
  ? this.props.filter.placeholder
183
190
  : undefined} height={this.props.tags ? ControlsHeight.S : ControlsHeight.L} onChange={this.props.onFilter} onClick={this.onClickHandler} onClear={this.props.tags ? undefined : this.props.onClear} data-test-custom="ring-select-popup-filter-input" listId={this.props.listId} enableShortcuts={Object.keys(this.popupFilterShortcutsMap)}/>
184
191
  </div>);
@@ -193,9 +200,15 @@ export default class SelectPopup extends PureComponent {
193
200
  });
194
201
  }
195
202
  });
203
+ getCustomTag(tags) {
204
+ if (tags !== null && typeof tags !== 'boolean') {
205
+ return tags.customTagComponent;
206
+ }
207
+ return undefined;
208
+ }
196
209
  getTags() {
197
210
  return Array.isArray(this.props.selected) && (<div>
198
- <TagsList tags={this.props.selected} activeIndex={this.state.tagsActiveIndex} handleRemove={this.handleRemoveTag} handleClick={this.handleTagClick} disabled={this.props.disabled}/>
211
+ <TagsList tags={this.props.selected} activeIndex={this.state.tagsActiveIndex} handleRemove={this.handleRemoveTag} handleClick={this.handleTagClick} disabled={this.props.disabled} customTagComponent={this.getCustomTag(this.props.tags)}/>
199
212
  </div>);
200
213
  }
201
214
  getFilterWithTags() {
@@ -278,7 +291,7 @@ export default class SelectPopup extends PureComponent {
278
291
  const anchorNode = this.props.anchorElement;
279
292
  const containerNode = getPopupContainer(ringPopupTarget) || document.documentElement;
280
293
  return anchorNode != null
281
- ? Math.min(directions.reduce((maxHeight, direction) => (Math.max(maxHeight, maxHeightForDirection(direction, anchorNode, getStyles(containerNode).position !== 'static' ? containerNode : undefined) ?? 0)), minMaxHeight), userDefinedMaxHeight)
294
+ ? Math.min(directions.reduce((maxHeight, direction) => (Math.max(maxHeight, maxHeightForDirection(direction, anchorNode, getStyles(containerNode).position !== 'static' ? containerNode : null) ?? 0)), minMaxHeight), userDefinedMaxHeight)
282
295
  : userDefinedMaxHeight;
283
296
  });
284
297
  popupRef = (el) => {
@@ -312,7 +325,7 @@ export default class SelectPopup extends PureComponent {
312
325
  right: event => this.handleNavigation(event)
313
326
  };
314
327
  render() {
315
- const { toolbar, className, multiple, hidden, isInputMode, anchorElement, minWidth, onCloseAttempt, directions, top, left, style, dir, filter } = this.props;
328
+ const { toolbar, topbar, className, multiple, hidden, isInputMode, anchorElement, minWidth, onCloseAttempt, onOutsideClick, directions, top, left, style, dir, filter } = this.props;
316
329
  const classes = classNames(styles.popup, className);
317
330
  return (<PopupTargetContext.Consumer>
318
331
  {ringPopupTarget => {
@@ -321,11 +334,12 @@ export default class SelectPopup extends PureComponent {
321
334
  multiple.selectAll && this.getSelectAll();
322
335
  const list = this.getList(this.props.ringPopupTarget || ringPopupTarget);
323
336
  const bottomLine = this.getBottomLine();
324
- const hasContent = filterWithTags || selectAll || list || bottomLine || toolbar;
325
- return (<Popup trapFocus={false} ref={this.popupRef} hidden={hidden || !hasContent} attached={isInputMode} className={classes} dontCloseOnAnchorClick anchorElement={anchorElement} minWidth={minWidth} onCloseAttempt={onCloseAttempt} directions={directions} top={top} left={left} onMouseDown={this.mouseDownHandler} target={this.props.ringPopupTarget} autoCorrectTopOverflow={false} style={style}>
337
+ const hasContent = filterWithTags || selectAll || list || bottomLine || toolbar || topbar;
338
+ return (<Popup trapFocus={false} ref={this.popupRef} hidden={hidden || !hasContent} attached={isInputMode} className={classes} dontCloseOnAnchorClick anchorElement={anchorElement} minWidth={minWidth} onCloseAttempt={onCloseAttempt} onOutsideClick={onOutsideClick} directions={directions} top={top} left={left} onMouseDown={this.mouseDownHandler} target={this.props.ringPopupTarget} autoCorrectTopOverflow={false} style={style}>
326
339
  <div dir={dir}>
327
340
  {!hidden && filter &&
328
341
  (<Shortcuts map={this.shortcutsMap} scope={this.shortcutsScope}/>)}
342
+ {topbar}
329
343
  {/* Add empty div to prevent the change of List position in DOM*/}
330
344
  {hidden ? <div /> : filterWithTags}
331
345
  {selectAll}
@@ -354,6 +368,11 @@ SelectPopup.propTypes = {
354
368
  placeholder: PropTypes.string
355
369
  })]),
356
370
  filterValue: PropTypes.string,
371
+ filterIcon: PropTypes.oneOfType([PropTypes.string, PropTypes.elementType]),
372
+ filterRef: PropTypes.oneOfType([
373
+ PropTypes.func,
374
+ refObject(PropTypes.instanceOf(HTMLInputElement))
375
+ ]),
357
376
  hidden: PropTypes.bool,
358
377
  isInputMode: PropTypes.bool,
359
378
  listId: PropTypes.string,
@@ -369,6 +388,7 @@ SelectPopup.propTypes = {
369
388
  loading: PropTypes.bool,
370
389
  onClear: PropTypes.func,
371
390
  onCloseAttempt: PropTypes.func,
391
+ onOutsideClick: PropTypes.func,
372
392
  onEmptyPopupEnter: PropTypes.func,
373
393
  onFilter: PropTypes.func,
374
394
  onLoadMore: PropTypes.func,
@@ -380,5 +400,6 @@ SelectPopup.propTypes = {
380
400
  style: PropTypes.object,
381
401
  tags: PropTypes.object,
382
402
  toolbar: PropTypes.node,
403
+ topbar: PropTypes.node,
383
404
  top: PropTypes.number
384
405
  };
@@ -11,7 +11,7 @@ export interface ShortcutsHOCProps {
11
11
  export default function shortcutsHOC<P extends {}>(ComposedComponent: ComponentType<P> | string): {
12
12
  new (props: (P & ShortcutsHOCProps) | Readonly<P & ShortcutsHOCProps>): {
13
13
  _shortcutsScopeUid: string;
14
- render(): JSX.Element;
14
+ render(): React.JSX.Element;
15
15
  context: unknown;
16
16
  setState<K extends never>(state: {} | ((prevState: Readonly<{}>, props: Readonly<P & ShortcutsHOCProps>) => {} | Pick<{}, K> | null) | Pick<{}, K> | null, callback?: (() => void) | undefined): void;
17
17
  forceUpdate(callback?: (() => void) | undefined): void;
@@ -35,7 +35,7 @@ export default function shortcutsHOC<P extends {}>(ComposedComponent: ComponentT
35
35
  };
36
36
  new (props: P & ShortcutsHOCProps, context: any): {
37
37
  _shortcutsScopeUid: string;
38
- render(): JSX.Element;
38
+ render(): React.JSX.Element;
39
39
  context: unknown;
40
40
  setState<K extends never>(state: {} | ((prevState: Readonly<{}>, props: Readonly<P & ShortcutsHOCProps>) => {} | Pick<{}, K> | null) | Pick<{}, K> | null, callback?: (() => void) | undefined): void;
41
41
  forceUpdate(callback?: (() => void) | undefined): void;
@@ -24,5 +24,5 @@ export default class Shortcuts extends PureComponent<ShortcutsProps> {
24
24
  componentWillUnmount(): void;
25
25
  turnShorcutsOn(): void;
26
26
  turnShorcutsOff(): void;
27
- render(): string | number | true | import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | import("react").ReactFragment | null;
27
+ render(): string | number | true | import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | Iterable<import("react").ReactNode> | null;
28
28
  }
@@ -25,8 +25,6 @@ const getTitle = title => (typeof title === 'function' ? title() : title);
25
25
 
26
26
 
27
27
  class HintPopupService extends RingAngularComponent {
28
- static $inject = ['dialog', 'shortcuts'];
29
-
30
28
  show(popupConfig = {}, shortcutModes, okButtonLabel = 'Got it', searchPlaceholder = 'Search') {
31
29
  const {dialog, shortcuts} = this.$inject;
32
30
 
@@ -67,6 +65,7 @@ class HintPopupService extends RingAngularComponent {
67
65
  }, popupConfig));
68
66
  }
69
67
  }
68
+ HintPopupService.$inject = ['dialog', 'shortcuts'];
70
69
 
71
70
  function shortcutKeySymbolFilter(shortcut) {
72
71
  return getShortcutTitle(shortcut);