@jetbrains/ring-ui 4.1.1 → 4.1.2

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