@jetbrains/ring-ui 4.1.0-beta.13 → 4.1.0-beta.17

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 (382) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +14 -13
  3. package/components/alert/container.css +1 -1
  4. package/components/auth/auth.test.js +14 -7
  5. package/components/auth/auth__core.js +12 -6
  6. package/components/avatar/avatar.css +4 -1
  7. package/components/avatar/avatar.examples.js +3 -2
  8. package/components/avatar/avatar.js +31 -6
  9. package/components/avatar/fallback-avatar.js +136 -0
  10. package/components/avatar-editor-ng/avatar-editor-ng.css +2 -2
  11. package/components/avatar-editor-ng/avatar-editor-ng.js +2 -1
  12. package/components/avatar-editor-ng/{avatar-editor-ng.html → avatar-editor-ng__template.js} +2 -2
  13. package/components/button/button.css +2 -2
  14. package/components/button-group/button-group.js +1 -1
  15. package/components/button-group/caption.js +1 -1
  16. package/components/button-ng/button-ng.js +1 -1
  17. package/components/button-set-ng/button-set-ng.js +3 -1
  18. package/components/checkbox/checkbox.css +1 -1
  19. package/components/code/code.js +1 -1
  20. package/components/content-layout/content-layout.css +1 -1
  21. package/components/data-list/data-list.css +1 -1
  22. package/components/date-picker/date-input.js +5 -4
  23. package/components/date-picker/date-picker.css +10 -6
  24. package/components/date-picker/date-picker.js +16 -14
  25. package/components/date-picker/date-popup.js +8 -4
  26. package/components/date-picker/month-names.js +8 -5
  27. package/components/date-picker/month.js +6 -2
  28. package/components/date-picker/weekdays.js +10 -2
  29. package/components/dialog-ng/dialog-ng.js +6 -7
  30. package/components/dialog-ng/{dialog-ng.html → dialog-ng__template.js} +2 -2
  31. package/components/dropdown/dropdown.examples.js +36 -1
  32. package/components/dropdown-menu/dropdown-menu.examples.js +47 -0
  33. package/components/dropdown-menu/dropdown-menu.js +117 -0
  34. package/components/dropdown-menu/dropdown-menu.test.js +76 -0
  35. package/components/error-bubble/error-bubble-legacy.css +1 -1
  36. package/components/error-bubble/error-bubble.css +1 -1
  37. package/components/error-page/error-page.css +2 -2
  38. package/components/footer-ng/footer-ng.js +13 -3
  39. package/components/form/form.css +2 -2
  40. package/components/form-ng/form-ng.js +3 -1
  41. package/components/global/global.css +1 -1
  42. package/components/global/variables.css +8 -1
  43. package/components/grid/grid.css +10 -9
  44. package/components/header/header.css +1 -1
  45. package/components/header/header.examples.js +7 -8
  46. package/components/header/profile.js +10 -11
  47. package/components/http/http.js +1 -1
  48. package/components/icon/icon.css +5 -4
  49. package/components/island/island.css +4 -3
  50. package/components/island-legacy/island-legacy.css +3 -1
  51. package/components/list/list.js +6 -1
  52. package/components/list/list__custom.js +9 -3
  53. package/components/list/list__item.js +8 -2
  54. package/components/loader-inline/loader-inline.css +1 -1
  55. package/components/loader-screen/loader-screen.css +1 -1
  56. package/components/message/message.css +1 -1
  57. package/components/pager/pager.js +5 -3
  58. package/components/permissions/permissions.js +1 -1
  59. package/components/progress-bar/progress-bar.css +1 -1
  60. package/components/query-assist/query-assist.css +1 -1
  61. package/components/save-field-ng/save-field-ng.js +3 -1
  62. package/components/save-field-ng/{save-field-ng.html → save-field-ng__template.js} +2 -2
  63. package/components/select/select.css +4 -0
  64. package/components/select/select.examples.js +13 -0
  65. package/components/select/select.js +6 -6
  66. package/components/shortcuts-hint-ng/shortcuts-hint-ng.css +1 -1
  67. package/components/shortcuts-hint-ng/shortcuts-hint-ng.js +1 -1
  68. package/components/shortcuts-hint-ng/{shortcuts-hint-ng.html → shortcuts-hint-ng__template.js} +2 -2
  69. package/components/sidebar/sidebar.css +1 -0
  70. package/components/sidebar-ng/sidebar-ng.js +6 -2
  71. package/components/sidebar-ng/{sidebar-ng__button.html → sidebar-ng__button-template.js} +2 -2
  72. package/components/sidebar-ng/{sidebar-ng.html → sidebar-ng__template.js} +2 -2
  73. package/components/table/table.css +2 -1
  74. package/components/table-legacy/table-legacy.css +2 -2
  75. package/components/table-legacy-ng/table-legacy-ng.js +38 -5
  76. package/components/table-legacy-ng/table-legacy-ng__pager.js +7 -1
  77. package/components/tabs-ng/tabs-ng.js +3 -1
  78. package/components/tabs-ng/{tabs-ng.html → tabs-ng__template.js} +2 -2
  79. package/components/tag/tag.css +5 -2
  80. package/components/tags-input/tags-input.js +5 -2
  81. package/components/template-ng/template-ng.js +1 -1
  82. package/components/tooltip/tooltip.js +7 -2
  83. package/components/user-agreement/user-agreement.css +1 -1
  84. package/dist/_helpers/button-group.js +3 -0
  85. package/dist/_helpers/button-set.js +3 -0
  86. package/dist/_helpers/button-toolbar.js +3 -0
  87. package/dist/_helpers/button__classes.js +1 -1
  88. package/dist/_helpers/checkbox.js +3 -0
  89. package/dist/_helpers/date-picker.js +1 -1
  90. package/dist/_helpers/error-message.js +3 -0
  91. package/dist/_helpers/footer.js +121 -0
  92. package/dist/_helpers/grid.js +1 -1
  93. package/dist/_helpers/group.js +3 -0
  94. package/dist/_helpers/header.js +1 -1
  95. package/dist/_helpers/icon.js +3 -0
  96. package/dist/_helpers/inject-styles.js +1 -1
  97. package/dist/_helpers/input.js +3 -0
  98. package/dist/_helpers/island.js +1 -1
  99. package/dist/_helpers/link.js +3 -0
  100. package/dist/_helpers/loader-screen.js +3 -0
  101. package/dist/_helpers/panel.js +3 -0
  102. package/dist/_helpers/query-assist__suggestions.js +1 -1
  103. package/dist/_helpers/radio.js +3 -0
  104. package/dist/_helpers/sidebar.js +1 -1
  105. package/dist/_helpers/table.js +1 -1
  106. package/dist/_helpers/tabs.js +1 -1
  107. package/dist/_helpers/title.js +1 -1
  108. package/dist/alert/alert.js +3 -3
  109. package/dist/alert/container.js +2 -2
  110. package/dist/alert-service/alert-service.js +3 -2
  111. package/dist/analytics/analytics.js +2 -2
  112. package/dist/analytics/analytics__custom-plugin.js +1 -1
  113. package/dist/analytics/analytics__fus-plugin.js +1 -1
  114. package/dist/analytics/analytics__ga-plugin.js +1 -1
  115. package/dist/analytics/analytics__plugin-utils.js +1 -1
  116. package/dist/analytics-ng/analytics-ng.js +94 -0
  117. package/dist/auth/auth.js +4 -1
  118. package/dist/auth/auth__core.js +15 -9
  119. package/dist/auth/background-flow.js +1 -2
  120. package/dist/auth/down-notification.js +5 -2
  121. package/dist/auth/iframe-flow.js +5 -2
  122. package/dist/auth/landing-entry.js +1 -1
  123. package/dist/auth/landing.js +5 -2
  124. package/dist/auth/request-builder.js +1 -1
  125. package/dist/auth/response-parser.js +1 -1
  126. package/dist/auth/storage.js +3 -2
  127. package/dist/auth/token-validator.js +1 -1
  128. package/dist/auth/window-flow.js +1 -1
  129. package/dist/auth-dialog/auth-dialog.js +4 -3
  130. package/dist/auth-dialog-service/auth-dialog-service.js +3 -2
  131. package/dist/auth-ng/auth-ng.js +203 -0
  132. package/dist/auth-ng/auth-ng.mock.js +33 -0
  133. package/dist/autofocus-ng/autofocus-ng.js +50 -0
  134. package/dist/avatar/avatar.js +19 -7
  135. package/dist/avatar/fallback-avatar.js +141 -0
  136. package/dist/avatar-editor-ng/avatar-editor-ng.js +164 -0
  137. package/dist/avatar-editor-ng/avatar-editor-ng__template.js +30 -0
  138. package/dist/avatar-ng/avatar-ng.js +18 -0
  139. package/dist/badge/badge.js +1 -1
  140. package/dist/badge-ng/badge-ng.js +16 -0
  141. package/dist/breadcrumb-ng/breadcrumb-ng.js +61 -0
  142. package/dist/button/button.js +3 -2
  143. package/dist/button-group/button-group.js +3 -3
  144. package/dist/button-group/caption.js +24 -5
  145. package/dist/button-group-ng/button-group-ng.js +38 -0
  146. package/dist/button-ng/button-ng.js +223 -0
  147. package/dist/button-set/button-set.js +2 -3
  148. package/dist/button-set-ng/button-set-ng.js +19 -0
  149. package/dist/button-toolbar/button-toolbar.js +2 -3
  150. package/dist/button-toolbar-ng/button-toolbar-ng.js +23 -0
  151. package/dist/caret/caret.js +1 -1
  152. package/dist/checkbox/checkbox.js +4 -4
  153. package/dist/checkbox-ng/checkbox-ng.js +55 -0
  154. package/dist/code/code.js +136 -0
  155. package/dist/compiler-ng/compiler-ng.js +53 -0
  156. package/dist/confirm/confirm.js +4 -2
  157. package/dist/confirm-ng/confirm-ng.js +66 -0
  158. package/dist/confirm-service/confirm-service.js +4 -3
  159. package/dist/content-layout/content-layout.js +1 -1
  160. package/dist/contenteditable/contenteditable.js +1 -1
  161. package/dist/data-list/data-list.js +6 -3
  162. package/dist/data-list/data-list.mock.js +2 -2
  163. package/dist/data-list/item.js +5 -3
  164. package/dist/data-list/selection.js +1 -1
  165. package/dist/data-list/title.js +3 -1
  166. package/dist/data-list-ng/data-list-ng.js +59 -0
  167. package/dist/date-picker/consts.js +1 -2
  168. package/dist/date-picker/date-input.js +10 -6
  169. package/dist/date-picker/date-picker.js +28 -16
  170. package/dist/date-picker/date-popup.js +20 -9
  171. package/dist/date-picker/day.js +1 -1
  172. package/dist/date-picker/formats.js +1 -1
  173. package/dist/date-picker/month-names.js +14 -7
  174. package/dist/date-picker/month-slider.js +1 -1
  175. package/dist/date-picker/month.js +12 -6
  176. package/dist/date-picker/months.js +1 -1
  177. package/dist/date-picker/weekdays.js +12 -4
  178. package/dist/date-picker/years.js +1 -1
  179. package/dist/dialog/dialog.js +3 -2
  180. package/dist/dialog-ng/dialog-ng.js +601 -0
  181. package/dist/dialog-ng/dialog-ng__template.js +71 -0
  182. package/dist/docked-panel-ng/docked-panel-ng.js +170 -0
  183. package/dist/dropdown/anchor.js +2 -1
  184. package/dist/dropdown/dropdown.js +3 -2
  185. package/dist/dropdown-menu/dropdown-menu.js +175 -0
  186. package/dist/error-bubble/error-bubble.js +2 -2
  187. package/dist/error-message/error-message.js +4 -4
  188. package/dist/error-message-ng/error-message-ng.js +53 -0
  189. package/dist/footer/footer.js +6 -122
  190. package/dist/footer-ng/footer-ng.js +75 -0
  191. package/dist/form-ng/form-ng.js +169 -0
  192. package/dist/global/angular-component-factory.js +1 -2
  193. package/dist/global/compose.js +1 -1
  194. package/dist/global/composeRefs.js +1 -1
  195. package/dist/global/conic-gradient.js +1 -2
  196. package/dist/global/create-stateful-context.js +1 -1
  197. package/dist/global/data-tests.js +1 -1
  198. package/dist/global/focus-sensor-hoc.js +1 -1
  199. package/dist/global/fuzzy-highlight.js +1 -1
  200. package/dist/global/get-event-key.js +1 -1
  201. package/dist/global/get-uid.js +1 -1
  202. package/dist/global/linear-function.js +1 -2
  203. package/dist/global/listeners.js +1 -1
  204. package/dist/global/memoize.js +1 -1
  205. package/dist/global/normalize-indent.js +1 -1
  206. package/dist/global/promise-with-timeout.js +1 -1
  207. package/dist/global/radial-gradient-mask.js +1 -1
  208. package/dist/global/react-dom-renderer.js +1 -1
  209. package/dist/global/rerender-hoc.js +1 -1
  210. package/dist/global/ring-angular-component.js +1 -1
  211. package/dist/global/schedule-raf.js +1 -1
  212. package/dist/global/sniffer.js +1 -1
  213. package/dist/global/supports-css.js +1 -1
  214. package/dist/global/theme.js +1 -2
  215. package/dist/global/trivial-template-tag.js +1 -1
  216. package/dist/global/variables_dark.js +1 -1
  217. package/dist/grid/col.js +1 -1
  218. package/dist/grid/row.js +1 -1
  219. package/dist/group/group.js +2 -3
  220. package/dist/group-ng/group-ng.js +11 -0
  221. package/dist/header/header.js +24 -19
  222. package/dist/header/logo.js +3 -2
  223. package/dist/header/profile.js +31 -25
  224. package/dist/header/services-link.js +1 -0
  225. package/dist/header/services.js +4 -2
  226. package/dist/header/smart-profile.js +22 -16
  227. package/dist/header/smart-services.js +5 -2
  228. package/dist/header/tray-icon.js +3 -2
  229. package/dist/header/tray.js +1 -1
  230. package/dist/heading/heading.js +2 -3
  231. package/dist/http/http.js +1 -2
  232. package/dist/http/http.mock.js +1 -1
  233. package/dist/hub-source/hub-source.js +1 -1
  234. package/dist/hub-source/hub-source__users-groups.js +1 -1
  235. package/dist/icon/icon.js +3 -2
  236. package/dist/icon/icon__svg.js +81 -6
  237. package/dist/icon/index.js +2 -1
  238. package/dist/icon-ng/icon-ng.js +89 -0
  239. package/dist/input/input.js +4 -5
  240. package/dist/input-ng/input-ng.js +166 -0
  241. package/dist/island/adaptive-island-hoc.js +1 -2
  242. package/dist/island/content.js +1 -1
  243. package/dist/island/header.js +1 -1
  244. package/dist/island/island.js +1 -2
  245. package/dist/island-legacy/content-legacy.js +1 -1
  246. package/dist/island-legacy/header-legacy.js +1 -1
  247. package/dist/island-legacy/island-legacy.js +1 -1
  248. package/dist/island-ng/island-content-ng.js +56 -0
  249. package/dist/island-ng/island-header-ng.js +32 -0
  250. package/dist/island-ng/island-ng-class-fixer.js +9 -0
  251. package/dist/island-ng/island-ng.js +31 -0
  252. package/dist/link/clickableLink.js +1 -1
  253. package/dist/link/link.js +2 -4
  254. package/dist/link-ng/link-ng.js +25 -0
  255. package/dist/list/list.js +13 -5
  256. package/dist/list/list__custom.js +8 -3
  257. package/dist/list/list__hint.js +1 -1
  258. package/dist/list/list__item.js +15 -6
  259. package/dist/list/list__link.js +2 -1
  260. package/dist/list/list__separator.js +1 -1
  261. package/dist/list/list__title.js +1 -1
  262. package/dist/list/list__users-groups-source.js +6 -2
  263. package/dist/loader/loader.js +1 -1
  264. package/dist/loader/loader__core.js +1 -1
  265. package/dist/loader-inline/loader-inline.js +1 -1
  266. package/dist/loader-inline-ng/loader-inline-ng.js +42 -0
  267. package/dist/loader-ng/loader-ng.js +43 -0
  268. package/dist/loader-screen/loader-screen.js +2 -3
  269. package/dist/loader-screen-ng/loader-screen-ng.js +99 -0
  270. package/dist/login-dialog/login-dialog.js +4 -2
  271. package/dist/login-dialog/service.js +4 -2
  272. package/dist/markdown/code.js +30 -0
  273. package/dist/markdown/heading.js +23 -0
  274. package/dist/markdown/link.js +30 -0
  275. package/dist/markdown/markdown.js +73 -0
  276. package/dist/message/message.js +4 -3
  277. package/dist/message-bundle-ng/message-bundle-ng.js +111 -0
  278. package/dist/pager/pager.js +16 -7
  279. package/dist/pager-ng/pager-ng.js +96 -0
  280. package/dist/panel/panel.js +2 -3
  281. package/dist/panel-ng/panel-ng.js +16 -0
  282. package/dist/permissions/permissions.js +1 -1
  283. package/dist/permissions/permissions__cache.js +1 -1
  284. package/dist/permissions-ng/permissions-ng.js +274 -0
  285. package/dist/place-under-ng/place-under-ng.js +157 -0
  286. package/dist/popup/popup.js +2 -3
  287. package/dist/popup/position.js +1 -2
  288. package/dist/popup-menu/popup-menu.js +6 -3
  289. package/dist/progress-bar/progress-bar.js +2 -2
  290. package/dist/progress-bar-ng/progress-bar-ng.js +15 -0
  291. package/dist/promised-click-ng/promised-click-ng.js +126 -0
  292. package/dist/proxy-attrs/proxy-attrs.js +1 -1
  293. package/dist/query-assist/query-assist.js +6 -3
  294. package/dist/query-assist/query-assist__suggestions.js +5 -1
  295. package/dist/query-assist-ng/query-assist-ng.js +82 -0
  296. package/dist/radio/radio.js +2 -1
  297. package/dist/radio/radio__item.js +2 -4
  298. package/dist/radio-ng/radio-ng.js +63 -0
  299. package/dist/save-field-ng/save-field-ng.js +335 -0
  300. package/dist/save-field-ng/save-field-ng__template.js +34 -0
  301. package/dist/select/select.js +13 -11
  302. package/dist/select/select__filter.js +6 -1
  303. package/dist/select/select__popup.js +7 -2
  304. package/dist/select-ng/select-ng.js +621 -0
  305. package/dist/select-ng/select-ng__lazy.js +150 -0
  306. package/dist/select-ng/select-ng__options.js +145 -0
  307. package/dist/shortcuts/core.js +2 -2
  308. package/dist/shortcuts/shortcuts-hoc.js +1 -1
  309. package/dist/shortcuts/shortcuts.js +6 -6
  310. package/dist/shortcuts-hint-ng/shortcuts-hint-ng.js +120 -0
  311. package/dist/shortcuts-hint-ng/shortcuts-hint-ng__template.js +50 -0
  312. package/dist/shortcuts-ng/shortcuts-ng.js +261 -0
  313. package/dist/sidebar-ng/sidebar-ng.js +111 -0
  314. package/dist/sidebar-ng/sidebar-ng__button-template.js +20 -0
  315. package/dist/sidebar-ng/sidebar-ng__template.js +12 -0
  316. package/dist/storage/storage.js +3 -2
  317. package/dist/storage/storage__fallback.js +1 -1
  318. package/dist/storage/storage__local.js +3 -2
  319. package/dist/style.css +1 -1
  320. package/dist/tab-trap/tab-trap.js +1 -2
  321. package/dist/table/cell.js +1 -1
  322. package/dist/table/disable-hover-hoc.js +1 -1
  323. package/dist/table/header-cell.js +3 -2
  324. package/dist/table/header.js +4 -2
  325. package/dist/table/multitable.js +1 -1
  326. package/dist/table/row-with-focus-sensor.js +4 -2
  327. package/dist/table/row.js +4 -2
  328. package/dist/table/selection-adapter.js +1 -1
  329. package/dist/table/selection-shortcuts-hoc.js +1 -1
  330. package/dist/table/selection.js +1 -1
  331. package/dist/table/smart-table.js +4 -2
  332. package/dist/table/table.js +4 -3
  333. package/dist/table-legacy-ng/table-legacy-ng.js +501 -0
  334. package/dist/table-legacy-ng/table-legacy-ng__pager.js +122 -0
  335. package/dist/table-legacy-ng/table-legacy-ng__selection-navigate-actions.js +123 -0
  336. package/dist/table-legacy-ng/table-legacy-ng__selection.js +179 -0
  337. package/dist/table-legacy-ng/table-legacy-ng__toolbar.js +56 -0
  338. package/dist/table-ng/smart-table-ng.js +65 -0
  339. package/dist/table-ng/table-ng.js +64 -0
  340. package/dist/tabs/collapsible-more.js +5 -1
  341. package/dist/tabs/collapsible-tab.js +2 -1
  342. package/dist/tabs/collapsible-tabs.js +6 -3
  343. package/dist/tabs/dumb-tabs.js +6 -2
  344. package/dist/tabs/smart-tabs.js +6 -2
  345. package/dist/tabs/tab-link.js +2 -1
  346. package/dist/tabs/tab.js +1 -1
  347. package/dist/tabs/tabs.js +5 -1
  348. package/dist/tabs-ng/tabs-ng.js +193 -0
  349. package/dist/tabs-ng/tabs-ng__template.js +40 -0
  350. package/dist/tag/tag.js +4 -3
  351. package/dist/tags-input/tags-input.js +12 -8
  352. package/dist/tags-input-ng/tags-input-ng.js +89 -0
  353. package/dist/tags-list/tags-list.js +3 -2
  354. package/dist/template-ng/template-ng.js +70 -0
  355. package/dist/text/text.js +1 -1
  356. package/dist/theme-ng/theme-ng.js +44 -0
  357. package/dist/title-ng/title-ng.js +114 -0
  358. package/dist/toggle/toggle.js +2 -3
  359. package/dist/toggle-ng/toggle-ng.js +16 -0
  360. package/dist/tooltip/tooltip.js +8 -4
  361. package/dist/tooltip-ng/tooltip-ng.js +98 -0
  362. package/dist/user-agreement/service.js +409 -0
  363. package/dist/user-agreement/toolbox.eula.js +162 -0
  364. package/dist/user-agreement/user-agreement.js +167 -0
  365. package/dist/user-card/card.js +3 -0
  366. package/dist/user-card/smart-user-card-tooltip.js +5 -2
  367. package/dist/user-card/tooltip.js +5 -2
  368. package/dist/user-card/user-card.js +5 -2
  369. package/dist/user-card-ng/user-card-ng.js +59 -0
  370. package/package.json +62 -64
  371. package/webpack.config.js +10 -8
  372. package/components/button-set-ng/button-set-ng.html +0 -1
  373. package/components/footer-ng/footer-ng.html +0 -13
  374. package/components/form-ng/form-ng__error-bubble.html +0 -3
  375. package/components/table-legacy-ng/table-legacy-ng.html +0 -4
  376. package/components/table-legacy-ng/table-legacy-ng__column.html +0 -12
  377. package/components/table-legacy-ng/table-legacy-ng__header.html +0 -4
  378. package/components/table-legacy-ng/table-legacy-ng__pager.html +0 -7
  379. package/components/table-legacy-ng/table-legacy-ng__row.html +0 -12
  380. package/components/table-legacy-ng/table-legacy-ng__title.html +0 -9
  381. package/dist/_helpers/caption.js +0 -25
  382. package/dist/_helpers/icon__svg.js +0 -82
package/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ ## [4.1.0]
2
+
3
+ ### Pre-built version
4
+
5
+ Ring UI now comes with pre-built version in `@jetbrains/ring-ui/dist` directory.
6
+ This addresses the following issues:
7
+
8
+ * does not require using specific bundler (WebPack) anymore
9
+ * does not require dealing with Ring UI building configuration
10
+ * decreases your project build time
11
+
12
+ See "README.md" for quick start with pre-built version
13
+
1
14
  ## [4.0.0]
2
15
 
3
16
  ### BREAKING CHANGES
package/README.md CHANGED
@@ -7,27 +7,28 @@ This collection of UI components aims to provide all the necessary building bloc
7
7
 
8
8
  ## Installation
9
9
 
10
- There are three ways of installing and using RingUI. Choose **one** that suits your needs best:
10
+ `npm install @jetbrains/ring-ui`
11
11
 
12
12
  ### Quick start (importing components as ES modules)
13
13
 
14
14
  The easiest way is to import necessary components as ES modules:
15
- ```javascript
16
- import Icon from "@jetbrains/ring-ui/dist/icon"
17
- import Logo from "@jetbrains/ring-ui/dist/logo"
18
- import Input from "@jetbrains/ring-ui/dist/input"
19
- import Select from "@jetbrains/ring-ui/dist/select"
20
- import Toggle from "@jetbrains/ring-ui/dist/toggle"
21
- import { Tabs, Tab } from "@jetbrains/ring-ui/dist/tabs"
15
+ ```js
16
+ // You need to import RingUI styles once
17
+ import '@jetbrains/ring-ui/dist/style.css';
22
18
 
23
- import "@jetbrains/ring-ui/dist/style.css"
19
+ import alertService from '@jetbrains/ring-ui/dist/alert-service/alert-service';
20
+ import Button from '@jetbrains/ring-ui/dist/button/button';
24
21
 
25
22
  ...
26
23
 
27
- <Select
28
- className="select-field"
29
- size="FULL"
30
- />
24
+ export const Demo = () => {
25
+ return (
26
+ <Button onClick={() => alertService.successMessage('Hello world')}>
27
+ Click me
28
+ </Button>
29
+ );
30
+ };
31
+
31
32
  ```
32
33
 
33
34
  The bundle size will depend on the amount of components you imported.
@@ -1,7 +1,7 @@
1
1
  @import "../global/variables.css";
2
2
 
3
3
  @value unit from "../global/global.css";
4
- @value alert from './alert.css';
4
+ @value alert from "./alert.css";
5
5
 
6
6
  .alertContainer {
7
7
  position: fixed;
@@ -203,7 +203,8 @@ describe('Auth', () => {
203
203
  redirectUri: 'http://localhost:8080/hub',
204
204
  clientId: '1-1-1-1-1',
205
205
  scope: ['0-0-0-0-0', 'youtrack'],
206
- optionalScopes: ['youtrack']
206
+ optionalScopes: ['youtrack'],
207
+ waitForRedirectTimeout: 0
207
208
  });
208
209
  try {
209
210
  await auth.init();
@@ -226,7 +227,8 @@ describe('Auth', () => {
226
227
  auth = new Auth({
227
228
  serverUri: '',
228
229
  redirect: true,
229
- cleanHash: true
230
+ cleanHash: true,
231
+ waitForRedirectTimeout: 0
230
232
  });
231
233
 
232
234
  try {
@@ -245,7 +247,8 @@ describe('Auth', () => {
245
247
  auth = new Auth({
246
248
  serverUri: '',
247
249
  redirect: true,
248
- cleanHash: true
250
+ cleanHash: true,
251
+ waitForRedirectTimeout: 0
249
252
  });
250
253
 
251
254
  try {
@@ -265,7 +268,8 @@ describe('Auth', () => {
265
268
  auth = new Auth({
266
269
  serverUri: '',
267
270
  redirect: true,
268
- cleanHash: false
271
+ cleanHash: false,
272
+ waitForRedirectTimeout: 0
269
273
  });
270
274
 
271
275
  try {
@@ -284,7 +288,8 @@ describe('Auth', () => {
284
288
  serverUri: '',
285
289
  redirect: true,
286
290
  redirectUri: 'http://localhost:8080/hub',
287
- requestCredentials: 'skip'
291
+ requestCredentials: 'skip',
292
+ waitForRedirectTimeout: 0
288
293
  });
289
294
  try {
290
295
  await auth.init();
@@ -313,7 +318,8 @@ describe('Auth', () => {
313
318
  redirectUri: 'http://localhost:8080/hub',
314
319
  clientId: '1-1-1-1-1',
315
320
  scope: ['0-0-0-0-0', 'youtrack'],
316
- optionalScopes: ['youtrack']
321
+ optionalScopes: ['youtrack'],
322
+ waitForRedirectTimeout: 0
317
323
  });
318
324
 
319
325
  auth._storage._tokenStorage = auth._storage._stateStorage =
@@ -330,7 +336,8 @@ describe('Auth', () => {
330
336
  auth._storage.saveToken({
331
337
  accessToken: 'token',
332
338
  expires: TokenValidator._epoch() + HOUR,
333
- scopes: ['0-0-0-0-0']
339
+ scopes: ['0-0-0-0-0'],
340
+ waitForRedirectTimeout: 0
334
341
  });
335
342
  });
336
343
 
@@ -14,6 +14,7 @@ export const DEFAULT_EXPIRES_TIMEOUT = 40 * 60;
14
14
  export const DEFAULT_BACKGROUND_TIMEOUT = 10 * 1000;
15
15
  const DEFAULT_BACKEND_CHECK_TIMEOUT = 10 * 1000;
16
16
  const BACKGROUND_REDIRECT_TIMEOUT = 20 * 1000;
17
+ const DEFAULT_WAIT_FOR_REDIRECT_TIMEOUT = 5 * 1000;
17
18
  /* eslint-enable no-magic-numbers */
18
19
 
19
20
  export const USER_CHANGED_EVENT = 'userChange';
@@ -46,6 +47,7 @@ const DEFAULT_CONFIG = {
46
47
  onBackendDown: () => {},
47
48
 
48
49
  defaultExpiresIn: DEFAULT_EXPIRES_TIMEOUT,
50
+ waitForRedirectTimeout: DEFAULT_WAIT_FOR_REDIRECT_TIMEOUT,
49
51
  translations: {
50
52
  login: 'Log in',
51
53
  loginTo: 'Log in to %serviceName%',
@@ -311,6 +313,11 @@ export default class Auth {
311
313
  const authRequest = await this._requestBuilder.prepareAuthRequest();
312
314
  this._redirectCurrentPage(authRequest.url);
313
315
 
316
+ // HUB-10867 Since we already redirecting the page, there is no actual need to throw an error
317
+ // and scare user with flashing error
318
+ // But let's keep it just in case redirect was not successful
319
+ await new Promise(resolve => setTimeout(resolve, this.config.waitForRedirectTimeout));
320
+
314
321
  throw error;
315
322
  }
316
323
 
@@ -615,8 +622,8 @@ export default class Auth {
615
622
  try {
616
623
  // We've got some error from this list
617
624
  // https://www.jetbrains.com/help/youtrack/devportal/OAuth-2.0-Errors.html
618
- if (typeof error.code === 'string') {
619
- const readableCode = error.code.split('_').join(' ');
625
+ if (error.code && typeof error.code.code === 'string') {
626
+ const readableCode = error.code.code.split('_').join(' ');
620
627
  return `Authorization error: ${readableCode}`;
621
628
  }
622
629
  } catch {
@@ -736,11 +743,10 @@ export default class Auth {
736
743
  }
737
744
 
738
745
  async switchUser() {
739
- if (this.config.embeddedLogin) {
740
- await this._runEmbeddedLogin();
746
+ if (!this.config.embeddedLogin) {
747
+ throw new Error('Auth: switchUser only supported for "embeddedLogin" mode');
741
748
  }
742
-
743
- throw new Error('Auth: switchUser only supported for "embeddedLogin" mode');
749
+ await this._runEmbeddedLogin();
744
750
  }
745
751
 
746
752
  /**
@@ -1,10 +1,13 @@
1
1
  @import "../global/variables.css";
2
2
 
3
3
  .avatar {
4
+ display: inline-block;
4
5
  object-fit: cover;
5
6
  object-position: center;
6
7
 
7
- border-radius: var(--ring-border-radius); /* This is a "graceful degradation" fallback, while the real value is controlled by JS */
8
+ /* This is a "graceful degradation" fallback, while the real value is controlled by JS */
9
+
10
+ border-radius: var(--ring-border-radius);
8
11
  }
9
12
 
10
13
  .subavatar {
@@ -21,7 +21,8 @@ export const avatar = () => {
21
21
  {Object.keys(Size).map(size => (
22
22
  <div className="avatar-demo" key={size}>
23
23
  <Avatar size={Size[size]} url={avatarDataUri}/>
24
- <Avatar size={Size[size]} url={avatarDataUri} round/>
24
+ <Avatar size={Size[size]} username="Jet Brains"/>
25
+ <Avatar size={Size[size]} username="Jet Brains" round/>
25
26
  <Avatar size={Size[size]}/>
26
27
  </div>
27
28
  ))}
@@ -38,7 +39,7 @@ avatar.parameters = {
38
39
  .avatar-demo {
39
40
  display: flex;
40
41
  justify-content: space-between;
41
- width: 200px;
42
+ width: 240px;
42
43
  margin-bottom: 16px;
43
44
  }
44
45
  </style>`
@@ -6,6 +6,7 @@ import {encodeURL, isDataURI, parseQueryString} from '../global/url';
6
6
  import {getPixelRatio} from '../global/dom';
7
7
 
8
8
  import styles from './avatar.css';
9
+ import FallbackAvatar from './fallback-avatar';
9
10
 
10
11
  /**
11
12
  * @name Avatar
@@ -15,6 +16,7 @@ export const Size = {
15
16
  Size18: 18,
16
17
  Size20: 20,
17
18
  Size24: 24,
19
+ Size28: 28,
18
20
  Size32: 32,
19
21
  Size40: 40,
20
22
  Size48: 48,
@@ -30,7 +32,9 @@ export default class Avatar extends PureComponent {
30
32
  url: PropTypes.string,
31
33
  round: PropTypes.bool,
32
34
  subavatar: PropTypes.string,
33
- subavatarSize: PropTypes.number
35
+ subavatarSize: PropTypes.number,
36
+ username: PropTypes.string,
37
+ skipParams: PropTypes.bool
34
38
  };
35
39
 
36
40
  static defaultProps = {
@@ -53,7 +57,18 @@ export default class Avatar extends PureComponent {
53
57
  };
54
58
 
55
59
  render() {
56
- const {size, url, dpr, style, round, subavatar, subavatarSize, ...restProps} = this.props;
60
+ const {
61
+ size,
62
+ url,
63
+ dpr,
64
+ style,
65
+ round,
66
+ subavatar,
67
+ subavatarSize,
68
+ username,
69
+ skipParams,
70
+ ...restProps
71
+ } = this.props;
57
72
  const sizeString = `${size}px`;
58
73
  const subavatarSizeString = `${subavatarSize}px`;
59
74
  const borderRadius = size <= Size.Size18 ? 'var(--ring-border-radius-small)' : 'var(--ring-border-radius)';
@@ -76,14 +91,24 @@ export default class Avatar extends PureComponent {
76
91
  <span
77
92
  {...restProps}
78
93
  data-test="avatar"
79
- className={classNames(styles.avatar, styles.empty, this.props.className)}
94
+ className={
95
+ classNames(styles.avatar, this.props.className, {[styles.empty]: username == null})
96
+ }
80
97
  style={styleObj}
81
- />
98
+ >{
99
+ username != null && (
100
+ <FallbackAvatar
101
+ size={size}
102
+ round={round}
103
+ username={username}
104
+ />
105
+ )
106
+ }</span>
82
107
  );
83
108
  }
84
109
 
85
110
  let src = url;
86
- if (!isDataURI(url)) {
111
+ if (!skipParams && !isDataURI(url)) {
87
112
  const [urlStart, query] = url.split('?');
88
113
  const queryParams = {
89
114
  ...parseQueryString(query),
@@ -102,7 +127,7 @@ export default class Avatar extends PureComponent {
102
127
  subavatarSizeString
103
128
  };
104
129
 
105
- subavatarSrc = encodeURL(urlStart, queryParams);
130
+ subavatarSrc = skipParams ? subavatar : encodeURL(urlStart, queryParams);
106
131
  return (
107
132
  <div>
108
133
  <img
@@ -0,0 +1,136 @@
1
+ import React, {useMemo} from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ import getUID from '../global/get-uid';
5
+
6
+ const colorPairs = [
7
+ ['#60A800', '#D5CA00'],
8
+ ['#21D370', '#03E9E1'],
9
+ ['#3BA1FF', '#36E97D'],
10
+ ['#00C243', '#00FFFF'],
11
+ ['#4BE098', '#627FFF'],
12
+ ['#168BFA', '#26F7C7'],
13
+ ['#9D4CFF', '#39D3C3'],
14
+ ['#0A81F6', '#0ACFF6'],
15
+ ['#765AF8', '#5A91F8'],
16
+ ['#9E54FF', '#0ACFF6'],
17
+ ['#B345F1', '#669DFF'],
18
+ ['#765AF8', '#C059EE'],
19
+ ['#9039D0', '#C239D0'],
20
+ ['#9F2AFF', '#FD56FD'],
21
+ ['#AB3AF2', '#E40568'],
22
+ ['#9F2AFF', '#E9A80B'],
23
+ ['#D50F6B', '#E73AE8'],
24
+ ['#ED5502', '#E73AE8'],
25
+ ['#ED358C', '#DBED18'],
26
+ ['#ED358C', '#F9902E'],
27
+ ['#FF7500', '#FFCA00']
28
+ ];
29
+
30
+ const Sizes = {
31
+ 18: {
32
+ radius: 2,
33
+ text: {x: 9, y: 13},
34
+ fontSize: '11px',
35
+ textAnchor: 'middle'
36
+ },
37
+ 24: {
38
+ radius: 3,
39
+ text: {x: 2, y: 13},
40
+ fontSize: '11px',
41
+ underscore: {x: 3, y: 17}
42
+ },
43
+ 32: {
44
+ radius: 3,
45
+ text: {x: 3, y: 17},
46
+ fontSize: '13px',
47
+ letterSpacing: 1,
48
+ underscore: {x: 4, y: 22}
49
+ },
50
+ 40: {
51
+ radius: 3,
52
+ text: {x: 5, y: 19},
53
+ fontSize: '15px',
54
+ letterSpacing: 1,
55
+ underscore: {x: 6, y: 28}
56
+ }
57
+ };
58
+
59
+ const sizeKeys = Object.keys(Sizes).map(Number);
60
+
61
+ function extractLetters(name) {
62
+ const names = name.split(/[\s._]+/).filter(Boolean);
63
+ if (names.length >= 2) {
64
+ return names[0][0].toUpperCase() + names[1][0].toUpperCase();
65
+ } else if (names.length === 1) {
66
+ if (names[0].length >= 2) {
67
+ return names[0].slice(0, 2).toUpperCase();
68
+ } else {
69
+ return `${names[0][0].toUpperCase()}X`;
70
+ }
71
+ } else {
72
+ return 'XX';
73
+ }
74
+ }
75
+
76
+ // https://gist.github.com/hyamamoto/fd435505d29ebfa3d9716fd2be8d42f0#gistcomment-2775538
77
+ const BASE = 32;
78
+ function hashCode(s) {
79
+ let h = 0;
80
+ for (let i = 0; i < s.length; i++) {
81
+ h = Math.imul(BASE - 1, h) + s.charCodeAt(i) | 0;
82
+ }
83
+
84
+ return h;
85
+ }
86
+
87
+ export default function FallbackAvatar({username, size, round}) {
88
+ const hash = Math.abs(hashCode(username.toLowerCase()));
89
+ const [fromColor, toColor] = colorPairs[hash % colorPairs.length];
90
+ const possibleSizeKeys = sizeKeys.filter(key => key >= size);
91
+ const sizeKey = possibleSizeKeys.length > 0
92
+ ? Math.min(...possibleSizeKeys)
93
+ : Math.max(...sizeKeys);
94
+ const sizes = Sizes[sizeKey];
95
+ const radius = round ? '50%' : sizes.radius;
96
+ const gradientId = useMemo(() => getUID('gradient-'), []);
97
+ return (
98
+ <svg viewBox={`0 0 ${sizeKey} ${sizeKey}`} xmlns="http://www.w3.org/2000/svg">
99
+ <defs>
100
+ <linearGradient id={gradientId} x1="0" y1="0" x2="0" y2="1">
101
+ <stop stopColor={fromColor} offset="0"/>
102
+ <stop stopColor={toColor} offset="1"/>
103
+ </linearGradient>
104
+ </defs>
105
+ <g>
106
+ <rect
107
+ fill={`url(#${gradientId})`}
108
+ x="0"
109
+ y="0"
110
+ width={sizeKey}
111
+ height={sizeKey}
112
+ rx={radius}
113
+ ry={radius}
114
+ />
115
+ <text
116
+ x={sizes.text.x}
117
+ y={sizes.text.y}
118
+ fontFamily="Arial, Helvetica, sans-serif"
119
+ fontSize={sizes.fontSize}
120
+ letterSpacing={sizes.letterSpacing}
121
+ fill="#FFFFFF"
122
+ textAnchor={sizes.textAnchor}
123
+ >
124
+ <tspan>{extractLetters(username)}</tspan>
125
+ {sizes.underscore && <tspan x={sizes.underscore.x} y={sizes.underscore.y}>{'_'}</tspan>}
126
+ </text>
127
+ </g>
128
+ </svg>
129
+ );
130
+ }
131
+
132
+ FallbackAvatar.propTypes = {
133
+ username: PropTypes.string.isRequired,
134
+ size: PropTypes.number.isRequired,
135
+ round: PropTypes.bool
136
+ };
@@ -19,7 +19,7 @@
19
19
  width: 0;
20
20
  height: calc(unit * 5);
21
21
 
22
- content: '';
22
+ content: "";
23
23
  vertical-align: middle;
24
24
  }
25
25
  }
@@ -49,7 +49,7 @@
49
49
  width: 100%;
50
50
  height: 100%;
51
51
 
52
- content: '';
52
+ content: "";
53
53
 
54
54
  background-color: rgba(0, 0, 0, 0.8);
55
55
  }
@@ -6,6 +6,7 @@ import messageBundleNg from '../message-bundle-ng/message-bundle-ng';
6
6
  import alertService from '../alert-service/alert-service';
7
7
  import IconNG from '../icon-ng/icon-ng';
8
8
 
9
+ import template from './avatar-editor-ng__template';
9
10
  import './avatar-editor-ng.css';
10
11
 
11
12
  const angularModule = angular.module('Ring.avatar-editor', [messageBundleNg, IconNG]);
@@ -26,7 +27,7 @@ function rgAvatarEditor() {
26
27
  deleteLabel: '@',
27
28
  addMessage: '@'
28
29
  },
29
- template: require('./avatar-editor-ng.html'),
30
+ template,
30
31
  transclude: true,
31
32
  controller: [
32
33
  '$scope', '$attrs', 'RingMessageBundle',
@@ -1,4 +1,4 @@
1
- <div>
1
+ export default `<div>
2
2
  <div ng-click="!ngDisabled && controls.select()" class="ring-avatar-editor__frame" ng-class="{
3
3
  'ring-avatar-editor_controlled': controlled,
4
4
  'ring-avatar-editor': !ngDisabled
@@ -25,4 +25,4 @@
25
25
  >
26
26
  <span translate>{{ getDeleteLabel() }}</span>
27
27
  </rg-button>
28
- </div>
28
+ </div>`;
@@ -451,7 +451,7 @@
451
451
  width: calc(100% + loaderWidth);
452
452
  height: 100%;
453
453
 
454
- content: '';
454
+ content: "";
455
455
  animation: progress 1s linear infinite;
456
456
 
457
457
  background-repeat: repeat;
@@ -460,7 +460,7 @@
460
460
  }
461
461
 
462
462
  .delayed .content::after {
463
- content: '';
463
+ content: "";
464
464
  }
465
465
 
466
466
  .short {
@@ -12,7 +12,7 @@ export default class ButtonGroup extends PureComponent {
12
12
  static propTypes = {
13
13
  children: PropTypes.node,
14
14
  className: PropTypes.string
15
- }
15
+ };
16
16
 
17
17
  render() {
18
18
  const {className} = this.props;
@@ -7,7 +7,7 @@ import styles from './button-group.css';
7
7
  export default class Caption extends PureComponent {
8
8
  static propTypes = {
9
9
  className: PropTypes.node
10
- }
10
+ };
11
11
 
12
12
  render() {
13
13
  const {className} = this.props;
@@ -166,7 +166,7 @@ class ButtonController extends RingAngularComponent {
166
166
  }
167
167
 
168
168
  $compile(icon)($scope);
169
- }
169
+ };
170
170
  }
171
171
 
172
172
  function changeTheme(element, data) {
@@ -3,6 +3,8 @@
3
3
  */
4
4
  import angular from 'angular';
5
5
 
6
+ import buttonSetStyles from '../button-set/button-set.css';
7
+
6
8
  const angularModule = angular.module('Ring.button-set', []);
7
9
 
8
10
  function rgButtonSet() {
@@ -11,7 +13,7 @@ function rgButtonSet() {
11
13
  replace: true,
12
14
  scope: false,
13
15
  transclude: true,
14
- template: require('./button-set-ng.html')
16
+ template: `<div class="${buttonSetStyles.buttonSet}" ng-transclude></div>`
15
17
  };
16
18
  }
17
19
 
@@ -89,7 +89,7 @@
89
89
  /* stylelint-disable-next-line selector-max-specificity */
90
90
  &:checked + .cell,
91
91
  &:indeterminate[checked] + .cell,
92
- &:indeterminate[data-checked=true] + .cell {
92
+ &:indeterminate[data-checked="true"] + .cell {
93
93
  border-color: var(--ring-border-hover-color);
94
94
  background-color: var(--ring-selected-background-color);
95
95
  }
@@ -14,7 +14,7 @@ function noop() {}
14
14
 
15
15
  const registerLanguage = memoize(async language => {
16
16
  const languageExports = await import(
17
- /* webpackChunkName: "highlight-[request]", webpackPrefetch: true */
17
+ /* webpackChunkName: "highlight-[request]" */
18
18
  `highlight.js/lib/languages/${language}`
19
19
  );
20
20
  highlight.registerLanguage(language, languageExports.default);
@@ -1,6 +1,6 @@
1
1
  @import "../global/variables.css";
2
2
 
3
- @value unit, extra-small-screen-media, small-screen-media from '../global/global.css';
3
+ @value unit, extra-small-screen-media, small-screen-media from "../global/global.css";
4
4
  @value sidebarWidth: calc(unit * 30);
5
5
 
6
6
  .contentLayout {
@@ -1,7 +1,7 @@
1
1
  @import "../global/variables.css";
2
2
 
3
3
  @value unit from "../global/global.css";
4
- @value height, compensate from '../table/table.css';
4
+ @value height, compensate from "../table/table.css";
5
5
 
6
6
  .dataListWrapper {
7
7
  position: relative;
@@ -25,7 +25,8 @@ export default class DateInput extends React.PureComponent {
25
25
  onInput: PropTypes.func,
26
26
  onActivate: PropTypes.func,
27
27
  onConfirm: PropTypes.func,
28
- onClear: PropTypes.func
28
+ onClear: PropTypes.func,
29
+ locale: PropTypes.object
29
30
  };
30
31
 
31
32
  static defaultProps = {
@@ -78,16 +79,16 @@ export default class DateInput extends React.PureComponent {
78
79
  time, name, hoverDate,
79
80
  date, displayFormat, translations,
80
81
  onActivate, onClear,
81
- fromPlaceholder, toPlaceholder, timePlaceholder
82
+ fromPlaceholder, toPlaceholder, timePlaceholder, locale
82
83
  } = this.props;
83
84
 
84
85
  let displayText = '';
85
86
  if (active && hoverDate) {
86
- displayText = displayFormat(hoverDate);
87
+ displayText = displayFormat(hoverDate, locale);
87
88
  } else if (active && text != null) {
88
89
  displayText = text;
89
90
  } else if (date) {
90
- displayText = displayFormat(date);
91
+ displayText = displayFormat(date, locale);
91
92
  } else if (name === 'time') {
92
93
  displayText = time || '';
93
94
  }