@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,2 @@
1
+ import 'scrollbar-width';
2
+ export { d as default, p as preventerFactory } from '../_helpers/dialog__body-scroll-preventer.js';
@@ -0,0 +1,601 @@
1
+ import { _ as _defineProperty } from '../_helpers/_rollupPluginBabelHelpers.js';
2
+ import angular from 'angular';
3
+ import { createFocusTrap } from 'focus-trap';
4
+ import { getStyles, getRect } from '../global/dom.js';
5
+ import RingAngularComponent from '../global/ring-angular-component.js';
6
+ import shortcutsInstance from '../shortcuts/core.js';
7
+ import ButtonNG from '../button-ng/button-ng.js';
8
+ import PromisedClick from '../promised-click-ng/promised-click-ng.js';
9
+ import rgCompilerModuleName from '../compiler-ng/compiler-ng.js';
10
+ import { m as modules_5e9b8c03, p as preventerFactory } from '../_helpers/dialog__body-scroll-preventer.js';
11
+ import { m as modules_e6a056e1 } from '../_helpers/island.js';
12
+ import dialogTemplate from './dialog-ng__template.js';
13
+ import 'combokeys';
14
+ import '../global/sniffer.js';
15
+ import 'sniffr';
16
+ import 'classnames';
17
+ import '../icon-ng/icon-ng.js';
18
+ import '../icon/icon__constants.js';
19
+ import '../template-ng/template-ng.js';
20
+ import '../_helpers/icon.js';
21
+ import '../global/theme.js';
22
+ import 'react';
23
+ import '../_helpers/button__classes.js';
24
+ import 'scrollbar-width';
25
+
26
+ var modules_b378ce5a = {"unit":"8px","dialogContainer":"dialogContainer_rui_1466","wide":"wide_rui_1466","autoWidth":"autoWidth_rui_1466","header":"header_rui_1466","inSidebar":"inSidebar_rui_1466","scrollableWrapper":"scrollableWrapper_rui_1466","content":"content_rui_1466","error":"error_rui_1466","footer":"footer_rui_1466","footerDescription":"footerDescription_rui_1466","footerItems":"footerItems_rui_1466","footerItem":"footerItem_rui_1466"};
27
+
28
+ rgDialogContentDirective.$inject = ["$compile", "$q"];
29
+ rgDialogDirective.$inject = ["$timeout"];
30
+ /**
31
+ * @name Dialog Ng
32
+ */
33
+
34
+ const angularModule = angular.module('Ring.dialog', [ButtonNG, PromisedClick, rgCompilerModuleName]);
35
+
36
+ class DialogController extends RingAngularComponent {
37
+ constructor() {
38
+ super(...arguments);
39
+
40
+ _defineProperty(this, "hide", () => {
41
+ if (!this.inSidebar) {
42
+ this.scrollPreventer.reset();
43
+ }
44
+
45
+ this.active = false;
46
+ this.content = '';
47
+ this.focusTrap.deactivate();
48
+ Reflect.deleteProperty(this, 'DIALOG_NAMESPACE');
49
+
50
+ if (shortcutsInstance.indexOfScope(this.dialogService.DIALOG_NAMESPACE) > -1) {
51
+ shortcutsInstance.setScope(this.currentShortcutsScope);
52
+ }
53
+
54
+ this._resetFormState();
55
+
56
+ this.$inject.$scope.$broadcast('dialog.hide');
57
+ });
58
+
59
+ _defineProperty(this, "serverErrorFields", []);
60
+
61
+ this.styles = modules_b378ce5a;
62
+ this.dialogStyles = modules_5e9b8c03;
63
+ this.islandStyles = modules_e6a056e1;
64
+ this.scrollPreventer = preventerFactory();
65
+ this.$inject.$q((resolve, reject) => {
66
+ this.resolve = resolve;
67
+ this.reject = reject;
68
+ });
69
+ }
70
+
71
+ $onInit() {
72
+ const {
73
+ dialog,
74
+ dialogInSidebar,
75
+ $scope
76
+ } = this.$inject;
77
+ const dialogService = this.inSidebar ? dialogInSidebar : dialog;
78
+ this.focusTrap = createFocusTrap(this.$inject.$element[0], {
79
+ fallbackFocus: '[data-anchor="focus-trap-fallback"]',
80
+ escapeDeactivates: false
81
+ });
82
+ this.dialogService = dialogService;
83
+ this.previousBodyWidth = null;
84
+ $scope.$on('$routeChangeSuccess', this.hide);
85
+ $scope.$on('$routeUpdate', this.hide);
86
+ $scope.$on('$destroy', dialogService.unregister);
87
+ $scope.$watch(() => this.active, () => {
88
+ if (this.active) {
89
+ shortcutsInstance.bindMap(this.getShortcuts(), {
90
+ scope: this.DIALOG_NAMESPACE
91
+ });
92
+ } else {
93
+ this.reset();
94
+ }
95
+ });
96
+ dialogService.register(this);
97
+ }
98
+
99
+ getShortcuts() {
100
+ const defaultEscHandler = function escHandler() {
101
+ this.active = false;
102
+ this.focusTrap.deactivate();
103
+ this.$inject.$scope.$apply();
104
+ }.bind(this);
105
+
106
+ const dialogShortcuts = {
107
+ esc: defaultEscHandler,
108
+ enter: this.applyDefaultHandler(false),
109
+ 'mod+enter': this.applyDefaultHandler(true)
110
+ };
111
+ angular.extend(dialogShortcuts, this.shortcuts);
112
+
113
+ if (this.shortcuts && this.shortcuts.esc) {
114
+ /**
115
+ * Merge ESC handler
116
+ * @type {Function} {dialogShortcuts.esc}
117
+ */
118
+ const customHandler = dialogShortcuts.esc;
119
+
120
+ dialogShortcuts.esc = () => {
121
+ const result = customHandler();
122
+ defaultEscHandler();
123
+ return result;
124
+ };
125
+ }
126
+
127
+ return dialogShortcuts;
128
+ }
129
+
130
+ handleClick(event) {
131
+ const isOverlayClicked = event.target === event.currentTarget;
132
+
133
+ if (this.inSidebar || !this.closeOnClick || !isOverlayClicked) {
134
+ return;
135
+ }
136
+
137
+ this.hide();
138
+ }
139
+
140
+ setTitle(title) {
141
+ this.title = title;
142
+ }
143
+
144
+ compileTemplate() {
145
+ if (this.config.data) {
146
+ const element = angular.element(this.template);
147
+ return {
148
+ element,
149
+ link: this.$inject.$compile(element)
150
+ };
151
+ }
152
+
153
+ return this.$inject.rgCompiler(this.config).catch(error => {
154
+ this.reject(error);
155
+ return this.$inject.$q.reject(error);
156
+ });
157
+ }
158
+
159
+ show(config) {
160
+ const {
161
+ $q,
162
+ $scope
163
+ } = this.$inject;
164
+
165
+ if (!this.inSidebar) {
166
+ this.scrollPreventer.prevent();
167
+
168
+ if (config && config.trapFocus === true) {
169
+ this.focusTrap.activate();
170
+ }
171
+ }
172
+
173
+ if (this.active) {
174
+ this.reset();
175
+ } // Clear dialog errors
176
+
177
+
178
+ this.error = null;
179
+
180
+ if (this.dialogForm) {
181
+ this.dialogForm.$setPristine();
182
+ }
183
+
184
+ if (config) {
185
+ this.title = config.title;
186
+ this.buttons = config.buttons;
187
+ this.data = config.data || {};
188
+ this.wideDialog = config.wideDialog;
189
+ this.autoWidth = config.autoWidth;
190
+ this.scrollableWrapperClassName = config.scrollableWrapperClassName;
191
+ this.cssClass = config.cssClass || '';
192
+ this.shortcuts = config.shortcuts;
193
+ this.content = config.content;
194
+ this.template = config.template;
195
+ this.config = config;
196
+ this.description = config.description && config.description.split('\n') || [];
197
+ this.closeOnClick = config.closeOnClick; // Backward compatibility with existing templates which use data directly from scope
198
+
199
+ $scope.data = this.data;
200
+ }
201
+
202
+ this.currentShortcutsScope = shortcutsInstance.getScope();
203
+ this.DIALOG_NAMESPACE = this.dialogService.DIALOG_NAMESPACE;
204
+ shortcutsInstance.setScope(this.dialogService.DIALOG_NAMESPACE);
205
+ this.active = true;
206
+ $scope.$broadcast('dialog.show');
207
+ return $q((resolve, reject) => {
208
+ this.resolve = resolve;
209
+ this.reject = reject;
210
+ });
211
+ }
212
+
213
+ update() {
214
+ let config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
215
+ Object.assign(this.data, config.data);
216
+ Object.assign(this.buttons, config.buttons);
217
+ }
218
+
219
+ _resetFormState() {
220
+ const dialogForm = this.dialogForm;
221
+
222
+ if (!dialogForm) {
223
+ return;
224
+ }
225
+
226
+ dialogForm.$setPristine();
227
+ dialogForm.$setUntouched();
228
+ dialogForm.$valid = true;
229
+ dialogForm.$invalid = false;
230
+ dialogForm.$error = {};
231
+ }
232
+
233
+ done(result) {
234
+ this.resetPosition();
235
+ this.resolve(result);
236
+ this.hide();
237
+ }
238
+
239
+ reset(result) {
240
+ this.done(result);
241
+ }
242
+
243
+ getErrorMessage(errorResponse) {
244
+ var _errorResponse$data, _errorResponse$data2;
245
+
246
+ if (errorResponse !== null && errorResponse !== void 0 && (_errorResponse$data = errorResponse.data) !== null && _errorResponse$data !== void 0 && _errorResponse$data.error_description) {
247
+ return errorResponse.data.error_description;
248
+ }
249
+
250
+ if (errorResponse !== null && errorResponse !== void 0 && (_errorResponse$data2 = errorResponse.data) !== null && _errorResponse$data2 !== void 0 && _errorResponse$data2.error) {
251
+ return errorResponse.data.error;
252
+ }
253
+
254
+ return errorResponse;
255
+ }
256
+
257
+ getFieldErrorMessage(errorResponse) {
258
+ if (errorResponse && errorResponse.data && errorResponse.data.error) {
259
+ return errorResponse.data.error;
260
+ }
261
+
262
+ return null;
263
+ }
264
+
265
+ action(button) {
266
+ if (button.inProgress) {
267
+ return undefined;
268
+ }
269
+
270
+ const errorReporter = errorResponse => {
271
+ const errorField = errorResponse && errorResponse.data && errorResponse.data.error_field;
272
+
273
+ if (errorField && this.dialogForm[errorField]) {
274
+ this.dialogForm[errorField].$invalid = true;
275
+ this.dialogForm[errorField].$error[errorField] = [{
276
+ message: this.getFieldErrorMessage(errorResponse)
277
+ }];
278
+ this.serverErrorFields.push(errorField);
279
+ } else {
280
+ this.error = this.$inject.$sce.trustAsHtml(this.getErrorMessage(errorResponse));
281
+ }
282
+ };
283
+
284
+ if (button.action) {
285
+ if (!button.keepServerErrors) {
286
+ this.serverErrorFields.forEach(errorField => {
287
+ this.dialogForm[errorField].$invalid = false;
288
+ this.dialogForm[errorField].$error = {};
289
+ });
290
+ this.serverErrorFields = [];
291
+ }
292
+
293
+ const actionResult = button.action(this.data, button, errorReporter, this.dialogForm, this.buttons);
294
+ button.inProgress = true;
295
+ return this.$inject.$q.resolve(actionResult).then(res => {
296
+ const dontClose = res === false;
297
+
298
+ if (!dontClose && button.close !== false) {
299
+ this.done(res);
300
+ }
301
+ }).catch(errorReporter).finally(() => {
302
+ button.inProgress = false;
303
+ });
304
+ } else if (button.close !== false) {
305
+ this.reset(false);
306
+ }
307
+
308
+ return undefined;
309
+ }
310
+
311
+ applyDefaultHandler(isTextAreaShortcut) {
312
+ return event => {
313
+ if (event.target.matches('textarea') !== isTextAreaShortcut || event.target.matches('button')) {
314
+ return;
315
+ }
316
+
317
+ event.stopPropagation();
318
+ event.preventDefault();
319
+
320
+ if (this.dialogForm.$valid && this.buttons) {
321
+ for (const button of this.buttons) {
322
+ if (button.default && !button.hidden && !button.disabled) {
323
+ this.action(button);
324
+ this.$inject.$scope.$apply();
325
+ return;
326
+ }
327
+ }
328
+ }
329
+ };
330
+ }
331
+
332
+ }
333
+
334
+ DialogController.$inject = [];
335
+
336
+ _defineProperty(DialogController, "$inject", ['$scope', '$q', 'dialog', '$element', 'dialogInSidebar', '$compile', '$injector', '$controller', 'rgCompiler', '$sce']);
337
+
338
+ class DialogService extends RingAngularComponent {
339
+ constructor() {
340
+ super(...arguments); // Binding proxy methods to a service instance
341
+
342
+ _defineProperty(this, "DIALOG_NAMESPACE", 'ring-dialog');
343
+
344
+ _defineProperty(this, "fallbackDialog", null);
345
+
346
+ _defineProperty(this, "unregister", () => {
347
+ Reflect.deleteProperty(this, 'ctrl');
348
+ });
349
+
350
+ ['show', 'hide', 'update', 'done', 'reset'].forEach(key => {
351
+ this[key] = function methodWrapper() {
352
+ if (this.ctrl) {
353
+ return this.ctrl[key](...arguments);
354
+ } else if (this.fallbackDialog) {
355
+ return this.fallbackDialog[key](...arguments);
356
+ } else {
357
+ this.$inject.$log.error('No dialog directive is found');
358
+ return undefined;
359
+ }
360
+ }.bind(this);
361
+ });
362
+ }
363
+
364
+ register(ctrl) {
365
+ this.ctrl = ctrl;
366
+ }
367
+
368
+ }
369
+
370
+ DialogService.$inject = [];
371
+
372
+ _defineProperty(DialogService, "$inject", ['$log']);
373
+
374
+ class DialogInSidebarService extends DialogService {
375
+ constructor() {
376
+ super(...arguments);
377
+
378
+ _defineProperty(this, "DIALOG_NAMESPACE", 'ring-dialog-in-sidebar');
379
+
380
+ this.fallbackDialog = this.$inject.dialog;
381
+ }
382
+
383
+ }
384
+
385
+ DialogInSidebarService.$inject = [];
386
+
387
+ _defineProperty(DialogInSidebarService, "$inject", [...DialogService.$inject, 'dialog']);
388
+
389
+ function rgDialogDirective($timeout) {
390
+ function link(scope, iElement, iAttrs, dialogCtrl) {
391
+ const node = iElement[0];
392
+ const dialogContainer = node.querySelector('*[data-anchor=dialog-container]');
393
+ const dialogHeader = node.querySelector('*[data-anchor=dialog-header]');
394
+ const dialogCustomFooter = node.querySelector('*[data-anchor=dialog-custom-footer-container]'); // Left for backward compatibility with existing templates that use data directly from scope
395
+
396
+ scope.dialogForm = dialogCtrl.dialogForm;
397
+
398
+ function setPosition(top, left) {
399
+ Object.assign(dialogContainer.style, {
400
+ top: `${top}px`,
401
+ left: `${left}px`
402
+ });
403
+ } // Focus first input
404
+
405
+
406
+ function focusFirst() {
407
+ const controls = Array.from(node.querySelectorAll('input,select,button,textarea,*[contentEditable=true]')).filter(inputNode => getStyles(inputNode).display !== 'none');
408
+
409
+ if (controls.length) {
410
+ controls[0].focus();
411
+ }
412
+ }
413
+
414
+ function onMousemove(e) {
415
+ e.preventDefault();
416
+ const pageHeight = window.innerHeight;
417
+ const pageWidth = window.innerWidth;
418
+ const clearance = 10;
419
+ const maxTop = pageHeight - clearance;
420
+ const maxLeft = pageWidth - clearance;
421
+ const newTop = getRect(dialogHeader).top + e.movementY;
422
+ const newLeft = getRect(dialogHeader).left + e.movementX;
423
+
424
+ if (newTop > maxTop || newTop < clearance) {
425
+ return;
426
+ }
427
+
428
+ if (newLeft > maxLeft || newLeft < clearance) {
429
+ return;
430
+ }
431
+
432
+ const offsetY = parseFloat(dialogContainer.style.top) || 0;
433
+ const offsetX = parseFloat(dialogContainer.style.left) || 0;
434
+ setPosition(offsetY + e.movementY, offsetX + e.movementX);
435
+ }
436
+
437
+ function onMouseup() {
438
+ document.removeEventListener('mousemove', onMousemove);
439
+ document.removeEventListener('mouseup', onMouseup);
440
+ }
441
+
442
+ function onMousedown() {
443
+ if (!dialogCtrl.inSidebar) {
444
+ // Duct tape for all Ring 1.0 dropdown components inside
445
+ node.dispatchEvent(new CustomEvent('ring.popup-close'));
446
+ document.addEventListener('mousemove', onMousemove);
447
+ document.addEventListener('mouseup', onMouseup);
448
+ }
449
+ }
450
+
451
+ function onFocusin(e) {
452
+ if (!node.contains(e.target) && e.target.classList.contains('ring-popup')) {
453
+ e.preventDefault();
454
+ focusFirst();
455
+ }
456
+ }
457
+
458
+ function setCustomFooter(customFooterElem) {
459
+ const placeholder = angular.element(dialogCustomFooter);
460
+ const footer = angular.element(`<div class="${this.styles.footer}"></div>`).append(customFooterElem);
461
+ placeholder.empty();
462
+ placeholder.append(footer);
463
+ }
464
+
465
+ dialogCtrl.resetPosition = () => dialogContainer.removeAttribute('style');
466
+
467
+ dialogCtrl.setCustomFooter = setCustomFooter;
468
+ dialogHeader.addEventListener('mousedown', onMousedown);
469
+ document.addEventListener('focusin', onFocusin);
470
+ scope.$on('rgDialogContentLoaded', () => $timeout(focusFirst)); // Backward compatibility for youtrack (if they are using "content" property)
471
+ // which is actually ng-include with $includeContentLoaded event in the end
472
+
473
+ scope.$on('$includeContentLoaded', () => $timeout(focusFirst));
474
+ scope.$on('dialog.hide', () => {
475
+ angular.element(dialogCustomFooter).empty();
476
+ });
477
+ scope.$on('$destroy', () => {
478
+ dialogHeader.removeEventListener('mousedown', onMousedown);
479
+ document.removeEventListener('mousemove', onMousemove);
480
+ document.removeEventListener('mouseup', onMouseup);
481
+ document.removeEventListener('focusin', onFocusin);
482
+ window.removeEventListener('resize', setPosition);
483
+ });
484
+ }
485
+
486
+ return {
487
+ scope: {},
488
+ controller: DialogController,
489
+ bindToController: {
490
+ inSidebar: '@?',
491
+ active: '=?'
492
+ },
493
+ replace: true,
494
+ template: dialogTemplate,
495
+ controllerAs: 'dialog',
496
+ link
497
+ };
498
+ }
499
+
500
+ function rgDialogTitleDirective() {
501
+ function link(scope, iElement, iAttrs, dialogCtrl) {
502
+ dialogCtrl.setTitle(scope.title);
503
+ }
504
+
505
+ return {
506
+ scope: {
507
+ title: '@rgDialogTitle'
508
+ },
509
+ require: '^rgDialog',
510
+ link
511
+ };
512
+ }
513
+
514
+ function rgDialogFooterDirective() {
515
+ function link(scope, iElement, iAttrs, dialogCtrl, transclude) {
516
+ scope.$on('rgDialogContentLoaded', () => {
517
+ transclude(scope, clone => {
518
+ dialogCtrl.setCustomFooter(clone);
519
+ });
520
+ });
521
+ }
522
+
523
+ return {
524
+ require: '^rgDialog',
525
+ transclude: true,
526
+ link
527
+ };
528
+ }
529
+
530
+ function rgDialogContentDirective($compile, $q) {
531
+ return {
532
+ link: function link(scope, iElement) {
533
+ const element = iElement[0];
534
+ let contentScope;
535
+
536
+ function createIncludeNode() {
537
+ const node = document.createElement('ng-include');
538
+ node.setAttribute('src', 'dialog.content');
539
+ return node;
540
+ }
541
+
542
+ function isOldDataAPI() {
543
+ return scope.dialog.config.data;
544
+ }
545
+
546
+ function compileContent() {
547
+ contentScope = scope.$new();
548
+
549
+ if (angular.isDefined(scope.dialog.content)) {
550
+ const templateNode = angular.element(createIncludeNode());
551
+ element.appendChild(templateNode[0]);
552
+ return $compile(templateNode)(contentScope)[0];
553
+ }
554
+
555
+ return $q.when(scope.dialog.compileTemplate()).then(compiledData => {
556
+ const templateScope = isOldDataAPI() ? contentScope : scope.dialog.config.scope || contentScope; // XXX(maksimrv): We should put element to directive
557
+ // before link because some directives (shortcuts)
558
+ // depends from global directives (shortcuts-app)
559
+
560
+ angular.element(element).append(compiledData.element);
561
+ compiledData.link(templateScope);
562
+ scope.$broadcast('rgDialogContentLoaded');
563
+ }).catch(angular.noop);
564
+ }
565
+
566
+ function destroy() {
567
+ function cleanupElement(_element) {
568
+ while (_element.childNodes.length) {
569
+ // XXX(maksimrv): We should use jQuery.remove method because
570
+ // AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires $destroy event
571
+ // on all DOM nodes being removed.
572
+ // This can be used to clean up bindings to the DOM
573
+ // element before it is removed.
574
+ angular.element(_element.childNodes[0]).remove();
575
+ }
576
+ }
577
+
578
+ if (contentScope) {
579
+ contentScope.$destroy();
580
+ cleanupElement(element);
581
+ }
582
+ }
583
+
584
+ scope.$on('dialog.hide', destroy);
585
+ scope.$on('dialog.show', () => {
586
+ destroy();
587
+ compileContent();
588
+ });
589
+ }
590
+ };
591
+ }
592
+
593
+ angularModule.directive('rgDialog', rgDialogDirective);
594
+ angularModule.directive('rgDialogTitle', rgDialogTitleDirective);
595
+ angularModule.directive('rgDialogFooter', rgDialogFooterDirective);
596
+ angularModule.directive('rgDialogContent', rgDialogContentDirective);
597
+ angularModule.service('dialog', DialogService);
598
+ angularModule.service('dialogInSidebar', DialogInSidebarService);
599
+ var DialogNg = angularModule.name;
600
+
601
+ export { DialogNg as default };
@@ -0,0 +1,71 @@
1
+ var dialogTemplate = `<div
2
+ ng-show="dialog.active"
3
+ ng-class="[!dialog.inSidebar && dialog.dialogStyles.container]"
4
+ ng-click="dialog.handleClick($event)"
5
+ ng-attr-data-portaltarget="{{!dialog.inSidebar ? 'dialog-ng-popup-container' : null}}"
6
+ >
7
+ <div ng-class="[dialog.dialogStyles.innerContainer]">
8
+ <div data-anchor="dialog-container"
9
+ ng-attr-data-in-sidebar="{{dialog.inSidebar ? 'true' : 'false'}}"
10
+ ng-attr-data-test="{{dialog.active ? 'ring-dialog' : null}}"
11
+ ng-class="[
12
+ dialog.styles.dialogContainer,
13
+ dialog.cssClass,
14
+ dialog.wideDialog && dialog.styles.wide,
15
+ dialog.autoWidth && dialog.styles.autoWidth,
16
+ dialog.inSidebar && dialog.styles.inSidebar,
17
+ !dialog.inSidebar && dialog.dialogStyles.content,
18
+ !dialog.inSidebar && dialog.islandStyles.island
19
+ ]"
20
+ >
21
+ <div ng-class="[dialog.islandStyles.header, dialog.styles.header]"
22
+ data-anchor="dialog-header"
23
+ ng-show="dialog.title">
24
+ <span ng-class="dialog.islandStyles.title">{{ dialog.title }}</span>
25
+ </div>
26
+
27
+ <div ng-class="[dialog.styles.scrollableWrapper, dialog.islandStyles.scrollableWrapper, dialog.scrollableWrapperClassName]">
28
+ <div ng-class="[dialog.styles.content, dialog.islandStyles.content]">
29
+ <form name="dialog.dialogForm" class="ring-form ring-js-shortcuts"
30
+ novalidate>
31
+ <rg-dialog-content></rg-dialog-content>
32
+
33
+ <div class="ring-form__group" ng-show="dialog.error">
34
+ <div ng-class="dialog.styles.error" ng-bind-html="dialog.error"></div>
35
+ </div>
36
+ </form>
37
+ </div>
38
+ </div>
39
+
40
+ <div ng-class="dialog.styles.footer"
41
+ ng-if="dialog.description.length || dialog.buttons.length">
42
+ <div ng-class="dialog.styles.footerDescription"
43
+ ng-if="dialog.description && dialog.description.length">
44
+ <div ng-repeat="line in dialog.description">{{ line }}</div>
45
+ </div>
46
+
47
+ <div ng-class="dialog.styles.footerItems">
48
+ <rg-button
49
+ ng-repeat="button in dialog.buttons"
50
+ ng-class="[dialog.styles.footerItem , button.cssClasses]"
51
+ mode="{{button.default ? 'primary' : ''}}"
52
+ text="button.text"
53
+ ng-disabled="(button.default && dialog.dialogForm.$invalid) || button.disabled"
54
+ ng-if="!button.hidden"
55
+ data-test="dialog-footer-button"
56
+
57
+ rg-promised-click="dialog.action(button)"
58
+ promised-mode="loader"
59
+ >{{ button.label }}
60
+ </rg-button>
61
+ </div>
62
+ </div>
63
+
64
+ <div data-anchor="dialog-custom-footer-container"></div>
65
+
66
+ <div tabindex="-1" ng-show="false" data-anchor="focus-trap-fallback"></div>
67
+ </div>
68
+ </div>
69
+ </div>`;
70
+
71
+ export { dialogTemplate as default };