@jetbrains/ring-ui 6.0.6-beta.0 → 6.0.6

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 (510) hide show
  1. package/README.md +1 -1
  2. package/components/alert/alert.css +146 -0
  3. package/components/alert/alert.d.ts +113 -0
  4. package/components/alert/alert.js +186 -0
  5. package/components/alert/container.css +26 -0
  6. package/components/alert/container.d.ts +15 -0
  7. package/components/alert/container.js +30 -0
  8. package/components/alert-service/alert-service.d.ts +36 -0
  9. package/components/alert-service/alert-service.js +108 -0
  10. package/components/alert-service/alert-service.stories.css +17 -0
  11. package/components/analytics/analytics.d.ts +18 -0
  12. package/components/analytics/analytics.js +18 -0
  13. package/components/analytics/analytics__custom-plugin.d.ts +28 -0
  14. package/components/analytics/analytics__custom-plugin.js +58 -0
  15. package/components/auth/auth.d.ts +3 -0
  16. package/components/auth/auth.js +42 -0
  17. package/components/auth/auth__core.d.ts +236 -0
  18. package/components/auth/auth__core.js +834 -0
  19. package/components/auth/background-flow.d.ts +31 -0
  20. package/components/auth/background-flow.js +97 -0
  21. package/components/auth/down-notification.css +15 -0
  22. package/components/auth/down-notification.d.ts +15 -0
  23. package/components/auth/down-notification.js +52 -0
  24. package/components/auth/iframe-flow.d.ts +20 -0
  25. package/components/auth/iframe-flow.js +81 -0
  26. package/components/auth/request-builder.d.ts +48 -0
  27. package/components/auth/request-builder.js +64 -0
  28. package/components/auth/response-parser.d.ts +70 -0
  29. package/components/auth/response-parser.js +99 -0
  30. package/components/auth/storage.d.ts +112 -0
  31. package/components/auth/storage.js +224 -0
  32. package/components/auth/token-validator.d.ts +93 -0
  33. package/components/auth/token-validator.js +169 -0
  34. package/components/auth/window-flow.d.ts +26 -0
  35. package/components/auth/window-flow.js +102 -0
  36. package/components/auth-dialog/auth-dialog.css +54 -0
  37. package/components/auth-dialog/auth-dialog.d.ts +60 -0
  38. package/components/auth-dialog/auth-dialog.js +93 -0
  39. package/components/auth-dialog-service/auth-dialog-service.d.ts +6 -0
  40. package/components/auth-dialog-service/auth-dialog-service.js +26 -0
  41. package/components/avatar/avatar-example-datauri.d.ts +1 -0
  42. package/components/avatar/avatar-example-datauri.js +24 -0
  43. package/components/avatar/avatar.css +27 -0
  44. package/components/avatar/avatar.d.ts +52 -0
  45. package/components/avatar/avatar.js +98 -0
  46. package/components/avatar/fallback-avatar.d.ts +17 -0
  47. package/components/avatar/fallback-avatar.js +113 -0
  48. package/components/badge/badge.css +42 -0
  49. package/components/badge/badge.d.ts +24 -0
  50. package/components/badge/badge.js +35 -0
  51. package/components/button/button.css +397 -0
  52. package/components/button/button.d.ts +67 -0
  53. package/components/button/button.js +70 -0
  54. package/components/button/button__classes.d.ts +2 -0
  55. package/components/button/button__classes.js +18 -0
  56. package/components/button-group/button-group.css +236 -0
  57. package/components/button-group/button-group.d.ts +18 -0
  58. package/components/button-group/button-group.js +21 -0
  59. package/components/button-group/caption.d.ts +8 -0
  60. package/components/button-group/caption.js +14 -0
  61. package/components/button-set/button-set.css +21 -0
  62. package/components/button-set/button-set.d.ts +16 -0
  63. package/components/button-set/button-set.js +22 -0
  64. package/components/button-toolbar/button-toolbar.css +25 -0
  65. package/components/button-toolbar/button-toolbar.d.ts +16 -0
  66. package/components/button-toolbar/button-toolbar.js +20 -0
  67. package/components/caret/caret.d.ts +66 -0
  68. package/components/caret/caret.js +216 -0
  69. package/components/checkbox/checkbox.css +146 -0
  70. package/components/checkbox/checkbox.d.ts +45 -0
  71. package/components/checkbox/checkbox.js +72 -0
  72. package/components/clipboard/clipboard-fallback.d.ts +2 -0
  73. package/components/clipboard/clipboard-fallback.js +44 -0
  74. package/components/clipboard/clipboard.d.ts +5 -0
  75. package/components/clipboard/clipboard.js +41 -0
  76. package/components/code/code.css +29 -0
  77. package/components/code/code.d.ts +44 -0
  78. package/components/code/code.js +94 -0
  79. package/components/code/highlight.css +112 -0
  80. package/components/collapse/collapse-content.d.ts +11 -0
  81. package/components/collapse/collapse-content.js +72 -0
  82. package/components/collapse/collapse-context.d.ts +10 -0
  83. package/components/collapse/collapse-context.js +10 -0
  84. package/components/collapse/collapse-control.d.ts +11 -0
  85. package/components/collapse/collapse-control.js +22 -0
  86. package/components/collapse/collapse.css +40 -0
  87. package/components/collapse/collapse.d.ts +12 -0
  88. package/components/collapse/collapse.js +26 -0
  89. package/components/collapse/collapse.stories.css +25 -0
  90. package/components/collapse/consts.d.ts +4 -0
  91. package/components/collapse/consts.js +4 -0
  92. package/components/collapse/utils.d.ts +1 -0
  93. package/components/collapse/utils.js +1 -0
  94. package/components/confirm/confirm.css +7 -0
  95. package/components/confirm/confirm.d.ts +48 -0
  96. package/components/confirm/confirm.js +59 -0
  97. package/components/confirm-service/confirm-service.d.ts +21 -0
  98. package/components/confirm-service/confirm-service.js +52 -0
  99. package/components/content-layout/content-layout.css +108 -0
  100. package/components/content-layout/content-layout.d.ts +26 -0
  101. package/components/content-layout/content-layout.js +45 -0
  102. package/components/content-layout/sidebar.d.ts +31 -0
  103. package/components/content-layout/sidebar.js +76 -0
  104. package/components/contenteditable/contenteditable.d.ts +47 -0
  105. package/components/contenteditable/contenteditable.js +47 -0
  106. package/components/control-label/control-label.css +23 -0
  107. package/components/control-label/control-label.d.ts +11 -0
  108. package/components/control-label/control-label.js +22 -0
  109. package/components/data-list/data-list.css +97 -0
  110. package/components/data-list/data-list.d.ts +85 -0
  111. package/components/data-list/data-list.js +119 -0
  112. package/components/data-list/data-list.mock.d.ts +16 -0
  113. package/components/data-list/data-list.mock.js +207 -0
  114. package/components/data-list/item.d.ts +50 -0
  115. package/components/data-list/item.js +114 -0
  116. package/components/data-list/selection.d.ts +16 -0
  117. package/components/data-list/selection.js +81 -0
  118. package/components/data-list/title.d.ts +26 -0
  119. package/components/data-list/title.js +65 -0
  120. package/components/date-picker/consts.d.ts +98 -0
  121. package/components/date-picker/consts.js +44 -0
  122. package/components/date-picker/date-input.d.ts +47 -0
  123. package/components/date-picker/date-input.js +91 -0
  124. package/components/date-picker/date-picker.css +602 -0
  125. package/components/date-picker/date-picker.d.ts +77 -0
  126. package/components/date-picker/date-picker.js +218 -0
  127. package/components/date-picker/date-popup.d.ts +55 -0
  128. package/components/date-picker/date-popup.js +347 -0
  129. package/components/date-picker/day.d.ts +30 -0
  130. package/components/date-picker/day.js +88 -0
  131. package/components/date-picker/formats.d.ts +2 -0
  132. package/components/date-picker/formats.js +1 -0
  133. package/components/date-picker/month-names.d.ts +13 -0
  134. package/components/date-picker/month-names.js +62 -0
  135. package/components/date-picker/month-slider.d.ts +29 -0
  136. package/components/date-picker/month-slider.js +56 -0
  137. package/components/date-picker/month.d.ts +14 -0
  138. package/components/date-picker/month.js +33 -0
  139. package/components/date-picker/months.d.ts +11 -0
  140. package/components/date-picker/months.js +101 -0
  141. package/components/date-picker/weekdays.d.ts +13 -0
  142. package/components/date-picker/weekdays.js +24 -0
  143. package/components/date-picker/years.d.ts +25 -0
  144. package/components/date-picker/years.js +87 -0
  145. package/components/dialog/dialog.css +137 -0
  146. package/components/dialog/dialog.d.ts +64 -0
  147. package/components/dialog/dialog.js +128 -0
  148. package/components/dialog/dialog__body-scroll-preventer.d.ts +9 -0
  149. package/components/dialog/dialog__body-scroll-preventer.js +43 -0
  150. package/components/dropdown/anchor.d.ts +11 -0
  151. package/components/dropdown/anchor.js +16 -0
  152. package/components/dropdown/dropdown.css +18 -0
  153. package/components/dropdown/dropdown.d.ts +87 -0
  154. package/components/dropdown/dropdown.js +159 -0
  155. package/components/dropdown-menu/dropdown-menu.d.ts +36 -0
  156. package/components/dropdown-menu/dropdown-menu.js +56 -0
  157. package/components/editable-heading/editable-heading.css +198 -0
  158. package/components/editable-heading/editable-heading.d.ts +32 -0
  159. package/components/editable-heading/editable-heading.js +141 -0
  160. package/components/error-bubble/error-bubble-legacy.css +77 -0
  161. package/components/error-bubble/error-bubble.css +54 -0
  162. package/components/error-bubble/error-bubble.d.ts +18 -0
  163. package/components/error-bubble/error-bubble.js +28 -0
  164. package/components/error-message/error-message.css +37 -0
  165. package/components/error-message/error-message.d.ts +27 -0
  166. package/components/error-message/error-message.js +37 -0
  167. package/components/error-page/error-page.css +24 -0
  168. package/components/error-page/error-page.gif +0 -0
  169. package/components/footer/footer.css +83 -0
  170. package/components/footer/footer.d.ts +28 -0
  171. package/components/footer/footer.js +97 -0
  172. package/components/form/form.css +266 -0
  173. package/components/form/form.stories.js +138 -0
  174. package/components/global/compose.d.ts +7 -0
  175. package/components/global/compose.js +4 -0
  176. package/components/global/composeRefs.d.ts +3 -0
  177. package/components/global/composeRefs.js +8 -0
  178. package/components/global/controls-height.d.ts +9 -0
  179. package/components/global/controls-height.js +16 -0
  180. package/components/global/create-stateful-context.d.ts +27 -0
  181. package/components/global/create-stateful-context.js +38 -0
  182. package/components/global/data-tests.d.ts +3 -0
  183. package/components/global/data-tests.js +17 -0
  184. package/components/global/dom.d.ts +37 -0
  185. package/components/global/dom.js +83 -0
  186. package/components/global/focus-sensor-hoc.d.ts +19 -0
  187. package/components/global/focus-sensor-hoc.js +102 -0
  188. package/components/global/fuzzy-highlight.d.ts +11 -0
  189. package/components/global/fuzzy-highlight.js +58 -0
  190. package/components/global/get-event-key.d.ts +2 -0
  191. package/components/global/get-event-key.js +100 -0
  192. package/components/global/get-uid.d.ts +1 -0
  193. package/components/global/get-uid.js +16 -0
  194. package/components/global/global.css +101 -0
  195. package/components/global/inject-styles.d.ts +3 -0
  196. package/components/global/inject-styles.js +12 -0
  197. package/components/global/linear-function.d.ts +6 -0
  198. package/components/global/linear-function.js +13 -0
  199. package/components/global/listeners.d.ts +8 -0
  200. package/components/global/listeners.js +27 -0
  201. package/components/global/memoize.d.ts +1 -0
  202. package/components/global/memoize.js +15 -0
  203. package/components/global/normalize-indent.d.ts +1 -0
  204. package/components/global/normalize-indent.js +30 -0
  205. package/components/global/promise-with-timeout.d.ts +5 -0
  206. package/components/global/promise-with-timeout.js +11 -0
  207. package/components/global/prop-types.d.ts +4 -0
  208. package/components/global/prop-types.js +4 -0
  209. package/components/global/react-dom-renderer.d.ts +16 -0
  210. package/components/global/react-dom-renderer.js +25 -0
  211. package/components/global/react-render-adapter.d.ts +1 -0
  212. package/components/global/react-render-adapter.js +3 -0
  213. package/components/global/rerender-hoc.d.ts +10 -0
  214. package/components/global/rerender-hoc.js +14 -0
  215. package/components/global/schedule-raf.d.ts +1 -0
  216. package/components/global/schedule-raf.js +27 -0
  217. package/components/global/sniffer.d.ts +3 -0
  218. package/components/global/sniffer.js +4 -0
  219. package/components/global/theme.d.ts +21 -0
  220. package/components/global/theme.js +70 -0
  221. package/components/global/trivial-template-tag.d.ts +1 -0
  222. package/components/global/trivial-template-tag.js +9 -0
  223. package/components/global/typescript-utils.d.ts +2 -0
  224. package/components/global/typescript-utils.js +2 -0
  225. package/components/global/url.d.ts +57 -0
  226. package/components/global/url.js +136 -0
  227. package/components/global/use-event-callback.d.ts +1 -0
  228. package/components/global/use-event-callback.js +14 -0
  229. package/components/global/variables.css +179 -0
  230. package/components/global/variables.d.ts +89 -0
  231. package/components/global/variables.js +1 -0
  232. package/components/global/variables_dark.css +132 -0
  233. package/components/grid/col.d.ts +31 -0
  234. package/components/grid/col.js +49 -0
  235. package/components/grid/grid.css +915 -0
  236. package/components/grid/grid.d.ts +14 -0
  237. package/components/grid/grid.js +22 -0
  238. package/components/grid/row.d.ts +40 -0
  239. package/components/grid/row.js +51 -0
  240. package/components/group/group.css +7 -0
  241. package/components/group/group.d.ts +12 -0
  242. package/components/group/group.js +20 -0
  243. package/components/header/header.css +169 -0
  244. package/components/header/header.d.ts +34 -0
  245. package/components/header/header.js +46 -0
  246. package/components/header/logo.d.ts +14 -0
  247. package/components/header/logo.js +22 -0
  248. package/components/header/profile.d.ts +75 -0
  249. package/components/header/profile.js +119 -0
  250. package/components/header/services-link.d.ts +25 -0
  251. package/components/header/services-link.js +26 -0
  252. package/components/header/services.css +97 -0
  253. package/components/header/services.d.ts +33 -0
  254. package/components/header/services.js +62 -0
  255. package/components/header/smart-profile.d.ts +36 -0
  256. package/components/header/smart-profile.js +86 -0
  257. package/components/header/smart-services.d.ts +26 -0
  258. package/components/header/smart-services.js +49 -0
  259. package/components/header/tray-icon.d.ts +32 -0
  260. package/components/header/tray-icon.js +20 -0
  261. package/components/header/tray.d.ts +9 -0
  262. package/components/header/tray.js +18 -0
  263. package/components/heading/heading.css +68 -0
  264. package/components/heading/heading.d.ts +25 -0
  265. package/components/heading/heading.js +52 -0
  266. package/components/http/http.d.ts +61 -0
  267. package/components/http/http.js +192 -0
  268. package/components/http/http.mock.d.ts +20 -0
  269. package/components/http/http.mock.js +52 -0
  270. package/components/hub-source/hub-source.d.ts +44 -0
  271. package/components/hub-source/hub-source.js +107 -0
  272. package/components/hub-source/hub-source__user.d.ts +4 -0
  273. package/components/hub-source/hub-source__user.js +20 -0
  274. package/components/hub-source/hub-source__users-groups.d.ts +24 -0
  275. package/components/hub-source/hub-source__users-groups.js +53 -0
  276. package/components/i18n/README.md +46 -0
  277. package/components/i18n/i18n-context.d.ts +13 -0
  278. package/components/i18n/i18n-context.js +14 -0
  279. package/components/i18n/i18n.d.ts +59 -0
  280. package/components/i18n/i18n.js +26 -0
  281. package/components/i18n/messages.json +53 -0
  282. package/components/icon/icon.css +100 -0
  283. package/components/icon/icon.d.ts +43 -0
  284. package/components/icon/icon.js +69 -0
  285. package/components/icon/icon__constants.d.ts +30 -0
  286. package/components/icon/icon__constants.js +32 -0
  287. package/components/icon/icon__svg.d.ts +15 -0
  288. package/components/icon/icon__svg.js +58 -0
  289. package/components/icon/index.d.ts +2 -0
  290. package/components/icon/index.js +2 -0
  291. package/components/input/input-legacy.css +123 -0
  292. package/components/input/input.css +194 -0
  293. package/components/input/input.d.ts +77 -0
  294. package/components/input/input.js +165 -0
  295. package/components/input-size/input-size.css +82 -0
  296. package/components/input-size/input-size.stories.js +73 -0
  297. package/components/island/adaptive-island-hoc.d.ts +61 -0
  298. package/components/island/adaptive-island-hoc.js +28 -0
  299. package/components/island/content.d.ts +43 -0
  300. package/components/island/content.js +100 -0
  301. package/components/island/header.d.ts +8 -0
  302. package/components/island/header.js +78 -0
  303. package/components/island/island.css +131 -0
  304. package/components/island/island.d.ts +78 -0
  305. package/components/island/island.js +31 -0
  306. package/components/island-legacy/content-legacy.d.ts +10 -0
  307. package/components/island-legacy/content-legacy.js +17 -0
  308. package/components/island-legacy/header-legacy.d.ts +10 -0
  309. package/components/island-legacy/header-legacy.js +19 -0
  310. package/components/island-legacy/island-legacy.css +98 -0
  311. package/components/island-legacy/island-legacy.d.ts +12 -0
  312. package/components/island-legacy/island-legacy.js +19 -0
  313. package/components/line/line.css +14 -0
  314. package/components/link/clickableLink.d.ts +20 -0
  315. package/components/link/clickableLink.js +33 -0
  316. package/components/link/link.css +64 -0
  317. package/components/link/link.d.ts +138 -0
  318. package/components/link/link.js +44 -0
  319. package/components/list/consts.d.ts +77 -0
  320. package/components/list/consts.js +25 -0
  321. package/components/list/list.css +298 -0
  322. package/components/list/list.d.ts +205 -0
  323. package/components/list/list.js +590 -0
  324. package/components/list/list.stories.css +3 -0
  325. package/components/list/list__custom.d.ts +6 -0
  326. package/components/list/list__custom.js +52 -0
  327. package/components/list/list__hint.d.ts +15 -0
  328. package/components/list/list__hint.js +16 -0
  329. package/components/list/list__item.d.ts +8 -0
  330. package/components/list/list__item.js +130 -0
  331. package/components/list/list__link.d.ts +9 -0
  332. package/components/list/list__link.js +43 -0
  333. package/components/list/list__separator.d.ts +5 -0
  334. package/components/list/list__separator.js +21 -0
  335. package/components/list/list__title.d.ts +5 -0
  336. package/components/list/list__title.js +28 -0
  337. package/components/list/list__users-groups-source.d.ts +27 -0
  338. package/components/list/list__users-groups-source.js +74 -0
  339. package/components/loader/loader.css +27 -0
  340. package/components/loader/loader.d.ts +28 -0
  341. package/components/loader/loader.js +44 -0
  342. package/components/loader/loader__core.d.ts +75 -0
  343. package/components/loader/loader__core.js +219 -0
  344. package/components/loader-inline/loader-inline.css +73 -0
  345. package/components/loader-inline/loader-inline.d.ts +18 -0
  346. package/components/loader-inline/loader-inline.js +27 -0
  347. package/components/loader-screen/loader-screen.css +29 -0
  348. package/components/loader-screen/loader-screen.d.ts +17 -0
  349. package/components/loader-screen/loader-screen.js +25 -0
  350. package/components/login-dialog/login-dialog.css +23 -0
  351. package/components/login-dialog/login-dialog.d.ts +47 -0
  352. package/components/login-dialog/login-dialog.js +84 -0
  353. package/components/login-dialog/service.d.ts +2 -0
  354. package/components/login-dialog/service.js +24 -0
  355. package/components/markdown/markdown.css +126 -0
  356. package/components/markdown/markdown.d.ts +12 -0
  357. package/components/markdown/markdown.js +25 -0
  358. package/components/message/message.css +61 -0
  359. package/components/message/message.d.ts +55 -0
  360. package/components/message/message.js +129 -0
  361. package/components/old-browsers-message/old-browsers-message.css +26 -0
  362. package/components/old-browsers-message/old-browsers-message.d.ts +2 -0
  363. package/components/old-browsers-message/old-browsers-message.js +83 -0
  364. package/components/old-browsers-message/old-browsers-message__stop.d.ts +1 -0
  365. package/components/old-browsers-message/old-browsers-message__stop.js +2 -0
  366. package/components/old-browsers-message/white-list.d.ts +2 -0
  367. package/components/old-browsers-message/white-list.js +25 -0
  368. package/components/pager/pager.css +19 -0
  369. package/components/pager/pager.d.ts +78 -0
  370. package/components/pager/pager.js +223 -0
  371. package/components/palette/palette.css +216 -0
  372. package/components/panel/panel.css +20 -0
  373. package/components/panel/panel.d.ts +12 -0
  374. package/components/panel/panel.js +20 -0
  375. package/components/permissions/permissions.d.ts +111 -0
  376. package/components/permissions/permissions.js +177 -0
  377. package/components/permissions/permissions__cache.d.ts +93 -0
  378. package/components/permissions/permissions__cache.js +228 -0
  379. package/components/popup/popup.consts.d.ts +37 -0
  380. package/components/popup/popup.consts.js +45 -0
  381. package/components/popup/popup.css +34 -0
  382. package/components/popup/popup.d.ts +147 -0
  383. package/components/popup/popup.js +312 -0
  384. package/components/popup/popup.target.d.ts +7 -0
  385. package/components/popup/popup.target.js +15 -0
  386. package/components/popup/position.d.ts +30 -0
  387. package/components/popup/position.js +202 -0
  388. package/components/popup-menu/popup-menu.d.ts +80 -0
  389. package/components/popup-menu/popup-menu.js +41 -0
  390. package/components/progress-bar/progress-bar.css +82 -0
  391. package/components/progress-bar/progress-bar.d.ts +64 -0
  392. package/components/progress-bar/progress-bar.js +76 -0
  393. package/components/query-assist/query-assist.css +275 -0
  394. package/components/query-assist/query-assist.d.ts +306 -0
  395. package/components/query-assist/query-assist.js +847 -0
  396. package/components/query-assist/query-assist__suggestions.d.ts +29 -0
  397. package/components/query-assist/query-assist__suggestions.js +60 -0
  398. package/components/radio/radio.css +122 -0
  399. package/components/radio/radio.d.ts +18 -0
  400. package/components/radio/radio.js +27 -0
  401. package/components/radio/radio__item.d.ts +28 -0
  402. package/components/radio/radio__item.js +41 -0
  403. package/components/select/select-popup.css +103 -0
  404. package/components/select/select.css +235 -0
  405. package/components/select/select.d.ts +276 -0
  406. package/components/select/select.js +957 -0
  407. package/components/select/select__filter.d.ts +19 -0
  408. package/components/select/select__filter.js +49 -0
  409. package/components/select/select__popup.d.ts +166 -0
  410. package/components/select/select__popup.js +408 -0
  411. package/components/shortcuts/core.d.ts +74 -0
  412. package/components/shortcuts/core.js +191 -0
  413. package/components/shortcuts/shortcut-title.d.ts +1 -0
  414. package/components/shortcuts/shortcut-title.js +50 -0
  415. package/components/shortcuts/shortcuts-hoc.d.ts +65 -0
  416. package/components/shortcuts/shortcuts-hoc.js +19 -0
  417. package/components/shortcuts/shortcuts.d.ts +28 -0
  418. package/components/shortcuts/shortcuts.js +50 -0
  419. package/components/sidebar/sidebar.css +157 -0
  420. package/components/storage/storage.d.ts +18 -0
  421. package/components/storage/storage.js +22 -0
  422. package/components/storage/storage__fallback.d.ts +79 -0
  423. package/components/storage/storage__fallback.js +181 -0
  424. package/components/storage/storage__local.d.ts +38 -0
  425. package/components/storage/storage__local.js +119 -0
  426. package/components/tab-trap/tab-trap.css +6 -0
  427. package/components/tab-trap/tab-trap.d.ts +43 -0
  428. package/components/tab-trap/tab-trap.js +125 -0
  429. package/components/table/cell.d.ts +13 -0
  430. package/components/table/cell.js +16 -0
  431. package/components/table/disable-hover-hoc.d.ts +64 -0
  432. package/components/table/disable-hover-hoc.js +32 -0
  433. package/components/table/header-cell.d.ts +43 -0
  434. package/components/table/header-cell.js +56 -0
  435. package/components/table/header.d.ts +56 -0
  436. package/components/table/header.js +67 -0
  437. package/components/table/multitable.d.ts +25 -0
  438. package/components/table/multitable.js +81 -0
  439. package/components/table/row-with-focus-sensor.d.ts +18 -0
  440. package/components/table/row-with-focus-sensor.js +25 -0
  441. package/components/table/row.d.ts +59 -0
  442. package/components/table/row.js +154 -0
  443. package/components/table/selection-adapter.d.ts +5 -0
  444. package/components/table/selection-adapter.js +10 -0
  445. package/components/table/selection-shortcuts-hoc.d.ts +17 -0
  446. package/components/table/selection-shortcuts-hoc.js +146 -0
  447. package/components/table/selection.d.ts +47 -0
  448. package/components/table/selection.js +150 -0
  449. package/components/table/smart-table.d.ts +64 -0
  450. package/components/table/smart-table.js +40 -0
  451. package/components/table/table.css +259 -0
  452. package/components/table/table.d.ts +159 -0
  453. package/components/table/table.examples2.json +19 -0
  454. package/components/table/table.js +231 -0
  455. package/components/table/table.stories.json +45 -0
  456. package/components/table-legacy/table-legacy.css +346 -0
  457. package/components/table-legacy/table-legacy__toolbar.css +25 -0
  458. package/components/tabs/collapsible-more.d.ts +29 -0
  459. package/components/tabs/collapsible-more.js +97 -0
  460. package/components/tabs/collapsible-tab.d.ts +16 -0
  461. package/components/tabs/collapsible-tab.js +34 -0
  462. package/components/tabs/collapsible-tabs.d.ts +43 -0
  463. package/components/tabs/collapsible-tabs.js +196 -0
  464. package/components/tabs/custom-item.d.ts +9 -0
  465. package/components/tabs/custom-item.js +5 -0
  466. package/components/tabs/dumb-tabs.d.ts +35 -0
  467. package/components/tabs/dumb-tabs.js +56 -0
  468. package/components/tabs/smart-tabs.d.ts +20 -0
  469. package/components/tabs/smart-tabs.js +25 -0
  470. package/components/tabs/tab-link.d.ts +18 -0
  471. package/components/tabs/tab-link.js +24 -0
  472. package/components/tabs/tab.d.ts +27 -0
  473. package/components/tabs/tab.js +19 -0
  474. package/components/tabs/tabs.css +223 -0
  475. package/components/tabs/tabs.d.ts +7 -0
  476. package/components/tabs/tabs.js +7 -0
  477. package/components/tag/tag.css +184 -0
  478. package/components/tag/tag.d.ts +64 -0
  479. package/components/tag/tag.js +130 -0
  480. package/components/tags-input/tags-input.css +100 -0
  481. package/components/tags-input/tags-input.d.ts +138 -0
  482. package/components/tags-input/tags-input.js +275 -0
  483. package/components/tags-list/tags-list.d.ts +46 -0
  484. package/components/tags-list/tags-list.js +45 -0
  485. package/components/text/text.css +21 -0
  486. package/components/text/text.d.ts +23 -0
  487. package/components/text/text.js +31 -0
  488. package/components/toggle/toggle.css +198 -0
  489. package/components/toggle/toggle.d.ts +39 -0
  490. package/components/toggle/toggle.js +46 -0
  491. package/components/tooltip/tooltip.css +17 -0
  492. package/components/tooltip/tooltip.d.ts +65 -0
  493. package/components/tooltip/tooltip.js +126 -0
  494. package/components/user-agreement/service.d.ts +69 -0
  495. package/components/user-agreement/service.js +242 -0
  496. package/components/user-agreement/toolbox.eula.d.ts +2 -0
  497. package/components/user-agreement/toolbox.eula.js +160 -0
  498. package/components/user-agreement/user-agreement.css +29 -0
  499. package/components/user-agreement/user-agreement.d.ts +60 -0
  500. package/components/user-agreement/user-agreement.js +80 -0
  501. package/components/user-card/card.d.ts +70 -0
  502. package/components/user-card/card.js +89 -0
  503. package/components/user-card/smart-user-card-tooltip.d.ts +20 -0
  504. package/components/user-card/smart-user-card-tooltip.js +47 -0
  505. package/components/user-card/tooltip.d.ts +36 -0
  506. package/components/user-card/tooltip.js +43 -0
  507. package/components/user-card/user-card.css +123 -0
  508. package/components/user-card/user-card.d.ts +11 -0
  509. package/components/user-card/user-card.js +11 -0
  510. package/package.json +61 -61
@@ -0,0 +1,957 @@
1
+ import React, { Component, Fragment } from 'react';
2
+ import classNames from 'classnames';
3
+ import PropTypes from 'prop-types';
4
+ import chevronDownIcon from '@jetbrains/icons/chevron-down';
5
+ import closeIcon from '@jetbrains/icons/close-12px';
6
+ import deepEqual from 'deep-equal';
7
+ import { Anchor } from '../dropdown/dropdown';
8
+ import Avatar, { Size as AvatarSize } from '../avatar/avatar';
9
+ import Popup from '../popup/popup';
10
+ import List, { ActiveItemContext } from '../list/list';
11
+ import Input, { Size } from '../input/input';
12
+ import ControlLabel from '../control-label/control-label';
13
+ import Shortcuts from '../shortcuts/shortcuts';
14
+ import Button from '../button/button';
15
+ import dataTests from '../global/data-tests';
16
+ import getUID from '../global/get-uid';
17
+ import rerenderHOC from '../global/rerender-hoc';
18
+ import fuzzyHighlight from '../global/fuzzy-highlight';
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';
23
+ import { isArray } from '../global/typescript-utils';
24
+ import { ControlsHeight, ControlsHeightContext } from '../global/controls-height';
25
+ import inputStyles from '../input/input.css';
26
+ import SelectPopup from './select__popup';
27
+ import styles from './select.css';
28
+ /**
29
+ * @name Select
30
+ */
31
+ function noop() { }
32
+ /**
33
+ * @enum {number}
34
+ */
35
+ export var Type;
36
+ (function (Type) {
37
+ Type["BUTTON"] = "BUTTON";
38
+ Type["INPUT"] = "INPUT";
39
+ Type["CUSTOM"] = "CUSTOM";
40
+ Type["INLINE"] = "INLINE";
41
+ Type["INPUT_WITHOUT_CONTROLS"] = "INPUT_WITHOUT_CONTROLS";
42
+ })(Type || (Type = {}));
43
+ const ICONS_OFFSET = 5;
44
+ const ICON_WIDTH = 20;
45
+ const getStyle = memoize((iconsLength) => ({
46
+ paddingRight: ICONS_OFFSET + iconsLength * ICON_WIDTH
47
+ }));
48
+ const isInputMode = (type) => type === Type.INPUT || type === Type.INPUT_WITHOUT_CONTROLS;
49
+ function getLowerCaseLabel(item) {
50
+ if (List.isItemType(List.ListProps.Type.SEPARATOR, item) ||
51
+ List.isItemType(List.ListProps.Type.HINT, item) ||
52
+ typeof item.label !== 'string') {
53
+ return null;
54
+ }
55
+ return item.label.toLowerCase();
56
+ }
57
+ function doesLabelMatch(itemToCheck, fn) {
58
+ const lowerCaseLabel = getLowerCaseLabel(itemToCheck);
59
+ if (lowerCaseLabel == null) {
60
+ return true;
61
+ }
62
+ return fn(lowerCaseLabel);
63
+ }
64
+ function getFilterFn(filter) {
65
+ if (typeof filter === 'object') {
66
+ if (filter.fn) {
67
+ return filter.fn;
68
+ }
69
+ if (filter.fuzzy) {
70
+ return (itemToCheck, checkString) => doesLabelMatch(itemToCheck, lowerCaseLabel => fuzzyHighlight(checkString, lowerCaseLabel).matched);
71
+ }
72
+ }
73
+ return (itemToCheck, checkString) => doesLabelMatch(itemToCheck, lowerCaseLabel => lowerCaseLabel.indexOf(checkString) >= 0);
74
+ }
75
+ function buildMultipleMap(selected) {
76
+ return selected.reduce((acc, item) => {
77
+ acc[item.key] = true;
78
+ return acc;
79
+ }, {});
80
+ }
81
+ function getListItems(props, state, rawFilterString, data = props.data) {
82
+ let filterString = rawFilterString.trim();
83
+ if (isInputMode(props.type) && !props.allowAny && state.selected &&
84
+ !Array.isArray(state.selected) && filterString === state.selected.label) {
85
+ filterString = ''; // ignore multiple if it is exactly the selected item
86
+ }
87
+ const lowerCaseString = filterString.toLowerCase();
88
+ const filteredData = [];
89
+ let exactMatch = false;
90
+ const check = getFilterFn(props.filter);
91
+ for (let i = 0; i < data.length; i++) {
92
+ const item = { ...data[i] };
93
+ if (check(item, lowerCaseString, data)) {
94
+ exactMatch = (item.label === filterString);
95
+ if (props.multiple &&
96
+ !(typeof props.multiple === 'object' && props.multiple.removeSelectedItems)) {
97
+ item.checkbox = !!state.multipleMap?.[item.key];
98
+ }
99
+ if (props.multiple &&
100
+ typeof props.multiple === 'object' &&
101
+ props.multiple.limit &&
102
+ Array.isArray(state.selected)) {
103
+ item.disabled = props.multiple.limit === state.selected.length &&
104
+ !state.selected.find(selectedItem => selectedItem.key === item.key);
105
+ }
106
+ // Ignore item if it's multiple and is already selected
107
+ if (!(props.multiple &&
108
+ typeof props.multiple === 'object' &&
109
+ props.multiple.removeSelectedItems &&
110
+ state.multipleMap?.[item.key])) {
111
+ filteredData.push(item);
112
+ }
113
+ }
114
+ }
115
+ let addButton = null;
116
+ const { add } = props;
117
+ if ((add && filterString && !exactMatch) ||
118
+ (add && add.alwaysVisible)) {
119
+ if (!(add.regexp && !add.regexp.test(filterString)) &&
120
+ !(add.minlength && filterString.length < +add.minlength) ||
121
+ add.alwaysVisible) {
122
+ let label;
123
+ if (add.label) {
124
+ label = (typeof add.label === 'function') ? add.label(filterString) : add.label;
125
+ }
126
+ else {
127
+ label = filterString;
128
+ }
129
+ addButton = {
130
+ prefix: add.prefix,
131
+ label,
132
+ delayed: add.delayed ?? true
133
+ };
134
+ }
135
+ }
136
+ return { filteredData, addButton };
137
+ }
138
+ function getSelectedIndex(selected, data) {
139
+ const firstSelected = Array.isArray(selected) ? selected[0] : selected;
140
+ if (firstSelected == null) {
141
+ return null;
142
+ }
143
+ for (let i = 0; i < data.length; i++) {
144
+ const item = data[i];
145
+ if (item.key === undefined) {
146
+ continue;
147
+ }
148
+ if (item.key === firstSelected.key) {
149
+ return i;
150
+ }
151
+ }
152
+ return null;
153
+ }
154
+ const getItemLabel = ({ selectedLabel, label }) => {
155
+ if (selectedLabel != null) {
156
+ return selectedLabel;
157
+ }
158
+ return typeof label === 'string' ? label : '';
159
+ };
160
+ const getValueForFilter = (selected, type, filterValue) => (selected && !isArray(selected) && isInputMode(type)
161
+ ? getItemLabel(selected)
162
+ : filterValue);
163
+ function isSameSelected(prevSelected, selected) {
164
+ if (!prevSelected || !selected || prevSelected.length !== selected.length) {
165
+ return false;
166
+ }
167
+ const keysMap = selected.reduce((result, item) => {
168
+ result[item.key] = true;
169
+ return result;
170
+ }, {});
171
+ return prevSelected.every(it => keysMap[it.key]);
172
+ }
173
+ /**
174
+ * @name Select
175
+ * @constructor
176
+ * @extends {Component}
177
+ */
178
+ /**
179
+ * Displays a select.
180
+ */
181
+ export default class Select extends Component {
182
+ static defaultProps = {
183
+ data: [],
184
+ filter: false, // enable filter (not in INPUT modes)
185
+ filterIcon: null,
186
+ filterRef: noop,
187
+ multiple: false, // multiple can be an object - see demo for more information
188
+ clear: false, // enable clear button that clears the "selected" state
189
+ loading: false, // show a loading indicator while data is loading
190
+ disabled: false, // disable select
191
+ type: Type.BUTTON,
192
+ size: Size.M,
193
+ targetElement: null, // element to bind the popup to (select BUTTON or INPUT by default)
194
+ hideSelected: false, // INPUT mode: clears the input after an option is selected (useful when the selection is displayed in some custom way elsewhere)
195
+ allowAny: false, // INPUT mode: allows any value to be entered
196
+ hideArrow: false, // hide dropdown arrow icon
197
+ showPopup: false,
198
+ maxHeight: 600, // height of the options list, including the filter and the 'Add' button
199
+ directions: [
200
+ Popup.PopupProps.Directions.BOTTOM_RIGHT,
201
+ Popup.PopupProps.Directions.BOTTOM_LEFT,
202
+ Popup.PopupProps.Directions.TOP_LEFT,
203
+ Popup.PopupProps.Directions.TOP_RIGHT
204
+ ],
205
+ selected: null, // current selection (item / array of items)
206
+ label: null, // BUTTON or INPUT label (nothing selected)
207
+ selectedLabel: null, // BUTTON or INPUT label (something selected)
208
+ inputPlaceholder: '', // Placeholder for input modes
209
+ hint: null, // hint text to display under the list
210
+ shortcutsEnabled: false,
211
+ onBeforeOpen: noop,
212
+ onLoadMore: noop,
213
+ onOpen: noop,
214
+ onClose: noop,
215
+ onFilter: noop, // search string as first argument
216
+ onFocus: noop,
217
+ onBlur: noop,
218
+ onKeyDown: noop,
219
+ onSelect: noop, // single + multi
220
+ onDeselect: noop, // multi
221
+ onOutsideClick: noop, // multi
222
+ onChange: noop, // multi
223
+ onAdd: noop, // search string as first argument
224
+ onDone: noop,
225
+ onReset: noop,
226
+ tags: null,
227
+ ringPopupTarget: null,
228
+ dir: 'ltr'
229
+ };
230
+ static getDerivedStateFromProps(nextProps, prevState) {
231
+ const { multiple, data, type } = nextProps;
232
+ const { prevSelected, prevData, prevMultiple, filterValue } = prevState;
233
+ const nextState = {
234
+ prevData: data,
235
+ prevSelected: nextProps.selected,
236
+ prevMultiple: multiple
237
+ };
238
+ if ('data' in nextProps && data !== prevData) {
239
+ const { filteredData, addButton } = getListItems(nextProps, prevState, filterValue, data);
240
+ Object.assign(nextState, { shownData: filteredData, addButton });
241
+ if (prevState.selected) {
242
+ Object.assign(nextState, {
243
+ selectedIndex: getSelectedIndex(prevState.selected, data),
244
+ filterValue: getValueForFilter(prevState.selected, type, filterValue)
245
+ });
246
+ }
247
+ }
248
+ if ('selected' in nextProps && nextProps.selected !== prevSelected) {
249
+ const selected = nextProps.selected || (multiple ? [] : null);
250
+ const selectedIndex = getSelectedIndex(selected, data || prevData);
251
+ Object.assign(nextState, {
252
+ selected,
253
+ filterValue: getValueForFilter(selected, type, filterValue)
254
+ });
255
+ if (!Array.isArray(prevSelected) || !Array.isArray(selected) ||
256
+ !isSameSelected(prevSelected, selected)) {
257
+ Object.assign(nextState, { selectedIndex });
258
+ }
259
+ }
260
+ if (prevMultiple !== multiple && !deepEqual(prevMultiple, multiple)) {
261
+ nextState.selected = multiple ? [] : null;
262
+ }
263
+ if (multiple && !nextState.selected) {
264
+ nextState.selected = prevState.selected;
265
+ }
266
+ const { selected } = { ...prevState, ...nextState };
267
+ if (selected && Array.isArray(selected)) {
268
+ nextState.multipleMap = buildMultipleMap(selected);
269
+ const { filteredData, addButton } = getListItems(nextProps, nextState, filterValue, data);
270
+ Object.assign(nextState, { shownData: filteredData, addButton });
271
+ }
272
+ return nextState;
273
+ }
274
+ state = {
275
+ data: [],
276
+ shownData: [],
277
+ selected: (this.props.multiple ? [] : null),
278
+ selectedIndex: null,
279
+ filterValue: this.props.filter && typeof this.props.filter === 'object' &&
280
+ this.props.filter.value || '',
281
+ shortcutsEnabled: false,
282
+ popupShortcuts: false,
283
+ showPopup: this.props.showPopup,
284
+ prevData: this.props.data,
285
+ prevSelected: null,
286
+ prevMultiple: this.props.multiple,
287
+ multipleMap: {},
288
+ addButton: null
289
+ };
290
+ componentDidUpdate(prevProps, prevState) {
291
+ const { showPopup, selected } = this.state;
292
+ const { onClose, onOpen, onChange, multiple } = this.props;
293
+ if (prevState.showPopup && !showPopup) {
294
+ onClose(selected);
295
+ }
296
+ else if (!prevState.showPopup && showPopup) {
297
+ onOpen();
298
+ }
299
+ if (multiple !== prevProps.multiple && !deepEqual(multiple, prevProps.multiple)) {
300
+ onChange(selected);
301
+ }
302
+ }
303
+ static contextType = ControlsHeightContext;
304
+ static Type = Type;
305
+ static Size = Size;
306
+ id = getUID('select-');
307
+ shortcutsScope = this.id;
308
+ listId = `${this.id}:list`;
309
+ _focusHandler = (e) => {
310
+ this.props.onFocus(e);
311
+ this.setState({
312
+ shortcutsEnabled: true,
313
+ focused: true
314
+ });
315
+ };
316
+ _blurHandler = () => {
317
+ this.props.onBlur();
318
+ if (this._popup && this._popup.isVisible() && !this._popup.isClickingPopup) {
319
+ window.setTimeout(() => {
320
+ this.setState({ showPopup: false });
321
+ });
322
+ }
323
+ if (!this._popup?.isClickingPopup) {
324
+ this.setState({
325
+ shortcutsEnabled: false,
326
+ focused: false
327
+ });
328
+ }
329
+ };
330
+ node;
331
+ nodeRef = (el) => {
332
+ this.node = el;
333
+ };
334
+ _popup = null;
335
+ onEmptyPopupEnter = () => {
336
+ if (this.state.addButton) {
337
+ this.addHandler();
338
+ }
339
+ };
340
+ focus = () => {
341
+ const focusableSelectExists = this.node?.querySelector('[data-test~=ring-select__focus]');
342
+ const restoreFocusNode = this.props.targetElement || focusableSelectExists;
343
+ restoreFocusNode?.focus();
344
+ };
345
+ _onEnter = () => {
346
+ if (this.state.addButton && this.state.shownData.length === 0) {
347
+ this.addHandler();
348
+ }
349
+ this.props.onDone();
350
+ if (!this._popup?.isVisible() && this.props.allowAny) {
351
+ return true;
352
+ }
353
+ return undefined;
354
+ };
355
+ _onEsc = (event) => {
356
+ if (!this._popup?.isVisible()) {
357
+ return true;
358
+ }
359
+ else if (this.props.multiple || !this.props.getInitial) {
360
+ return false;
361
+ }
362
+ const selected = {
363
+ key: Math.random(),
364
+ label: this.props.getInitial()
365
+ };
366
+ this.setState({
367
+ selected,
368
+ filterValue: this.getValueForFilter(selected)
369
+ }, () => {
370
+ this.props.onChange(selected, event);
371
+ this.props.onReset();
372
+ });
373
+ return undefined;
374
+ };
375
+ _inputShortcutHandler = () => {
376
+ if (this.state.focused && this._popup && !this._popup.isVisible()) {
377
+ this._clickHandler();
378
+ }
379
+ };
380
+ getValueForFilter(selected) {
381
+ return getValueForFilter(selected, this.props.type, this.state.filterValue);
382
+ }
383
+ _getSelectedIndex(selected, data) {
384
+ return getSelectedIndex(selected, data);
385
+ }
386
+ popupRef = (el) => {
387
+ this._popup = el;
388
+ };
389
+ _getResetOption() {
390
+ const isOptionsSelected = Array.isArray(this.state.selected) && this.state.selected.length;
391
+ const reset = this.props.tags && typeof this.props.tags === 'object'
392
+ ? this.props.tags.reset
393
+ : null;
394
+ if (!isOptionsSelected || !reset) {
395
+ return null;
396
+ }
397
+ const resetHandler = (item, event) => {
398
+ this.clear(event);
399
+ this.clearFilter();
400
+ this.props.onFilter('');
401
+ this.setState(prevState => ({
402
+ shownData: prevState.shownData.slice(reset.separator ? 2 : 1),
403
+ multipleMap: {}
404
+ }));
405
+ this._redrawPopup();
406
+ };
407
+ return {
408
+ isResetItem: true,
409
+ separator: reset.separator,
410
+ key: reset.label,
411
+ rgItemType: List.ListProps.Type.CUSTOM,
412
+ template: (<Button text className={styles.button} data-test="ring-select-reset-tags-button" height={ControlsHeight.S}>
413
+ {reset.label}
414
+ </Button>),
415
+ glyph: reset.glyph,
416
+ onClick: resetHandler
417
+ };
418
+ }
419
+ _prependResetOption(shownData) {
420
+ const resetOption = this._getResetOption();
421
+ if (resetOption) {
422
+ const resetItems = [resetOption];
423
+ if (resetOption.separator) {
424
+ resetItems.push({
425
+ rgItemType: List.ListProps.Type.SEPARATOR
426
+ });
427
+ }
428
+ return resetItems.concat(shownData);
429
+ }
430
+ return shownData;
431
+ }
432
+ _renderPopup() {
433
+ const anchorElement = this.props.targetElement || this.node;
434
+ const { showPopup, shownData } = this.state;
435
+ const _shownData = this._prependResetOption(shownData);
436
+ return (<I18nContext.Consumer>
437
+ {({ translate }) => {
438
+ let message;
439
+ if (this.props.loading) {
440
+ message = this.props.loadingMessage ?? translate('loading');
441
+ }
442
+ else if (!shownData.length) {
443
+ message = this.props.notFoundMessage ?? translate('noOptionsFound');
444
+ }
445
+ 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
446
+ 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}/>);
447
+ }}
448
+ </I18nContext.Consumer>);
449
+ }
450
+ _showPopup() {
451
+ if (!this.node) {
452
+ return;
453
+ }
454
+ const shownData = this.getListItems(this.filterValue());
455
+ this.setState({
456
+ showPopup: true,
457
+ shownData
458
+ });
459
+ }
460
+ _hidePopup(tryFocusAnchor) {
461
+ if (this.node && this.state.showPopup) {
462
+ this.setState(prevState => ({
463
+ showPopup: false,
464
+ filterValue: this.props.allowAny ? prevState.filterValue : ''
465
+ }));
466
+ if (tryFocusAnchor) {
467
+ this.focus();
468
+ }
469
+ }
470
+ }
471
+ addHandler = () => {
472
+ const value = this.filterValue();
473
+ this._hidePopup();
474
+ this.props.onAdd(value);
475
+ };
476
+ getToolbar() {
477
+ const { hint, renderBottomToolbar } = this.props;
478
+ const { prefix, label, delayed } = this.state.addButton || {};
479
+ const isToolbarHasElements = this.state.addButton || hint || renderBottomToolbar;
480
+ if (!isToolbarHasElements) {
481
+ return null;
482
+ }
483
+ return (<div className={classNames({
484
+ [styles.toolbar]: Boolean(this.state.addButton || renderBottomToolbar)
485
+ })} data-test="ring-select-toolbar">
486
+ {renderBottomToolbar && renderBottomToolbar()}
487
+ {this.state.addButton && (<Button text delayed={delayed} className={classNames(styles.button, styles.buttonSpaced)} onClick={this.addHandler} data-test="ring-select-toolbar-button">
488
+ {prefix ? `${prefix} ${label}` : label}
489
+ </Button>)}
490
+ {hint && (<List.ListHint label={hint} data-test="ring-select-toolbar-hint"/>)}
491
+ </div>);
492
+ }
493
+ getTopbar() {
494
+ return this.props.renderTopToolbar?.();
495
+ }
496
+ getLowerCaseLabel = getLowerCaseLabel;
497
+ doesLabelMatch = doesLabelMatch;
498
+ getFilterFn() {
499
+ return getFilterFn(this.props.filter);
500
+ }
501
+ getListItems(rawFilterString, data) {
502
+ const { filteredData, addButton } = getListItems(this.props, this.state, rawFilterString, data);
503
+ this.setState({ addButton });
504
+ return filteredData;
505
+ }
506
+ filterValue(setValue) {
507
+ if (typeof setValue === 'string' || typeof setValue === 'number') {
508
+ this.setState({ filterValue: setValue });
509
+ return undefined;
510
+ }
511
+ else {
512
+ return this.state.filterValue;
513
+ }
514
+ }
515
+ isInputMode() {
516
+ return isInputMode(this.props.type);
517
+ }
518
+ _clickHandler = () => {
519
+ if (!this.props.disabled) {
520
+ if (this.state.showPopup) {
521
+ this._hidePopup();
522
+ }
523
+ else {
524
+ this.props.onBeforeOpen();
525
+ this._showPopup();
526
+ }
527
+ }
528
+ };
529
+ _openPopupIfClosed = () => {
530
+ if (this.props.disabled || this.state.showPopup) {
531
+ return;
532
+ }
533
+ this.props.onBeforeOpen();
534
+ this._showPopup();
535
+ };
536
+ _filterChangeHandler = (e) => {
537
+ this._setFilter(e.currentTarget.value, e);
538
+ };
539
+ _setFilter = (value, event) => {
540
+ if (this.isInputMode() && !this.state.focused) {
541
+ return;
542
+ }
543
+ if (value === this.state.filterValue) {
544
+ return;
545
+ }
546
+ const filterValue = value.replace(/^\s+/g, '');
547
+ this.props.onFilter(filterValue);
548
+ if (this.props.allowAny) {
549
+ const fakeSelected = {
550
+ key: Math.random(),
551
+ label: filterValue
552
+ };
553
+ this.setState({
554
+ selected: filterValue === '' ? null : fakeSelected,
555
+ selectedIndex: null
556
+ }, () => {
557
+ this.props.onSelect(fakeSelected, event);
558
+ this.props.onChange(fakeSelected, event);
559
+ });
560
+ }
561
+ !this._popup?.isVisible() && this.props.onBeforeOpen();
562
+ this.setState({ filterValue }, () => {
563
+ this._showPopup();
564
+ });
565
+ };
566
+ _rebuildMultipleMap(selected) {
567
+ if (Array.isArray(selected)) {
568
+ this.setState({ multipleMap: buildMultipleMap(selected) });
569
+ }
570
+ }
571
+ _redrawPopup = () => {
572
+ if (this.props.multiple) {
573
+ setTimeout(() => {
574
+ this.isInputMode() && this.clearFilter();
575
+ this._showPopup();
576
+ }, 0);
577
+ }
578
+ };
579
+ _listSelectHandler = (selected, event, opts = {}) => {
580
+ const isItem = (item) => List.isItemType(List.ListProps.Type.ITEM, item);
581
+ const isCustomItem = (item) => List.isItemType(List.ListProps.Type.CUSTOM, item);
582
+ const isSelectItemEvent = event && (event.type === 'select' || event.type === 'keydown');
583
+ if (isSelectItemEvent) {
584
+ event.preventDefault();
585
+ }
586
+ if ((!isItem(selected) && !isCustomItem(selected)) ||
587
+ selected.disabled ||
588
+ selected.isResetItem) {
589
+ return;
590
+ }
591
+ const tryKeepOpen = this.props.tryKeepOpen ?? opts.tryKeepOpen;
592
+ if (!this.props.multiple) {
593
+ if (!tryKeepOpen) {
594
+ this._hidePopup(isSelectItemEvent);
595
+ }
596
+ this.setState({
597
+ selected,
598
+ selectedIndex: this._getSelectedIndex(selected, this.props.data)
599
+ }, () => {
600
+ const newFilterValue = this.isInputMode() && !this.props.hideSelected
601
+ ? getItemLabel(selected)
602
+ : '';
603
+ this.filterValue(newFilterValue);
604
+ this.props.onFilter(newFilterValue);
605
+ this.props.onSelect(selected, event);
606
+ this.props.onChange(selected, event);
607
+ });
608
+ }
609
+ else {
610
+ if (!tryKeepOpen) {
611
+ this._hidePopup(isSelectItemEvent);
612
+ }
613
+ if (selected.key == null) {
614
+ throw new Error('Multiple selection requires each item to have the "key" property');
615
+ }
616
+ this.setState(prevState => {
617
+ const currentSelection = prevState.selected;
618
+ let nextSelection;
619
+ if (!prevState.multipleMap[selected.key]) {
620
+ nextSelection = currentSelection.concat(selected);
621
+ this.props.onSelect && this.props.onSelect(selected, event);
622
+ }
623
+ else {
624
+ nextSelection = currentSelection.filter(item => item.key !== selected.key);
625
+ this.props.onDeselect && this.props.onDeselect(selected);
626
+ }
627
+ this.props.onChange(nextSelection, event);
628
+ const nextState = {
629
+ filterValue: '',
630
+ selected: nextSelection,
631
+ selectedIndex: this._getSelectedIndex(selected, this.props.data)
632
+ };
633
+ if (typeof this.props.multiple === 'object' && this.props.multiple.limit &&
634
+ nextSelection.length === this.props.multiple.limit) {
635
+ nextState.shownData = prevState.shownData.
636
+ map(item => (nextSelection.find(selectedItem => selectedItem.key === item.key)
637
+ ? item
638
+ : { ...item, disabled: true }));
639
+ }
640
+ if (!prevState.multipleMap[selected.key]) {
641
+ nextState.multipleMap = { ...prevState.multipleMap, [selected.key]: true };
642
+ }
643
+ else {
644
+ const { [selected.key]: _, ...restMultipleMap } = prevState.multipleMap;
645
+ nextState.multipleMap = restMultipleMap;
646
+ }
647
+ return { ...prevState, ...nextState };
648
+ }, () => {
649
+ if (tryKeepOpen) {
650
+ this._redrawPopup();
651
+ }
652
+ });
653
+ }
654
+ };
655
+ _listSelectAllHandler = (isSelectAll = true) => {
656
+ const isItem = (item) => List.isItemType(List.ListProps.Type.ITEM, item);
657
+ const isCustomItem = (item) => List.isItemType(List.ListProps.Type.CUSTOM, item);
658
+ this.setState(prevState => {
659
+ const currentSelection = prevState.selected;
660
+ let nextSelection;
661
+ if (isSelectAll) {
662
+ nextSelection = this.props.data.filter(item => (isItem(item) || isCustomItem(item)) &&
663
+ !item.disabled);
664
+ nextSelection.
665
+ filter(item => !this.props.selected.
666
+ find(selectedItem => item.key === selectedItem.key)).
667
+ forEach(item => {
668
+ this.props.onSelect && this.props.onSelect(item);
669
+ });
670
+ }
671
+ else {
672
+ nextSelection = [];
673
+ currentSelection.
674
+ forEach(item => {
675
+ this.props.onDeselect && this.props.onDeselect(item);
676
+ });
677
+ }
678
+ this.props.onChange(nextSelection, event);
679
+ return {
680
+ filterValue: '',
681
+ selected: nextSelection,
682
+ selectedIndex: isSelectAll
683
+ ? this._getSelectedIndex(nextSelection, this.props.data)
684
+ : null,
685
+ shownData: prevState.shownData.map(item => ({ ...item, checkbox: isSelectAll })),
686
+ multipleMap: isSelectAll
687
+ ? buildMultipleMap(this.props.data.filter(item => !item.disabled))
688
+ : {}
689
+ };
690
+ }, this._redrawPopup);
691
+ };
692
+ _onCloseAttempt = (event, isEsc) => {
693
+ if (this.isInputMode()) {
694
+ if (!this.props.allowAny) {
695
+ if (this.props.hideSelected || !this.state.selected || this.props.multiple) {
696
+ this.clearFilter();
697
+ }
698
+ else if (this.state.selected && !Array.isArray(this.state.selected)) {
699
+ this.filterValue(getItemLabel(this.state.selected));
700
+ }
701
+ }
702
+ }
703
+ const isTagRemoved = this.props.tags && event && event.target &&
704
+ event.target instanceof Element &&
705
+ event.target.matches('[data-test="ring-tag-remove"]');
706
+ if (!isTagRemoved) {
707
+ this._hidePopup(isEsc);
708
+ }
709
+ };
710
+ clearFilter = (e) => {
711
+ this._setFilter('', e);
712
+ };
713
+ clear = (event) => {
714
+ if (event) {
715
+ event.stopPropagation();
716
+ }
717
+ const empty = this.props.multiple ? [] : null;
718
+ this.setState({
719
+ selected: empty,
720
+ selectedIndex: null,
721
+ filterValue: ''
722
+ }, () => {
723
+ if (this.props.onChange) {
724
+ this.props.onChange(empty, event);
725
+ }
726
+ });
727
+ return false;
728
+ };
729
+ _selectionIsEmpty() {
730
+ return (Array.isArray(this.state.selected) && !this.state.selected.length) ||
731
+ !this.state.selected;
732
+ }
733
+ _getLabel() {
734
+ return this.props.label ?? this.props.selectedLabel ?? 'Select an option';
735
+ }
736
+ _getPlaceholder() {
737
+ if (this._selectionIsEmpty()) {
738
+ return this.props.label ?? 'Select an option';
739
+ }
740
+ return this._getSelectedString();
741
+ }
742
+ _getSelectedString() {
743
+ if (Array.isArray(this.state.selected)) {
744
+ const labels = [];
745
+ for (let i = 0; i < this.state.selected.length; i++) {
746
+ labels.push(getItemLabel(this.state.selected[i]));
747
+ }
748
+ return labels.filter(Boolean).join(', ');
749
+ }
750
+ else {
751
+ return this.state.selected != null ? getItemLabel(this.state.selected) : null;
752
+ }
753
+ }
754
+ _getIcons() {
755
+ const { selected } = this.state;
756
+ const { disabled, clear, hideArrow } = this.props;
757
+ const icons = [];
758
+ const height = this.props.height || this.context;
759
+ if (!Array.isArray(selected) && selected?.icon) {
760
+ icons.push(<button title="Toggle options popup" type="button" className={styles.selectedIcon} key="selected" disabled={this.props.disabled} onClick={this._clickHandler} style={{ backgroundImage: `url(${selected.icon})` }}/>);
761
+ }
762
+ if (clear && !disabled && !this._selectionIsEmpty()) {
763
+ icons.push(<Button title="Clear selection" data-test="ring-clear-select" className={styles.clearIcon} key="close" disabled={this.props.disabled} onClick={this.clear} height={height} icon={closeIcon}/>);
764
+ }
765
+ if (!hideArrow) {
766
+ icons.push(<Button title="Toggle options popup" className={styles.chevron} iconClassName={styles.chevronIcon} icon={chevronDownIcon} key="hide" disabled={this.props.disabled} height={height} onClick={this._clickHandler}/>);
767
+ }
768
+ return icons;
769
+ }
770
+ _getAvatar() {
771
+ return !Array.isArray(this.state.selected) &&
772
+ (this.state.selected?.avatar || this.state.selected?.showGeneratedAvatar) && (<Avatar className={styles.avatar} url={this.state.selected.avatar} username={this.state.selected.username} size={AvatarSize.Size20}/>);
773
+ }
774
+ filter;
775
+ filterRef = (el) => {
776
+ this.filter = el;
777
+ };
778
+ getShortcutsMap() {
779
+ return {
780
+ enter: this._onEnter,
781
+ esc: this._onEsc,
782
+ up: this._inputShortcutHandler,
783
+ down: this._inputShortcutHandler,
784
+ right: noop,
785
+ left: noop,
786
+ 'shift+up': noop,
787
+ 'shift+down': noop,
788
+ space: noop
789
+ };
790
+ }
791
+ renderSelect(activeItemId) {
792
+ const dataTest = this.props['data-test'];
793
+ const { selectedLabel } = this.props;
794
+ const { shortcutsEnabled } = this.state;
795
+ const classes = classNames(styles.select, 'ring-js-shortcuts', this.props.className, styles[`height${this.props.height || this.context}`], {
796
+ [styles[`size${this.props.size}`]]: this.props.type !== Type.INLINE,
797
+ [styles.disabled]: this.props.disabled
798
+ });
799
+ const icons = this._getIcons();
800
+ const style = getStyle(icons.length);
801
+ const iconsNode = <div className={styles.icons}>{icons}</div>;
802
+ const ariaProps = this.state.showPopup
803
+ ? {
804
+ 'aria-owns': this.listId,
805
+ 'aria-activedescendant': activeItemId,
806
+ 'aria-label': this.props.label ?? undefined
807
+ }
808
+ : {
809
+ 'aria-label': this.props.label ?? undefined
810
+ };
811
+ switch (this.props.type) {
812
+ case Type.INPUT_WITHOUT_CONTROLS:
813
+ case Type.INPUT: return (<>
814
+ <div ref={this.nodeRef} className={classNames(classes, styles.inputMode)} data-test={dataTests('ring-select', dataTest)}>
815
+ {shortcutsEnabled && (<Shortcuts map={this.getShortcutsMap()} scope={this.shortcutsScope}/>)}
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}
817
+ // Input with error style without description
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
819
+ ? Object.keys({
820
+ ...this.getShortcutsMap(),
821
+ ...this._popup?.list?.shortcutsMap
822
+ })
823
+ : undefined} icon={this.props.filterIcon} afterInput={this.props.type === Type.INPUT && iconsNode}/>
824
+ {this._renderPopup()}
825
+ </div>
826
+ {this.props.error && (<div className={classNames(inputStyles.errorText, inputStyles[`size${this.props.size}`])}>
827
+ {this.props.error}
828
+ </div>)}
829
+ </>);
830
+ case Type.BUTTON:
831
+ return (<div ref={this.nodeRef} className={classNames(classes, styles.buttonMode)} data-test={dataTests('ring-select', dataTest)}>
832
+ {selectedLabel && (<ControlLabel type={this.props.labelType} disabled={this.props.disabled} htmlFor={this.props.id}>{selectedLabel}</ControlLabel>)}
833
+ {shortcutsEnabled && (<Shortcuts map={this.getShortcutsMap()} scope={this.shortcutsScope}/>)}
834
+ <div className={styles.buttonContainer}>
835
+ <Button {...ariaProps} height={this.props.height} id={this.props.id} onClick={this._clickHandler} className={classNames(this.props.buttonClassName, styles.buttonValue, {
836
+ [styles.buttonValueOpen]: this.state.showPopup,
837
+ [styles.buttonValueEmpty]: this._selectionIsEmpty()
838
+ })} disabled={this.props.disabled} style={style} data-test="ring-select__button ring-select__focus">
839
+ {this._getAvatar()}
840
+ {this._getPlaceholder()}
841
+ </Button>
842
+ {iconsNode}
843
+ </div>
844
+ {this._renderPopup()}
845
+ </div>);
846
+ case Type.INLINE:
847
+ return (<div className={classes} ref={this.nodeRef} data-test={dataTests('ring-select', dataTest)}>
848
+ {shortcutsEnabled && (<Shortcuts map={this.getShortcutsMap()} scope={this.shortcutsScope}/>)}
849
+ <Anchor {...ariaProps} className={this.props.buttonClassName ?? undefined} id={this.props.id} onClick={this._clickHandler} data-test="ring-select__focus" disabled={this.props.disabled} active={this.state.showPopup}>
850
+ {this._getPlaceholder()}
851
+ </Anchor>
852
+ {this._renderPopup()}
853
+ </div>);
854
+ default:
855
+ if (this.props.customAnchor) {
856
+ return (<Fragment>
857
+ {shortcutsEnabled && (<Shortcuts map={this.getShortcutsMap()} scope={this.shortcutsScope}/>)}
858
+ {this.props.customAnchor({
859
+ wrapperProps: {
860
+ ref: this.nodeRef,
861
+ 'data-test': dataTests('ring-select', dataTest)
862
+ },
863
+ buttonProps: {
864
+ ...ariaProps,
865
+ id: this.props.id,
866
+ onClick: this._clickHandler,
867
+ disabled: this.props.disabled,
868
+ children: this._getPlaceholder(),
869
+ 'data-test': 'ring-select__focus'
870
+ },
871
+ popup: this._renderPopup()
872
+ })}
873
+ </Fragment>);
874
+ }
875
+ return (<span id={this.props.id} ref={this.nodeRef} data-test="ring-select">
876
+ {this._renderPopup()}
877
+ </span>);
878
+ }
879
+ }
880
+ render() {
881
+ return (<ActiveItemContext.Provider>
882
+ <ActiveItemContext.ValueContext.Consumer>
883
+ {activeItemId => this.renderSelect(activeItemId)}
884
+ </ActiveItemContext.ValueContext.Consumer>
885
+ </ActiveItemContext.Provider>);
886
+ }
887
+ }
888
+ Select.propTypes = {
889
+ className: PropTypes.string,
890
+ buttonClassName: PropTypes.string,
891
+ id: PropTypes.string,
892
+ multiple: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
893
+ allowAny: PropTypes.bool,
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
+ ]),
900
+ getInitial: PropTypes.func,
901
+ onClose: PropTypes.func,
902
+ onOpen: PropTypes.func,
903
+ onDone: PropTypes.func,
904
+ onFilter: PropTypes.func,
905
+ onChange: PropTypes.func,
906
+ onReset: PropTypes.func,
907
+ onLoadMore: PropTypes.func,
908
+ onAdd: PropTypes.func,
909
+ onBeforeOpen: PropTypes.func,
910
+ onSelect: PropTypes.func,
911
+ onDeselect: PropTypes.func,
912
+ onOutsideClick: PropTypes.func,
913
+ onFocus: PropTypes.func,
914
+ onBlur: PropTypes.func,
915
+ onKeyDown: PropTypes.func,
916
+ selected: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
917
+ data: PropTypes.array,
918
+ tags: PropTypes.object,
919
+ targetElement: PropTypes.object,
920
+ loading: PropTypes.bool,
921
+ loadingMessage: PropTypes.string,
922
+ notFoundMessage: PropTypes.string,
923
+ maxHeight: PropTypes.number,
924
+ minWidth: PropTypes.number,
925
+ directions: PropTypes.array,
926
+ popupClassName: PropTypes.string,
927
+ popupStyle: PropTypes.object,
928
+ top: PropTypes.number,
929
+ left: PropTypes.number,
930
+ renderOptimization: PropTypes.bool,
931
+ ringPopupTarget: PropTypes.string,
932
+ error: PropTypes.string,
933
+ hint: List.ListHint.propTypes.label,
934
+ add: PropTypes.object,
935
+ type: PropTypes.oneOf(Object.values(Type)),
936
+ disabled: PropTypes.bool,
937
+ hideSelected: PropTypes.bool,
938
+ label: PropTypes.string,
939
+ selectedLabel: PropTypes.oneOfType([
940
+ PropTypes.string,
941
+ PropTypes.arrayOf(PropTypes.node),
942
+ PropTypes.node
943
+ ]),
944
+ inputPlaceholder: PropTypes.string,
945
+ clear: PropTypes.bool,
946
+ hideArrow: PropTypes.bool,
947
+ showPopup: PropTypes.bool,
948
+ tryKeepOpen: PropTypes.bool,
949
+ compact: PropTypes.bool,
950
+ size: PropTypes.oneOf(Object.values(Size)),
951
+ customAnchor: PropTypes.func,
952
+ disableMoveOverflow: PropTypes.bool,
953
+ disableScrollToActive: PropTypes.bool,
954
+ dir: PropTypes.oneOf(['ltr', 'rtl']),
955
+ 'data-test': PropTypes.string
956
+ };
957
+ export const RerenderableSelect = rerenderHOC(Select);