@jetbrains/ring-ui 4.1.0-beta.9 → 4.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (354) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +17 -15
  3. package/babel.config.js +3 -2
  4. package/components/alert/alert.js +9 -3
  5. package/components/alert/container.css +1 -1
  6. package/components/alert-service/alert-service.examples.css +18 -0
  7. package/components/alert-service/alert-service.examples.js +21 -0
  8. package/components/alert-service/alert-service.js +10 -3
  9. package/components/analytics/analytics__fus-plugin.js +1 -1
  10. package/components/auth/auth.test.js +14 -7
  11. package/components/auth/auth__core.js +64 -33
  12. package/components/auth-dialog/auth-dialog.js +1 -0
  13. package/components/avatar/avatar.css +4 -1
  14. package/components/avatar/avatar.examples.js +3 -2
  15. package/components/avatar/avatar.js +31 -6
  16. package/components/avatar/fallback-avatar.js +136 -0
  17. package/components/avatar-editor-ng/avatar-editor-ng.css +2 -2
  18. package/components/avatar-editor-ng/avatar-editor-ng.js +2 -1
  19. package/components/avatar-editor-ng/{avatar-editor-ng.html → avatar-editor-ng__template.js} +2 -2
  20. package/components/button/button.css +2 -2
  21. package/components/button/button.js +4 -1
  22. package/components/button-group/button-group.js +1 -1
  23. package/components/button-group/caption.js +1 -1
  24. package/components/button-ng/button-ng.js +1 -1
  25. package/components/button-set-ng/button-set-ng.js +3 -1
  26. package/components/checkbox/checkbox.css +1 -1
  27. package/components/code/code.js +1 -1
  28. package/components/confirm/confirm.js +1 -0
  29. package/components/confirm-service/confirm-service.js +5 -5
  30. package/components/content-layout/content-layout.css +1 -1
  31. package/components/data-list/data-list.css +1 -1
  32. package/components/date-picker/date-input.js +5 -4
  33. package/components/date-picker/date-picker.css +34 -22
  34. package/components/date-picker/date-picker.js +16 -14
  35. package/components/date-picker/date-popup.js +22 -7
  36. package/components/date-picker/month-names.js +8 -5
  37. package/components/date-picker/month.js +6 -2
  38. package/components/date-picker/weekdays.js +10 -2
  39. package/components/dialog/dialog.examples.js +3 -1
  40. package/components/dialog/dialog.js +5 -2
  41. package/components/dialog/dialog.test.js +1 -1
  42. package/components/dialog/dialog__body-scroll-preventer.js +2 -2
  43. package/components/dialog-ng/dialog-ng.js +7 -8
  44. package/components/dialog-ng/{dialog-ng.html → dialog-ng__template.js} +2 -2
  45. package/components/dropdown/dropdown.examples.js +36 -1
  46. package/components/dropdown-menu/dropdown-menu.examples.js +47 -0
  47. package/components/dropdown-menu/dropdown-menu.js +117 -0
  48. package/components/dropdown-menu/dropdown-menu.test.js +76 -0
  49. package/components/error-bubble/error-bubble-legacy.css +1 -1
  50. package/components/error-bubble/error-bubble.css +1 -1
  51. package/components/error-bubble/error-bubble.examples.js +1 -1
  52. package/components/error-page/error-page.css +2 -2
  53. package/components/footer-ng/footer-ng.js +13 -3
  54. package/components/form/form.css +2 -2
  55. package/components/form-ng/form-ng.js +3 -1
  56. package/components/global/global.css +1 -1
  57. package/components/global/theme.js +1 -1
  58. package/components/global/variables.css +8 -1
  59. package/components/grid/grid.css +10 -9
  60. package/components/header/header.css +1 -1
  61. package/components/header/header.examples.js +7 -8
  62. package/components/header/profile.js +10 -11
  63. package/components/http/http.js +1 -1
  64. package/components/icon/icon.css +5 -4
  65. package/components/island/island.css +4 -3
  66. package/components/island-legacy/island-legacy.css +3 -1
  67. package/components/list/list.js +6 -1
  68. package/components/list/list__custom.js +9 -3
  69. package/components/list/list__item.js +8 -2
  70. package/components/list/list__link.js +2 -1
  71. package/components/loader-inline/loader-inline.css +1 -1
  72. package/components/loader-screen/loader-screen.css +1 -1
  73. package/components/message/message.css +1 -1
  74. package/components/message/message.examples.js +8 -5
  75. package/components/pager/pager.js +5 -3
  76. package/components/permissions/permissions.js +1 -1
  77. package/components/progress-bar/progress-bar.css +1 -1
  78. package/components/progress-bar/progress-bar.examples.js +3 -3
  79. package/components/progress-bar/progress-bar.js +5 -2
  80. package/components/progress-bar/progress-bar.test.js +12 -13
  81. package/components/progress-bar-ng/progress-bar-ng.examples.js +3 -3
  82. package/components/query-assist/query-assist.css +13 -3
  83. package/components/query-assist/query-assist.examples.js +3 -1
  84. package/components/query-assist/query-assist.js +56 -12
  85. package/components/query-assist/query-assist.test.js +37 -5
  86. package/components/save-field-ng/save-field-ng.css +0 -3
  87. package/components/save-field-ng/save-field-ng.js +3 -1
  88. package/components/save-field-ng/{save-field-ng.html → save-field-ng__template.js} +2 -2
  89. package/components/select/select.css +12 -7
  90. package/components/select/select.examples.js +13 -0
  91. package/components/select/select.js +30 -43
  92. package/components/select/select.test.js +4 -5
  93. package/components/shortcuts-hint-ng/shortcuts-hint-ng.css +1 -1
  94. package/components/shortcuts-hint-ng/shortcuts-hint-ng.js +1 -1
  95. package/components/shortcuts-hint-ng/{shortcuts-hint-ng.html → shortcuts-hint-ng__template.js} +2 -2
  96. package/components/sidebar/sidebar.css +1 -0
  97. package/components/sidebar-ng/sidebar-ng.js +6 -2
  98. package/components/sidebar-ng/{sidebar-ng__button.html → sidebar-ng__button-template.js} +2 -2
  99. package/components/sidebar-ng/{sidebar-ng.html → sidebar-ng__template.js} +2 -2
  100. package/components/table/row.js +2 -1
  101. package/components/table/table.css +2 -1
  102. package/components/table-legacy/table-legacy.css +2 -2
  103. package/components/table-legacy/table-legacy__toolbar.css +2 -2
  104. package/components/table-legacy-ng/table-legacy-ng.js +38 -5
  105. package/components/table-legacy-ng/table-legacy-ng__pager.js +7 -1
  106. package/components/tabs/collapsible-tab.js +2 -2
  107. package/components/tabs/collapsible-tabs.js +4 -8
  108. package/components/tabs/tab-link.js +4 -2
  109. package/components/tabs/tabs.css +27 -0
  110. package/components/tabs-ng/tabs-ng.js +4 -2
  111. package/components/tabs-ng/{tabs-ng.html → tabs-ng__template.js} +6 -2
  112. package/components/tag/tag.css +5 -2
  113. package/components/tag/tag.examples.js +3 -0
  114. package/components/tag/tag.js +19 -16
  115. package/components/tags-input/tag-input.examples.js +1 -1
  116. package/components/tags-input/tags-input.js +5 -2
  117. package/components/template-ng/template-ng.js +1 -1
  118. package/components/tooltip/tooltip.js +7 -2
  119. package/components/user-agreement/user-agreement.css +1 -1
  120. package/components/user-agreement/user-agreement.examples.js +7 -4
  121. package/components/user-agreement/user-agreement.js +1 -0
  122. package/package.json +75 -78
  123. package/webpack.config.js +14 -10
  124. package/components/button-set-ng/button-set-ng.html +0 -1
  125. package/components/footer-ng/footer-ng.html +0 -13
  126. package/components/form-ng/form-ng__error-bubble.html +0 -3
  127. package/components/table-legacy-ng/table-legacy-ng.html +0 -4
  128. package/components/table-legacy-ng/table-legacy-ng__column.html +0 -12
  129. package/components/table-legacy-ng/table-legacy-ng__header.html +0 -4
  130. package/components/table-legacy-ng/table-legacy-ng__pager.html +0 -7
  131. package/components/table-legacy-ng/table-legacy-ng__row.html +0 -12
  132. package/components/table-legacy-ng/table-legacy-ng__title.html +0 -9
  133. package/dist/_helpers/_rollupPluginBabelHelpers.js +0 -127
  134. package/dist/_helpers/anchor.js +0 -33
  135. package/dist/_helpers/badge.js +0 -3
  136. package/dist/_helpers/button__classes.js +0 -39
  137. package/dist/_helpers/caption.js +0 -25
  138. package/dist/_helpers/card.js +0 -77
  139. package/dist/_helpers/date-picker.js +0 -3
  140. package/dist/_helpers/dialog__body-scroll-preventer.js +0 -56
  141. package/dist/_helpers/grid.js +0 -3
  142. package/dist/_helpers/header.js +0 -3
  143. package/dist/_helpers/icon__svg.js +0 -83
  144. package/dist/_helpers/inject-styles.js +0 -22
  145. package/dist/_helpers/island.js +0 -3
  146. package/dist/_helpers/list.js +0 -3
  147. package/dist/_helpers/query-assist__suggestions.js +0 -95
  148. package/dist/_helpers/select__filter.js +0 -78
  149. package/dist/_helpers/services-link.js +0 -42
  150. package/dist/_helpers/sidebar.js +0 -127
  151. package/dist/_helpers/table.js +0 -3
  152. package/dist/_helpers/tabs.js +0 -3
  153. package/dist/_helpers/title.js +0 -99
  154. package/dist/alert/alert.js +0 -254
  155. package/dist/alert/container.js +0 -50
  156. package/dist/alert-service/alert-service.js +0 -159
  157. package/dist/analytics/analytics.js +0 -116
  158. package/dist/analytics/analytics__custom-plugin.js +0 -127
  159. package/dist/analytics/analytics__fus-plugin.js +0 -101
  160. package/dist/analytics/analytics__ga-plugin.js +0 -66
  161. package/dist/analytics/analytics__plugin-utils.js +0 -79
  162. package/dist/auth/auth.js +0 -90
  163. package/dist/auth/auth__core.js +0 -987
  164. package/dist/auth/background-flow.js +0 -123
  165. package/dist/auth/down-notification.js +0 -111
  166. package/dist/auth/iframe-flow.js +0 -147
  167. package/dist/auth/landing-entry.js +0 -5
  168. package/dist/auth/landing.js +0 -84
  169. package/dist/auth/request-builder.js +0 -75
  170. package/dist/auth/response-parser.js +0 -117
  171. package/dist/auth/storage.js +0 -279
  172. package/dist/auth/token-validator.js +0 -176
  173. package/dist/auth/window-flow.js +0 -133
  174. package/dist/auth-dialog/auth-dialog.js +0 -132
  175. package/dist/auth-dialog-service/auth-dialog-service.js +0 -67
  176. package/dist/avatar/avatar-example-datauri.js +0 -26
  177. package/dist/avatar/avatar.js +0 -155
  178. package/dist/badge/badge.js +0 -52
  179. package/dist/button/button.js +0 -117
  180. package/dist/button/button__classes.js +0 -5
  181. package/dist/button-group/button-group.js +0 -30
  182. package/dist/button-group/caption.js +0 -5
  183. package/dist/button-set/button-set.js +0 -27
  184. package/dist/button-toolbar/button-toolbar.js +0 -30
  185. package/dist/caret/caret.js +0 -264
  186. package/dist/checkbox/checkbox.js +0 -110
  187. package/dist/confirm/confirm.js +0 -122
  188. package/dist/confirm-service/confirm-service.js +0 -112
  189. package/dist/content-layout/content-layout.js +0 -67
  190. package/dist/content-layout/sidebar.js +0 -6
  191. package/dist/contenteditable/contenteditable.js +0 -81
  192. package/dist/data-list/data-list.js +0 -203
  193. package/dist/data-list/data-list.mock.js +0 -190
  194. package/dist/data-list/item.js +0 -225
  195. package/dist/data-list/selection.js +0 -101
  196. package/dist/data-list/title.js +0 -16
  197. package/dist/date-picker/consts.js +0 -70
  198. package/dist/date-picker/date-input.js +0 -169
  199. package/dist/date-picker/date-picker.js +0 -356
  200. package/dist/date-picker/date-popup.js +0 -459
  201. package/dist/date-picker/day.js +0 -119
  202. package/dist/date-picker/formats.js +0 -3
  203. package/dist/date-picker/month-names.js +0 -92
  204. package/dist/date-picker/month-slider.js +0 -83
  205. package/dist/date-picker/month.js +0 -48
  206. package/dist/date-picker/months.js +0 -121
  207. package/dist/date-picker/weekdays.js +0 -24
  208. package/dist/date-picker/years.js +0 -109
  209. package/dist/dialog/dialog.js +0 -197
  210. package/dist/dialog/dialog__body-scroll-preventer.js +0 -2
  211. package/dist/dropdown/anchor.js +0 -16
  212. package/dist/dropdown/dropdown.js +0 -236
  213. package/dist/error-bubble/error-bubble.js +0 -59
  214. package/dist/error-message/error-message.js +0 -55
  215. package/dist/footer/footer.js +0 -127
  216. package/dist/global/angular-component-factory.js +0 -83
  217. package/dist/global/compose.js +0 -9
  218. package/dist/global/composeRefs.js +0 -15
  219. package/dist/global/conic-gradient.js +0 -37
  220. package/dist/global/create-stateful-context.js +0 -54
  221. package/dist/global/data-tests.js +0 -22
  222. package/dist/global/dom.js +0 -124
  223. package/dist/global/focus-sensor-hoc.js +0 -147
  224. package/dist/global/fuzzy-highlight.js +0 -67
  225. package/dist/global/get-event-key.js +0 -111
  226. package/dist/global/get-uid.js +0 -15
  227. package/dist/global/inject-styles.js +0 -17
  228. package/dist/global/linear-function.js +0 -18
  229. package/dist/global/listeners.js +0 -42
  230. package/dist/global/memoize.js +0 -18
  231. package/dist/global/normalize-indent.js +0 -28
  232. package/dist/global/promise-with-timeout.js +0 -13
  233. package/dist/global/radial-gradient-mask.js +0 -49
  234. package/dist/global/react-dom-renderer.js +0 -45
  235. package/dist/global/rerender-hoc.js +0 -53
  236. package/dist/global/ring-angular-component.js +0 -24
  237. package/dist/global/schedule-raf.js +0 -31
  238. package/dist/global/sniffer.js +0 -6
  239. package/dist/global/supports-css.js +0 -20
  240. package/dist/global/theme.js +0 -56
  241. package/dist/global/trivial-template-tag.js +0 -15
  242. package/dist/global/url.js +0 -163
  243. package/dist/global/variables_dark.js +0 -57
  244. package/dist/grid/col.js +0 -62
  245. package/dist/grid/grid.js +0 -35
  246. package/dist/grid/row.js +0 -66
  247. package/dist/group/group.js +0 -34
  248. package/dist/header/header.js +0 -144
  249. package/dist/header/logo.js +0 -39
  250. package/dist/header/profile.js +0 -212
  251. package/dist/header/services-link.js +0 -10
  252. package/dist/header/services.js +0 -135
  253. package/dist/header/smart-profile.js +0 -227
  254. package/dist/header/smart-services.js +0 -159
  255. package/dist/header/tray-icon.js +0 -45
  256. package/dist/header/tray.js +0 -33
  257. package/dist/heading/heading.js +0 -76
  258. package/dist/http/http.js +0 -216
  259. package/dist/http/http.mock.js +0 -65
  260. package/dist/hub-source/hub-source.js +0 -130
  261. package/dist/hub-source/hub-source__user.js +0 -28
  262. package/dist/hub-source/hub-source__users-groups.js +0 -62
  263. package/dist/icon/icon.js +0 -105
  264. package/dist/icon/icon__constants.js +0 -33
  265. package/dist/icon/icon__svg.js +0 -6
  266. package/dist/icon/index.js +0 -9
  267. package/dist/input/input.js +0 -231
  268. package/dist/island/adaptive-island-hoc.js +0 -48
  269. package/dist/island/content.js +0 -158
  270. package/dist/island/header.js +0 -85
  271. package/dist/island/island.js +0 -53
  272. package/dist/island-legacy/content-legacy.js +0 -28
  273. package/dist/island-legacy/header-legacy.js +0 -30
  274. package/dist/island-legacy/island-legacy.js +0 -30
  275. package/dist/link/clickableLink.js +0 -65
  276. package/dist/link/link.js +0 -118
  277. package/dist/list/consts.js +0 -26
  278. package/dist/list/list.js +0 -800
  279. package/dist/list/list__custom.js +0 -82
  280. package/dist/list/list__hint.js +0 -26
  281. package/dist/list/list__item.js +0 -197
  282. package/dist/list/list__link.js +0 -65
  283. package/dist/list/list__separator.js +0 -30
  284. package/dist/list/list__title.js +0 -39
  285. package/dist/list/list__users-groups-source.js +0 -124
  286. package/dist/loader/loader.js +0 -72
  287. package/dist/loader/loader__core.js +0 -272
  288. package/dist/loader-inline/inject-styles.js +0 -11
  289. package/dist/loader-inline/loader-inline.js +0 -58
  290. package/dist/loader-screen/loader-screen.js +0 -46
  291. package/dist/login-dialog/login-dialog.js +0 -184
  292. package/dist/login-dialog/service.js +0 -67
  293. package/dist/message/message.js +0 -232
  294. package/dist/old-browsers-message/old-browsers-message.js +0 -101
  295. package/dist/old-browsers-message/old-browsers-message__stop.js +0 -5
  296. package/dist/old-browsers-message/white-list.js +0 -34
  297. package/dist/pager/pager.js +0 -352
  298. package/dist/panel/panel.js +0 -34
  299. package/dist/permissions/permissions.js +0 -200
  300. package/dist/permissions/permissions__cache.js +0 -272
  301. package/dist/popup/popup.consts.js +0 -41
  302. package/dist/popup/popup.js +0 -389
  303. package/dist/popup/popup.target.js +0 -27
  304. package/dist/popup/position.js +0 -280
  305. package/dist/popup-menu/popup-menu.js +0 -108
  306. package/dist/progress-bar/progress-bar.js +0 -111
  307. package/dist/proxy-attrs/proxy-attrs.js +0 -19
  308. package/dist/query-assist/query-assist.js +0 -1023
  309. package/dist/query-assist/query-assist__suggestions.js +0 -43
  310. package/dist/radio/radio.js +0 -39
  311. package/dist/radio/radio__item.js +0 -82
  312. package/dist/select/select.js +0 -1335
  313. package/dist/select/select__filter.js +0 -49
  314. package/dist/select/select__popup.js +0 -541
  315. package/dist/shortcuts/core.js +0 -245
  316. package/dist/shortcuts/shortcut-title.js +0 -51
  317. package/dist/shortcuts/shortcuts-hoc.js +0 -43
  318. package/dist/shortcuts/shortcuts.js +0 -72
  319. package/dist/storage/storage.js +0 -55
  320. package/dist/storage/storage__fallback.js +0 -214
  321. package/dist/storage/storage__local.js +0 -150
  322. package/dist/style.css +0 -1
  323. package/dist/tab-trap/tab-trap.js +0 -178
  324. package/dist/table/cell.js +0 -25
  325. package/dist/table/disable-hover-hoc.js +0 -53
  326. package/dist/table/header-cell.js +0 -91
  327. package/dist/table/header.js +0 -189
  328. package/dist/table/multitable.js +0 -140
  329. package/dist/table/row-with-focus-sensor.js +0 -79
  330. package/dist/table/row.js +0 -270
  331. package/dist/table/selection-adapter.js +0 -14
  332. package/dist/table/selection-shortcuts-hoc.js +0 -212
  333. package/dist/table/selection.js +0 -221
  334. package/dist/table/smart-table.js +0 -113
  335. package/dist/table/table.js +0 -405
  336. package/dist/tabs/collapsible-more.js +0 -193
  337. package/dist/tabs/collapsible-tab.js +0 -90
  338. package/dist/tabs/collapsible-tabs.js +0 -361
  339. package/dist/tabs/custom-item.js +0 -13
  340. package/dist/tabs/dumb-tabs.js +0 -159
  341. package/dist/tabs/smart-tabs.js +0 -102
  342. package/dist/tabs/tab-link.js +0 -35
  343. package/dist/tabs/tab.js +0 -32
  344. package/dist/tabs/tabs.js +0 -65
  345. package/dist/tag/tag.js +0 -190
  346. package/dist/tags-input/tags-input.js +0 -474
  347. package/dist/tags-list/tags-list.js +0 -94
  348. package/dist/text/text.js +0 -38
  349. package/dist/toggle/toggle.js +0 -80
  350. package/dist/tooltip/tooltip.js +0 -205
  351. package/dist/user-card/card.js +0 -14
  352. package/dist/user-card/smart-user-card-tooltip.js +0 -112
  353. package/dist/user-card/tooltip.js +0 -91
  354. package/dist/user-card/user-card.js +0 -46
@@ -1,1335 +0,0 @@
1
- import { _ as _defineProperty, c as _objectSpread2, b as _extends, a as _objectWithoutProperties, d as _toPropertyKey } from '../_helpers/_rollupPluginBabelHelpers.js';
2
- import React, { Component, Fragment } from 'react';
3
- import classNames from 'classnames';
4
- import PropTypes from 'prop-types';
5
- import chevronDown from '@jetbrains/icons/chevron-10px';
6
- import closeIcon from '@jetbrains/icons/close';
7
- import deepEqual from 'deep-equal';
8
- import '../dropdown/dropdown.js';
9
- import Avatar, { Size } from '../avatar/avatar.js';
10
- import Popup from '../popup/popup.js';
11
- import List, { ActiveItemContext } from '../list/list.js';
12
- import Input, { Size as Size$1 } from '../input/input.js';
13
- import Shortcuts from '../shortcuts/shortcuts.js';
14
- import Button from '../button/button.js';
15
- import { m as modules_e81895c9 } from '../_helpers/button__classes.js';
16
- import joinDataTestAttributes from '../global/data-tests.js';
17
- import getUID from '../global/get-uid.js';
18
- import rerenderHOC from '../global/rerender-hoc.js';
19
- import fuzzyHighlight from '../global/fuzzy-highlight.js';
20
- import Theme, { ThemeContext } from '../global/theme.js';
21
- import memoize from '../global/memoize.js';
22
- import getEventKey from '../global/get-event-key.js';
23
- import SelectPopup from './select__popup.js';
24
- import { A as Anchor } from '../_helpers/anchor.js';
25
- import '../icon/icon.js';
26
- import 'util-deprecate';
27
- import '../icon/icon__constants.js';
28
- import '../_helpers/icon__svg.js';
29
- import 'focus-visible';
30
- import '../link/clickableLink.js';
31
- import '../global/url.js';
32
- import '../global/dom.js';
33
- import 'react-dom';
34
- import '../global/schedule-raf.js';
35
- import '../tab-trap/tab-trap.js';
36
- import '../popup/position.js';
37
- import '../popup/popup.consts.js';
38
- import '../popup/popup.target.js';
39
- import '../shortcuts/core.js';
40
- import 'combokeys';
41
- import '../global/sniffer.js';
42
- import 'sniffr';
43
- import 'react-virtualized/dist/es/List';
44
- import 'react-virtualized/dist/es/AutoSizer';
45
- import 'react-virtualized/dist/es/WindowScroller';
46
- import 'react-virtualized/dist/es/CellMeasurer';
47
- import 'memoize-one';
48
- import '../global/create-stateful-context.js';
49
- import '../list/list__link.js';
50
- import '../link/link.js';
51
- import '../_helpers/list.js';
52
- import '../list/list__item.js';
53
- import '../checkbox/checkbox.js';
54
- import '@jetbrains/icons/checkmark';
55
- import '@jetbrains/icons/remove-10px';
56
- import '../list/list__custom.js';
57
- import '../list/list__title.js';
58
- import '../list/list__separator.js';
59
- import '../list/list__hint.js';
60
- import '../list/consts.js';
61
- import '@jetbrains/icons/search';
62
- import '../loader-inline/loader-inline.js';
63
- import '../_helpers/inject-styles.js';
64
- import '../global/conic-gradient.js';
65
- import 'conic-gradient';
66
- import '../global/supports-css.js';
67
- import '../global/inject-styles.js';
68
- import '../global/radial-gradient-mask.js';
69
- import '../shortcuts/shortcuts-hoc.js';
70
- import '../tags-list/tags-list.js';
71
- import '../tag/tag.js';
72
- import '../caret/caret.js';
73
- import '../text/text.js';
74
- import '../_helpers/select__filter.js';
75
-
76
- var modules_9d0de074 = {"unit":"8px","resetButton":"global_resetButton__0f8f4370","select":"select_select__695ec655","value":"select_value__695ec655 global_ellipsis__0f8f4370 global_font__0f8f4370","icons":"select_icons__695ec655","toolbar":"select_toolbar__695ec655","button":"select_button__695ec655","buttonSpaced":"select_buttonSpaced__695ec655","inputMode":"select_inputMode__695ec655","buttonMode":"select_buttonMode__695ec655","selectedIcon":"select_selectedIcon__695ec655 global_resetButton__0f8f4370","clearIcon":"select_clearIcon__695ec655","sizeS":"select_sizeS__695ec655","sizeM":"select_sizeM__695ec655","sizeL":"select_sizeL__695ec655","sizeFULL":"select_sizeFULL__695ec655","sizeAUTO":"select_sizeAUTO__695ec655","materialMode":"select_materialMode__695ec655","open":"select_open__695ec655","buttonValue":"select_buttonValue__695ec655 global_ellipsis__0f8f4370","buttonValueOpen":"select_buttonValueOpen__695ec655","label":"select_label__695ec655","disabled":"select_disabled__695ec655","selectedLabel":"select_selectedLabel__695ec655","avatar":"select_avatar__695ec655","popup":"select_popup__695ec655","chevron":"select_chevron__695ec655","chevronIcon":"select_chevronIcon__695ec655"};
77
-
78
- /**
79
- * @name Select
80
- */
81
-
82
- function noop() {}
83
- /**
84
- * @enum {number}
85
- */
86
-
87
-
88
- const Type = {
89
- BUTTON: 'BUTTON',
90
- INPUT: 'INPUT',
91
- CUSTOM: 'CUSTOM',
92
- INLINE: 'INLINE',
93
- MATERIAL: 'MATERIAL',
94
- INPUT_WITHOUT_CONTROLS: 'INPUT_WITHOUT_CONTROLS'
95
- };
96
- const ICON_WIDTH = 20;
97
- const getStyle = memoize(iconsLength => ({
98
- paddingRight: iconsLength * ICON_WIDTH
99
- }));
100
-
101
- const isInputMode = type => type === Type.INPUT || type === Type.INPUT_WITHOUT_CONTROLS;
102
-
103
- function getLowerCaseLabel(item) {
104
- if (List.isItemType(List.ListProps.Type.SEPARATOR, item) || List.isItemType(List.ListProps.Type.HINT, item) || item.label == null) {
105
- return null;
106
- }
107
-
108
- return item.label.toLowerCase();
109
- }
110
-
111
- function doesLabelMatch(itemToCheck, fn) {
112
- const lowerCaseLabel = getLowerCaseLabel(itemToCheck);
113
-
114
- if (lowerCaseLabel == null) {
115
- return true;
116
- }
117
-
118
- return fn(lowerCaseLabel);
119
- }
120
-
121
- function getFilterFn(filter) {
122
- if (filter.fn) {
123
- return filter.fn;
124
- }
125
-
126
- if (filter.fuzzy) {
127
- return (itemToCheck, checkString) => doesLabelMatch(itemToCheck, lowerCaseLabel => fuzzyHighlight(checkString, lowerCaseLabel).matched);
128
- }
129
-
130
- return (itemToCheck, checkString) => doesLabelMatch(itemToCheck, lowerCaseLabel => lowerCaseLabel.indexOf(checkString) >= 0);
131
- }
132
-
133
- const buildMultipleMap = selected => selected.reduce((acc, item) => {
134
- acc[item.key] = true;
135
- return acc;
136
- }, {});
137
-
138
- function getListItems(props, state, rawFilterString) {
139
- let data = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : props.data;
140
- let filterString = rawFilterString.trim();
141
-
142
- if (isInputMode(props.type) && state.selected && filterString === state.selected.label) {
143
- filterString = ''; // ignore multiple if it is exactly the selected item
144
- }
145
-
146
- const lowerCaseString = filterString.toLowerCase();
147
- const filteredData = [];
148
- let exactMatch = false;
149
- const check = getFilterFn(props.filter);
150
-
151
- for (let i = 0; i < data.length; i++) {
152
- const item = _objectSpread2({}, data[i]);
153
-
154
- if (check(item, lowerCaseString, data)) {
155
- exactMatch = item.label === filterString;
156
-
157
- if (props.multiple && !props.multiple.removeSelectedItems) {
158
- item.checkbox = !!state.multipleMap[item.key];
159
- }
160
-
161
- if (props.multiple && props.multiple.limit) {
162
- item.disabled = props.multiple.limit === state.selected.length && !state.selected.find(selectedItem => selectedItem.key === item.key);
163
- } // Ignore item if it's multiple and is already selected
164
-
165
-
166
- if (!(props.multiple && props.multiple.removeSelectedItems && state.multipleMap[item.key])) {
167
- filteredData.push(item);
168
- }
169
- }
170
- }
171
-
172
- let addButton = null;
173
- const {
174
- add
175
- } = props;
176
-
177
- if (add && filterString && !exactMatch || add && add.alwaysVisible) {
178
- if (!(add.regexp && !add.regexp.test(filterString)) && !(add.minlength && filterString.length < +add.minlength) || add.alwaysVisible) {
179
- let label;
180
-
181
- if (add.label) {
182
- label = typeof add.label === 'function' ? add.label(filterString) : add.label;
183
- } else {
184
- label = filterString;
185
- }
186
-
187
- addButton = {
188
- prefix: add.prefix,
189
- label,
190
- delayed: add.hasOwnProperty('delayed') ? add.delayed : true
191
- };
192
- }
193
- }
194
-
195
- return {
196
- filteredData,
197
- addButton
198
- };
199
- }
200
-
201
- function getSelectedIndex(selected, data, multiple) {
202
- const firstSelected = multiple ? selected[0] : selected;
203
-
204
- if (firstSelected == null) {
205
- return null;
206
- }
207
-
208
- for (let i = 0; i < data.length; i++) {
209
- const item = data[i];
210
-
211
- if (item.key === undefined) {
212
- continue;
213
- }
214
-
215
- if (item.key === firstSelected.key) {
216
- return i;
217
- }
218
- }
219
-
220
- return null;
221
- }
222
-
223
- const getItemLabel = _ref => {
224
- let {
225
- selectedLabel,
226
- label
227
- } = _ref;
228
- return selectedLabel != null ? selectedLabel : label;
229
- };
230
-
231
- const getValueForFilter = (selected, type, filterValue) => selected && isInputMode(type) ? getItemLabel(selected) : filterValue;
232
-
233
- function isSameSelected(prevSelected, selected) {
234
- if (!prevSelected || !selected || prevSelected.length !== selected.length) {
235
- return false;
236
- }
237
-
238
- const keysMap = selected.reduce((result, item) => {
239
- result[item.key] = true;
240
- return result;
241
- }, {});
242
- return prevSelected.every(it => keysMap[it.key]);
243
- }
244
- /**
245
- * @name Select
246
- * @constructor
247
- * @extends {Component}
248
- */
249
-
250
- /**
251
- * Displays a select.
252
- */
253
-
254
-
255
- class Select extends Component {
256
- constructor() {
257
- var _this;
258
-
259
- super(...arguments);
260
- _this = this;
261
-
262
- _defineProperty(this, "state", {
263
- data: [],
264
- shownData: [],
265
- selected: this.props.multiple ? [] : null,
266
- selectedIndex: null,
267
- filterValue: this.props.filter && this.props.filter.value || '',
268
- shortcutsEnabled: false,
269
- popupShortcuts: false,
270
- showPopup: false,
271
- prevData: this.props.data,
272
- prevSelected: null,
273
- prevMultiple: this.props.multiple,
274
- multipleMap: {},
275
- addButton: null
276
- });
277
-
278
- _defineProperty(this, "id", getUID('select-'));
279
-
280
- _defineProperty(this, "shortcutsScope", this.id);
281
-
282
- _defineProperty(this, "listId", `${this.id}:list`);
283
-
284
- _defineProperty(this, "_focusHandler", () => {
285
- this.props.onFocus();
286
- this.setState({
287
- shortcutsEnabled: true,
288
- focused: true
289
- });
290
- });
291
-
292
- _defineProperty(this, "_blurHandler", () => {
293
- this.props.onBlur();
294
-
295
- if (this._popup && this._popup.isVisible() && !this._popup.isClickingPopup) {
296
- window.setTimeout(() => {
297
- this.setState({
298
- showPopup: false
299
- });
300
- });
301
- }
302
-
303
- if (!this._popup.isClickingPopup) {
304
- this.setState({
305
- shortcutsEnabled: false,
306
- focused: false
307
- });
308
- }
309
- });
310
-
311
- _defineProperty(this, "nodeRef", el => {
312
- this.node = el;
313
- });
314
-
315
- _defineProperty(this, "_popup", null);
316
-
317
- _defineProperty(this, "onEmptyPopupEnter", () => {
318
- if (this.state.addButton) {
319
- this.addHandler();
320
- }
321
- });
322
-
323
- _defineProperty(this, "_onEnter", () => {
324
- if (this.state.addButton && this.state.shownData.length === 0) {
325
- this.addHandler();
326
- }
327
-
328
- this.props.onDone();
329
-
330
- if (!this._popup.isVisible() && this.props.allowAny) {
331
- return true;
332
- }
333
-
334
- return undefined;
335
- });
336
-
337
- _defineProperty(this, "_onEsc", event => {
338
- if (!this._popup.isVisible()) {
339
- return true;
340
- } else if (this.props.multiple || !this.props.getInitial) {
341
- return false;
342
- }
343
-
344
- const selected = {
345
- key: Math.random(),
346
- label: this.props.getInitial()
347
- };
348
- this.setState({
349
- selected,
350
- filterValue: this.getValueForFilter(selected)
351
- }, () => {
352
- this.props.onChange(selected, event);
353
- this.props.onReset();
354
- });
355
- return undefined;
356
- });
357
-
358
- _defineProperty(this, "_inputShortcutHandler", () => {
359
- if (this.state.focused && this._popup && !this._popup.isVisible()) {
360
- this._clickHandler();
361
- }
362
- });
363
-
364
- _defineProperty(this, "popupRef", el => {
365
- this._popup = el;
366
- });
367
-
368
- _defineProperty(this, "addHandler", () => {
369
- const value = this.filterValue();
370
-
371
- this._hidePopup();
372
-
373
- this.props.onAdd(value);
374
- });
375
-
376
- _defineProperty(this, "getLowerCaseLabel", getLowerCaseLabel);
377
-
378
- _defineProperty(this, "doesLabelMatch", doesLabelMatch);
379
-
380
- _defineProperty(this, "_clickHandler", () => {
381
- if (!this.props.disabled) {
382
- if (this.state.showPopup) {
383
- this._hidePopup();
384
- } else {
385
- this.props.onBeforeOpen();
386
-
387
- this._showPopup();
388
- }
389
- }
390
- });
391
-
392
- _defineProperty(this, "_selectButtonKeyboardHack", event => {
393
- const key = getEventKey(event);
394
-
395
- if (key === 'Enter' || key === ' ') {
396
- this._clickHandler();
397
- }
398
- });
399
-
400
- _defineProperty(this, "_filterChangeHandler", e => {
401
- this._setFilter(e.target.value, e);
402
- });
403
-
404
- _defineProperty(this, "_setFilter", function (value) {
405
- let event = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
406
-
407
- if (_this.isInputMode() && !_this.state.focused) {
408
- return;
409
- }
410
-
411
- if (value === _this.state.filterValue) {
412
- return;
413
- }
414
-
415
- const filterValue = value.replace(/^\s+/g, '');
416
-
417
- _this.props.onFilter(filterValue);
418
-
419
- if (_this.props.allowAny) {
420
- const fakeSelected = {
421
- key: Math.random(),
422
- label: filterValue
423
- };
424
-
425
- _this.setState({
426
- selected: filterValue === '' ? null : fakeSelected,
427
- selectedIndex: null
428
- }, () => {
429
- _this.props.onSelect(fakeSelected, event);
430
-
431
- _this.props.onChange(fakeSelected, event);
432
- });
433
- }
434
-
435
- !_this._popup.isVisible() && _this.props.onBeforeOpen();
436
-
437
- _this.setState({
438
- filterValue
439
- }, () => {
440
- _this._showPopup();
441
- });
442
- });
443
-
444
- _defineProperty(this, "_redrawPopup", () => {
445
- if (this.props.multiple) {
446
- setTimeout(() => {
447
- //setTimeout solves events order and bubbling issue
448
- this.isInputMode() && this.clearFilter();
449
-
450
- this._showPopup();
451
- }, 0);
452
- }
453
- });
454
-
455
- _defineProperty(this, "_listSelectHandler", function (selected, event) {
456
- let opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
457
- const isItem = List.isItemType.bind(null, List.ListProps.Type.ITEM);
458
- const isCustomItem = List.isItemType.bind(null, List.ListProps.Type.CUSTOM);
459
- const isSelectItemEvent = event && (event.type === 'select' || event.type === 'keydown');
460
-
461
- if (isSelectItemEvent) {
462
- event.preventDefault();
463
- }
464
-
465
- if (!isItem(selected) && !isCustomItem(selected) || selected.disabled || selected.isResetItem) {
466
- return;
467
- }
468
-
469
- if (!_this.props.multiple) {
470
- _this._hidePopup(isSelectItemEvent);
471
-
472
- _this.setState({
473
- selected,
474
- selectedIndex: _this._getSelectedIndex(selected, _this.props.data)
475
- }, () => {
476
- const newFilterValue = _this.isInputMode() && !_this.props.hideSelected ? getItemLabel(selected) : '';
477
-
478
- _this.filterValue(newFilterValue);
479
-
480
- _this.props.onFilter(newFilterValue);
481
-
482
- _this.props.onSelect(selected, event);
483
-
484
- _this.props.onChange(selected, event);
485
- });
486
- } else {
487
- const {
488
- tryKeepOpen
489
- } = opts;
490
-
491
- if (!tryKeepOpen) {
492
- _this._hidePopup(isSelectItemEvent);
493
- }
494
-
495
- if (selected.key == null) {
496
- throw new Error('Multiple selection requires each item to have the "key" property');
497
- }
498
-
499
- _this.setState(prevState => {
500
- const currentSelection = prevState.selected;
501
- let nextSelection;
502
-
503
- if (!prevState.multipleMap[selected.key]) {
504
- nextSelection = currentSelection.concat(selected);
505
- _this.props.onSelect && _this.props.onSelect(selected, event);
506
- } else {
507
- nextSelection = currentSelection.filter(item => item.key !== selected.key);
508
- _this.props.onDeselect && _this.props.onDeselect(selected);
509
- }
510
-
511
- _this.props.onChange(nextSelection, event);
512
-
513
- const nextState = {
514
- selected: nextSelection,
515
- selectedIndex: _this._getSelectedIndex(selected, _this.props.data)
516
- };
517
-
518
- if (_this.props.multiple.limit && nextSelection.length === _this.props.multiple.limit) {
519
- nextState.shownData = prevState.shownData.map(item => nextSelection.find(selectedItem => selectedItem.key === item.key) ? item : _objectSpread2(_objectSpread2({}, item), {}, {
520
- disabled: true
521
- }));
522
- }
523
-
524
- if (!prevState.multipleMap[selected.key]) {
525
- nextState.multipleMap = _objectSpread2(_objectSpread2({}, prevState.multipleMap), {}, {
526
- [selected.key]: true
527
- });
528
- } else {
529
- const _prevState$multipleMa = prevState.multipleMap,
530
- _selected$key = selected.key,
531
- restMultipleMap = _objectWithoutProperties(_prevState$multipleMa, [_selected$key].map(_toPropertyKey));
532
-
533
- nextState.multipleMap = restMultipleMap;
534
- }
535
-
536
- return nextState;
537
- }, () => {
538
- if (tryKeepOpen) {
539
- _this._redrawPopup();
540
- }
541
- });
542
- }
543
- });
544
-
545
- _defineProperty(this, "_listSelectAllHandler", function () {
546
- let isSelectAll = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
547
- const isItem = List.isItemType.bind(null, List.ListProps.Type.ITEM);
548
- const isCustomItem = List.isItemType.bind(null, List.ListProps.Type.CUSTOM);
549
-
550
- _this.setState(prevState => {
551
- const currentSelection = prevState.selected;
552
- let nextSelection;
553
-
554
- if (isSelectAll) {
555
- nextSelection = _this.props.data.filter(item => (isItem(item) || isCustomItem(item)) && !item.disabled);
556
- nextSelection.filter(item => !_this.props.selected.find(selectedItem => item.key === selectedItem.key)).forEach(item => {
557
- _this.props.onSelect && _this.props.onSelect(item);
558
- });
559
- } else {
560
- nextSelection = [];
561
- currentSelection.forEach(item => {
562
- _this.props.onDeselect && _this.props.onDeselect(item);
563
- });
564
- }
565
-
566
- _this.props.onChange(nextSelection, event);
567
-
568
- return {
569
- filterValue: '',
570
- selected: nextSelection,
571
- selectedIndex: isSelectAll ? _this._getSelectedIndex(nextSelection, _this.props.data) : null,
572
- shownData: prevState.shownData.map(item => _objectSpread2(_objectSpread2({}, item), {}, {
573
- checkbox: isSelectAll
574
- })),
575
- multipleMap: isSelectAll ? buildMultipleMap(_this.props.data.filter(item => !item.disabled)) : {}
576
- };
577
- }, _this._redrawPopup);
578
- });
579
-
580
- _defineProperty(this, "_onCloseAttempt", (event, isEsc) => {
581
- if (this.isInputMode()) {
582
- if (!this.props.allowAny) {
583
- if (this.props.hideSelected || !this.state.selected || this.props.multiple) {
584
- this.clearFilter();
585
- } else if (this.state.selected) {
586
- this.filterValue(getItemLabel(this.state.selected));
587
- }
588
- }
589
- }
590
-
591
- const isTagRemoved = this.props.tags && event && event.target && event.target.matches('[data-test="ring-tag-remove"]');
592
-
593
- if (!isTagRemoved) {
594
- this._hidePopup(isEsc);
595
- }
596
- });
597
-
598
- _defineProperty(this, "clearFilter", e => {
599
- this._setFilter('', e);
600
- });
601
-
602
- _defineProperty(this, "clear", event => {
603
- if (event) {
604
- event.stopPropagation();
605
- }
606
-
607
- const empty = Select._getEmptyValue(this.props.multiple);
608
-
609
- this.setState({
610
- selected: empty,
611
- selectedIndex: null,
612
- filterValue: ''
613
- }, () => {
614
- if (this.props.onChange) {
615
- this.props.onChange(empty, event);
616
- }
617
- });
618
- return false;
619
- });
620
-
621
- _defineProperty(this, "popupRef", el => {
622
- this._popup = el;
623
- });
624
-
625
- _defineProperty(this, "buttonRef", el => {
626
- this.button = el;
627
- });
628
-
629
- _defineProperty(this, "filterRef", el => {
630
- this.filter = el;
631
- });
632
- }
633
-
634
- static _getEmptyValue(multiple) {
635
- return multiple ? [] : null;
636
- }
637
-
638
- static getDerivedStateFromProps(nextProps, prevState) {
639
- const {
640
- multiple,
641
- data,
642
- type
643
- } = nextProps;
644
- const {
645
- prevSelected,
646
- prevData,
647
- prevMultiple,
648
- filterValue
649
- } = prevState;
650
- const nextState = {
651
- prevData: data,
652
- prevSelected: nextProps.selected,
653
- prevMultiple: multiple
654
- };
655
-
656
- if ('data' in nextProps && data !== prevData) {
657
- const {
658
- filteredData,
659
- addButton
660
- } = getListItems(nextProps, prevState, filterValue, data);
661
- Object.assign(nextState, {
662
- shownData: filteredData,
663
- addButton
664
- });
665
-
666
- if (prevState.selected) {
667
- Object.assign(nextState, {
668
- selectedIndex: getSelectedIndex(prevState.selected, data, multiple),
669
- prevFilterValue: getValueForFilter(prevState.selected, type, filterValue)
670
- });
671
- }
672
- }
673
-
674
- if ('selected' in nextProps && nextProps.selected !== prevSelected) {
675
- const selected = nextProps.selected || Select._getEmptyValue(multiple);
676
-
677
- const selectedIndex = getSelectedIndex(selected, data || prevData, multiple);
678
- Object.assign(nextState, {
679
- selected,
680
- prevFilterValue: getValueForFilter(selected, type, filterValue)
681
- });
682
-
683
- if (!multiple || !isSameSelected(prevSelected, selected)) {
684
- Object.assign(nextState, {
685
- selectedIndex
686
- });
687
- }
688
- }
689
-
690
- if (prevMultiple !== multiple && !deepEqual(prevMultiple, multiple)) {
691
- nextState.selected = Select._getEmptyValue(multiple);
692
- }
693
-
694
- const {
695
- selected
696
- } = _objectSpread2(_objectSpread2({}, prevState), nextState);
697
-
698
- if (selected && multiple) {
699
- nextState.multipleMap = buildMultipleMap(selected);
700
- const {
701
- filteredData,
702
- addButton
703
- } = getListItems(nextProps, nextState, filterValue, data);
704
- Object.assign(nextState, {
705
- shownData: filteredData,
706
- addButton
707
- });
708
- }
709
-
710
- return nextState;
711
- }
712
-
713
- componentDidUpdate(prevProps, prevState) {
714
- const {
715
- showPopup,
716
- selected
717
- } = this.state;
718
- const {
719
- onClose,
720
- onOpen,
721
- onChange,
722
- multiple
723
- } = this.props;
724
-
725
- if (prevState.showPopup && !showPopup) {
726
- onClose(selected);
727
- } else if (!prevState.showPopup && showPopup) {
728
- onOpen();
729
- }
730
-
731
- if (multiple !== prevProps.multiple && !deepEqual(multiple, prevProps.multiple)) {
732
- onChange(selected);
733
- }
734
- }
735
-
736
- getValueForFilter(selected) {
737
- return getValueForFilter(selected, this.props.type, this.state.filterValue);
738
- }
739
-
740
- _getSelectedIndex(selected, data) {
741
- return getSelectedIndex(selected, data, this.props.multiple);
742
- }
743
-
744
- _getResetOption() {
745
- const isOptionsSelected = this.state.selected && this.state.selected.length;
746
- const hasTagsResetProp = this.props.tags && this.props.tags.reset;
747
-
748
- if (!isOptionsSelected || !hasTagsResetProp) {
749
- return null;
750
- }
751
-
752
- const {
753
- reset
754
- } = this.props.tags;
755
-
756
- const resetHandler = (item, event) => {
757
- this.clear(event);
758
- this.clearFilter();
759
- this.props.onFilter('');
760
- this.setState(prevState => ({
761
- shownData: prevState.shownData.slice(reset.separator ? 2 : 1),
762
- multipleMap: {}
763
- }));
764
-
765
- this._redrawPopup();
766
- };
767
-
768
- return {
769
- isResetItem: true,
770
- separator: reset.separator,
771
- key: reset.label,
772
- rgItemType: List.ListProps.Type.CUSTOM,
773
- template: /*#__PURE__*/React.createElement(Button, {
774
- text: true,
775
- className: modules_9d0de074.button,
776
- "data-test": "ring-select-reset-tags-button"
777
- }, reset.label),
778
- glyph: reset.glyph,
779
- onClick: resetHandler
780
- };
781
- }
782
-
783
- _prependResetOption(shownData) {
784
- const resetOption = this._getResetOption();
785
-
786
- const margin = {
787
- rgItemType: List.ListProps.Type.MARGIN
788
- };
789
-
790
- if (resetOption) {
791
- const resetItems = [margin, resetOption, margin];
792
-
793
- if (resetOption.separator) {
794
- resetItems.push({
795
- rgItemType: List.ListProps.Type.SEPARATOR
796
- });
797
- }
798
-
799
- return resetItems.concat(shownData);
800
- }
801
-
802
- return shownData;
803
- }
804
-
805
- _renderPopup() {
806
- const anchorElement = this.props.targetElement || this.node;
807
- const {
808
- showPopup,
809
- shownData
810
- } = this.state;
811
-
812
- const _shownData = this._prependResetOption(shownData);
813
-
814
- let message = null;
815
-
816
- if (this.props.loading) {
817
- message = this.props.loadingMessage;
818
- } else if (!shownData.length) {
819
- message = this.props.notFoundMessage;
820
- }
821
-
822
- return /*#__PURE__*/React.createElement(SelectPopup, {
823
- data: _shownData,
824
- message: message,
825
- toolbar: showPopup && this.getToolbar(),
826
- loading: this.props.loading,
827
- activeIndex: this.state.selectedIndex,
828
- hidden: !showPopup,
829
- ref: this.popupRef,
830
- maxHeight: this.props.maxHeight,
831
- minWidth: this.props.minWidth,
832
- directions: this.props.directions,
833
- className: this.props.popupClassName,
834
- style: this.props.popupStyle,
835
- top: this.props.top,
836
- left: this.props.left,
837
- filter: this.isInputMode() ? false : this.props.filter // disable popup filter in INPUT mode
838
- ,
839
- multiple: this.props.multiple,
840
- filterValue: this.state.filterValue,
841
- anchorElement: anchorElement,
842
- onCloseAttempt: this._onCloseAttempt,
843
- onSelect: this._listSelectHandler,
844
- onSelectAll: this._listSelectAllHandler,
845
- onFilter: this._filterChangeHandler,
846
- onClear: this.clearFilter,
847
- onLoadMore: this.props.onLoadMore,
848
- isInputMode: this.isInputMode(),
849
- selected: this.state.selected,
850
- tags: this.props.tags,
851
- compact: this.props.compact,
852
- renderOptimization: this.props.renderOptimization,
853
- ringPopupTarget: this.props.ringPopupTarget,
854
- disableMoveOverflow: this.props.disableMoveOverflow,
855
- disableScrollToActive: this.props.disableScrollToActive,
856
- dir: this.props.dir,
857
- onEmptyPopupEnter: this.onEmptyPopupEnter,
858
- listId: this.listId
859
- });
860
- }
861
-
862
- _showPopup() {
863
- if (!this.node) {
864
- return;
865
- }
866
-
867
- const shownData = this.getListItems(this.filterValue());
868
- this.setState({
869
- showPopup: !!shownData.length || !this.props.allowAny,
870
- shownData
871
- });
872
- }
873
-
874
- _hidePopup(tryFocusAnchor) {
875
- if (this.node && this.state.showPopup) {
876
- this.setState({
877
- showPopup: false,
878
- filterValue: ''
879
- });
880
-
881
- if (tryFocusAnchor) {
882
- const restoreFocusNode = this.props.targetElement || this.node.querySelector('[data-test~=ring-select__focus]');
883
-
884
- if (restoreFocusNode) {
885
- restoreFocusNode.focus();
886
- }
887
- }
888
- }
889
- }
890
-
891
- getToolbar() {
892
- const {
893
- hint
894
- } = this.props;
895
- const {
896
- prefix,
897
- label,
898
- delayed
899
- } = this.state.addButton || {};
900
- const isToolbarHasElements = this.state.addButton || hint;
901
-
902
- if (!isToolbarHasElements) {
903
- return null;
904
- }
905
-
906
- return /*#__PURE__*/React.createElement("div", {
907
- className: classNames({
908
- [modules_9d0de074.toolbar]: !!this.state.addButton
909
- }),
910
- "data-test": "ring-select-toolbar"
911
- }, this.state.addButton && /*#__PURE__*/React.createElement(Button, {
912
- text: true,
913
- delayed: delayed,
914
- className: classNames(modules_9d0de074.button, modules_9d0de074.buttonSpaced),
915
- onClick: this.addHandler,
916
- "data-test": "ring-select-toolbar-button"
917
- }, prefix ? `${prefix} ${label}` : label), hint && /*#__PURE__*/React.createElement(List.ListHint, {
918
- label: hint,
919
- "data-test": "ring-select-toolbar-hint"
920
- }));
921
- }
922
-
923
- getFilterFn() {
924
- return getFilterFn(this.props.filter);
925
- }
926
-
927
- getListItems(rawFilterString, data) {
928
- const {
929
- filteredData,
930
- addButton
931
- } = getListItems(this.props, this.state, rawFilterString, data);
932
- this.setState({
933
- addButton
934
- });
935
- return filteredData;
936
- }
937
-
938
- filterValue(setValue) {
939
- if (typeof setValue === 'string' || typeof setValue === 'number') {
940
- this.setState({
941
- filterValue: setValue
942
- });
943
- } else {
944
- return this.state.filterValue;
945
- }
946
-
947
- return undefined;
948
- }
949
-
950
- isInputMode() {
951
- return isInputMode(this.props.type);
952
- }
953
-
954
- _rebuildMultipleMap(selected, multiple) {
955
- if (selected && multiple) {
956
- this.setState({
957
- multipleMap: buildMultipleMap(selected)
958
- });
959
- }
960
- }
961
-
962
- _selectionIsEmpty() {
963
- return this.props.multiple && !this.state.selected.length || !this.state.selected;
964
- }
965
-
966
- _getLabel() {
967
- return this.props.label || this.props.selectedLabel || 'Select an option';
968
- }
969
-
970
- _getSelectedString() {
971
- if (this.props.multiple) {
972
- const labels = [];
973
-
974
- for (let i = 0; i < this.state.selected.length; i++) {
975
- labels.push(getItemLabel(this.state.selected[i]));
976
- }
977
-
978
- return labels.filter(Boolean).join(', ');
979
- } else {
980
- return getItemLabel(this.state.selected);
981
- }
982
- }
983
-
984
- _getIcons() {
985
- const {
986
- selected
987
- } = this.state;
988
- const {
989
- disabled,
990
- clear,
991
- hideArrow
992
- } = this.props;
993
- const icons = [];
994
-
995
- if (selected !== null && selected !== void 0 && selected.icon) {
996
- icons.push( /*#__PURE__*/React.createElement("button", {
997
- title: "Toggle options popup",
998
- type: "button",
999
- className: modules_9d0de074.selectedIcon,
1000
- key: "selected",
1001
- onClick: this._clickHandler,
1002
- style: {
1003
- backgroundImage: `url(${selected.icon})`
1004
- }
1005
- }));
1006
- }
1007
-
1008
- if (clear && !disabled && !this._selectionIsEmpty()) {
1009
- icons.push( /*#__PURE__*/React.createElement(Button, {
1010
- title: "Clear selection",
1011
- "data-test": "ring-clear-select",
1012
- className: modules_9d0de074.clearIcon,
1013
- key: "close",
1014
- onClick: this.clear,
1015
- icon: closeIcon
1016
- }));
1017
- }
1018
-
1019
- if (!hideArrow) {
1020
- icons.push( /*#__PURE__*/React.createElement(Button, {
1021
- title: "Toggle options popup",
1022
- className: modules_9d0de074.chevron,
1023
- iconClassName: modules_9d0de074.chevronIcon,
1024
- icon: chevronDown,
1025
- key: "hide",
1026
- onClick: this._clickHandler
1027
- }));
1028
- }
1029
-
1030
- return icons;
1031
- }
1032
-
1033
- _getAvatar() {
1034
- return this.state.selected && this.state.selected.avatar && /*#__PURE__*/React.createElement(Avatar, {
1035
- className: modules_9d0de074.avatar,
1036
- url: this.state.selected.avatar,
1037
- size: Size.Size20
1038
- });
1039
- }
1040
-
1041
- getShortcutsMap() {
1042
- return {
1043
- enter: this._onEnter,
1044
- esc: this._onEsc,
1045
- up: this._inputShortcutHandler,
1046
- down: this._inputShortcutHandler,
1047
- right: noop,
1048
- left: noop,
1049
- 'shift+up': noop,
1050
- 'shift+down': noop,
1051
- space: noop
1052
- };
1053
- }
1054
-
1055
- renderSelect(activeItemId) {
1056
- var _this$_popup, _this$_popup$list;
1057
-
1058
- const dataTest = this.props['data-test'];
1059
- const {
1060
- shortcutsEnabled
1061
- } = this.state;
1062
- const classes = classNames(modules_9d0de074.select, 'ring-js-shortcuts', this.props.className, {
1063
- [modules_9d0de074[`size${this.props.size}`]]: this.props.type !== Type.INLINE,
1064
- [modules_9d0de074.disabled]: this.props.disabled
1065
- });
1066
-
1067
- const icons = this._getIcons();
1068
-
1069
- const style = getStyle(icons.length);
1070
- const iconsNode = /*#__PURE__*/React.createElement("span", {
1071
- className: modules_9d0de074.icons
1072
- }, icons);
1073
- const ariaProps = this.state.showPopup ? {
1074
- 'aria-owns': this.listId,
1075
- 'aria-activedescendant': activeItemId
1076
- } : {};
1077
-
1078
- switch (this.props.type) {
1079
- case Type.INPUT_WITHOUT_CONTROLS:
1080
- case Type.INPUT:
1081
- return /*#__PURE__*/React.createElement("div", {
1082
- ref: this.nodeRef,
1083
- className: classNames(classes, modules_9d0de074.inputMode),
1084
- "data-test": joinDataTestAttributes('ring-select', dataTest)
1085
- }, shortcutsEnabled && /*#__PURE__*/React.createElement(Shortcuts, {
1086
- map: this.getShortcutsMap(),
1087
- scope: this.shortcutsScope
1088
- }), /*#__PURE__*/React.createElement(Input, _extends({}, ariaProps, {
1089
- autoComplete: "off",
1090
- id: this.props.id,
1091
- onClick: this._clickHandler,
1092
- inputRef: this.filterRef,
1093
- disabled: this.props.disabled,
1094
- value: this.state.filterValue,
1095
- borderless: this.props.type === Type.INPUT_WITHOUT_CONTROLS,
1096
- style: style,
1097
- size: Size$1.FULL,
1098
- onChange: this._filterChangeHandler,
1099
- onFocus: this._focusHandler,
1100
- onBlur: this._blurHandler,
1101
- label: this.props.type === Type.INPUT ? this._getLabel() : null,
1102
- placeholder: this.props.inputPlaceholder,
1103
- onKeyDown: this.props.onKeyDown,
1104
- "data-test": "ring-select__focus",
1105
- enableShortcuts: shortcutsEnabled ? Object.keys(_objectSpread2(_objectSpread2({}, this.getShortcutsMap()), (_this$_popup = this._popup) === null || _this$_popup === void 0 ? void 0 : (_this$_popup$list = _this$_popup.list) === null || _this$_popup$list === void 0 ? void 0 : _this$_popup$list.shortcutsMap)) : undefined
1106
- })), this.props.type === Type.INPUT && iconsNode, this._renderPopup());
1107
-
1108
- case Type.BUTTON:
1109
- return /*#__PURE__*/React.createElement("div", {
1110
- ref: this.nodeRef,
1111
- className: classNames(classes, modules_9d0de074.buttonMode),
1112
- "data-test": joinDataTestAttributes('ring-select', dataTest)
1113
- }, shortcutsEnabled && /*#__PURE__*/React.createElement(Shortcuts, {
1114
- map: this.getShortcutsMap(),
1115
- scope: this.shortcutsScope
1116
- }), /*#__PURE__*/React.createElement(ThemeContext.Consumer, null, contextTheme => /*#__PURE__*/React.createElement("div", _extends({}, ariaProps, {
1117
- id: this.props.id,
1118
- onClick: this._clickHandler,
1119
- onKeyPress: this._selectButtonKeyboardHack,
1120
- className: classNames(modules_e81895c9.button, modules_e81895c9[this.props.theme || contextTheme || Theme.LIGHT], modules_9d0de074.buttonValue, {
1121
- [modules_9d0de074.buttonValueOpen]: this.state.showPopup
1122
- }),
1123
- role: "button",
1124
- tabIndex: 0,
1125
- disabled: this.props.disabled,
1126
- style: style,
1127
- "data-test": "ring-select__button ring-select__focus"
1128
- }), this._getAvatar(), this._selectionIsEmpty() ? this._getLabel() : this._getSelectedString(), iconsNode)), this._renderPopup());
1129
-
1130
- case Type.MATERIAL:
1131
- return /*#__PURE__*/React.createElement("div", {
1132
- ref: this.nodeRef,
1133
- className: classNames(classes, modules_9d0de074.materialMode),
1134
- "data-test": joinDataTestAttributes('ring-select', dataTest)
1135
- }, shortcutsEnabled && /*#__PURE__*/React.createElement(Shortcuts, {
1136
- map: this.getShortcutsMap(),
1137
- scope: this.shortcutsScope
1138
- }), !this._selectionIsEmpty() && this.props.selectedLabel && /*#__PURE__*/React.createElement("span", {
1139
- className: modules_9d0de074.selectedLabel
1140
- }, this.props.selectedLabel), /*#__PURE__*/React.createElement("button", _extends({}, ariaProps, {
1141
- id: this.props.id,
1142
- onClick: this._clickHandler,
1143
- type: "button",
1144
- disabled: this.props.disabled,
1145
- className: classNames(modules_9d0de074.value, {
1146
- [modules_9d0de074.open]: this.state.showPopup,
1147
- [modules_9d0de074.label]: this._selectionIsEmpty()
1148
- }),
1149
- "aria-label": this._getLabel(),
1150
- style: style,
1151
- "data-test": "ring-select__focus",
1152
- ref: this.buttonRef
1153
- }), this._getAvatar(), this._selectionIsEmpty() ? this._getLabel() : this._getSelectedString()), iconsNode, this._renderPopup());
1154
-
1155
- case Type.INLINE:
1156
- return /*#__PURE__*/React.createElement("div", {
1157
- className: classes,
1158
- ref: this.nodeRef,
1159
- "data-test": joinDataTestAttributes('ring-select', dataTest)
1160
- }, shortcutsEnabled && /*#__PURE__*/React.createElement(Shortcuts, {
1161
- map: this.getShortcutsMap(),
1162
- scope: this.shortcutsScope
1163
- }), /*#__PURE__*/React.createElement(Anchor, _extends({}, ariaProps, {
1164
- id: this.props.id,
1165
- onClick: this._clickHandler,
1166
- "data-test": "ring-select__focus",
1167
- disabled: this.props.disabled,
1168
- active: this.state.showPopup
1169
- }), this._selectionIsEmpty() ? this._getLabel() : this._getSelectedString()), this._renderPopup());
1170
-
1171
- default:
1172
- if (this.props.customAnchor) {
1173
- return /*#__PURE__*/React.createElement(Fragment, null, shortcutsEnabled && /*#__PURE__*/React.createElement(Shortcuts, {
1174
- map: this.getShortcutsMap(),
1175
- scope: this.shortcutsScope
1176
- }), this.props.customAnchor({
1177
- wrapperProps: {
1178
- ref: this.nodeRef,
1179
- 'data-test': joinDataTestAttributes('ring-select', dataTest)
1180
- },
1181
- buttonProps: _objectSpread2(_objectSpread2({}, ariaProps), {}, {
1182
- id: this.props.id,
1183
- onClick: this._clickHandler,
1184
- disabled: this.props.disabled,
1185
- children: this._selectionIsEmpty() ? this._getLabel() : this._getSelectedString(),
1186
- 'data-test': 'ring-select_focus'
1187
- }),
1188
- popup: this._renderPopup()
1189
- }));
1190
- }
1191
-
1192
- return /*#__PURE__*/React.createElement("span", {
1193
- id: this.props.id,
1194
- ref: this.nodeRef,
1195
- "data-test": "ring-select"
1196
- }, this._renderPopup());
1197
- }
1198
- }
1199
-
1200
- render() {
1201
- return /*#__PURE__*/React.createElement(ActiveItemContext.Provider, null, /*#__PURE__*/React.createElement(ActiveItemContext.ValueContext.Consumer, null, activeItemId => this.renderSelect(activeItemId)));
1202
- }
1203
-
1204
- }
1205
-
1206
- _defineProperty(Select, "propTypes", {
1207
- className: PropTypes.string,
1208
- id: PropTypes.string,
1209
- multiple: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
1210
- allowAny: PropTypes.bool,
1211
- filter: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
1212
- getInitial: PropTypes.func,
1213
- onClose: PropTypes.func,
1214
- onOpen: PropTypes.func,
1215
- onDone: PropTypes.func,
1216
- onFilter: PropTypes.func,
1217
- onChange: PropTypes.func,
1218
- onReset: PropTypes.func,
1219
- onLoadMore: PropTypes.func,
1220
- onAdd: PropTypes.func,
1221
- onBeforeOpen: PropTypes.func,
1222
- onSelect: PropTypes.func,
1223
- onDeselect: PropTypes.func,
1224
- onFocus: PropTypes.func,
1225
- onBlur: PropTypes.func,
1226
- onKeyDown: PropTypes.func,
1227
- selected: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
1228
- data: PropTypes.array,
1229
- tags: PropTypes.object,
1230
- targetElement: PropTypes.object,
1231
- loading: PropTypes.bool,
1232
- loadingMessage: PropTypes.string,
1233
- notFoundMessage: PropTypes.string,
1234
- maxHeight: PropTypes.number,
1235
- minWidth: PropTypes.number,
1236
- directions: PropTypes.array,
1237
- popupClassName: PropTypes.string,
1238
- popupStyle: PropTypes.object,
1239
- top: PropTypes.number,
1240
- left: PropTypes.number,
1241
- renderOptimization: PropTypes.bool,
1242
- ringPopupTarget: PropTypes.string,
1243
- hint: List.ListHint.propTypes.label,
1244
- add: PropTypes.object,
1245
- type: PropTypes.oneOf(Object.values(Type)),
1246
- disabled: PropTypes.bool,
1247
- hideSelected: PropTypes.bool,
1248
- label: PropTypes.string,
1249
- selectedLabel: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.node), PropTypes.node]),
1250
- inputPlaceholder: PropTypes.string,
1251
- clear: PropTypes.bool,
1252
- hideArrow: PropTypes.bool,
1253
- compact: PropTypes.bool,
1254
- size: PropTypes.oneOf(Object.values(Size$1)),
1255
- theme: PropTypes.string,
1256
- customAnchor: PropTypes.func,
1257
- disableMoveOverflow: PropTypes.bool,
1258
- disableScrollToActive: PropTypes.bool,
1259
- dir: PropTypes.oneOf(['ltr', 'rtl']),
1260
- 'data-test': PropTypes.string
1261
- });
1262
-
1263
- _defineProperty(Select, "defaultProps", {
1264
- data: [],
1265
- filter: false,
1266
- // enable filter (not in INPUT modes)
1267
- multiple: false,
1268
- // multiple can be an object - see demo for more information
1269
- clear: false,
1270
- // enable clear button that clears the "selected" state
1271
- loading: false,
1272
- // show a loading indicator while data is loading
1273
- disabled: false,
1274
- // disable select
1275
- loadingMessage: 'Loading...',
1276
- notFoundMessage: 'No options found',
1277
- type: Type.MATERIAL,
1278
- size: Size$1.M,
1279
- targetElement: null,
1280
- // element to bind the popup to (select BUTTON or INPUT by default)
1281
- hideSelected: false,
1282
- // INPUT mode: clears the input after an option is selected (useful when the selection is displayed in some custom way elsewhere)
1283
- allowAny: false,
1284
- // INPUT mode: allows any value to be entered, hides the dropdown icon
1285
- hideArrow: false,
1286
- // hide dropdown arrow icon
1287
- maxHeight: 600,
1288
- // height of the options list, including the filter and the 'Add' button
1289
- directions: [Popup.PopupProps.Directions.BOTTOM_RIGHT, Popup.PopupProps.Directions.BOTTOM_LEFT, Popup.PopupProps.Directions.TOP_LEFT, Popup.PopupProps.Directions.TOP_RIGHT],
1290
- selected: null,
1291
- // current selection (item / array of items)
1292
- label: '',
1293
- // BUTTON or INPUT label (nothing selected)
1294
- selectedLabel: '',
1295
- // BUTTON or INPUT label (something selected)
1296
- inputPlaceholder: '',
1297
- // Placeholder for input modes
1298
- hint: null,
1299
- // hint text to display under the list
1300
- shortcutsEnabled: false,
1301
- onBeforeOpen: noop,
1302
- onLoadMore: noop,
1303
- onOpen: noop,
1304
- onClose: noop,
1305
- onFilter: noop,
1306
- // search string as first argument
1307
- onFocus: noop,
1308
- onBlur: noop,
1309
- onKeyDown: noop,
1310
- onSelect: noop,
1311
- // single + multi
1312
- onDeselect: noop,
1313
- // multi
1314
- onChange: noop,
1315
- // multi
1316
- onAdd: noop,
1317
- // search string as first argument
1318
- onDone: noop,
1319
- onReset: noop,
1320
- tags: null,
1321
- onRemoveTag: noop,
1322
- ringPopupTarget: null,
1323
- dir: 'ltr'
1324
- });
1325
-
1326
- _defineProperty(Select, "Type", Type);
1327
-
1328
- _defineProperty(Select, "Size", Size$1);
1329
-
1330
- _defineProperty(Select, "Theme", Theme);
1331
-
1332
- const RerenderableSelect = rerenderHOC(Select);
1333
-
1334
- export default Select;
1335
- export { RerenderableSelect };