fomantic-ui 2.9.1-beta.16 → 2.9.1-beta.18

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 (252) hide show
  1. package/.eslintrc.js +109 -0
  2. package/.github/workflows/ci.yml +13 -3
  3. package/dist/components/accordion.css +1 -1
  4. package/dist/components/accordion.js +571 -598
  5. package/dist/components/accordion.min.css +1 -1
  6. package/dist/components/accordion.min.js +1 -1
  7. package/dist/components/ad.css +1 -1
  8. package/dist/components/ad.min.css +1 -1
  9. package/dist/components/api.js +1164 -1186
  10. package/dist/components/api.min.js +1 -1
  11. package/dist/components/breadcrumb.css +1 -1
  12. package/dist/components/breadcrumb.min.css +1 -1
  13. package/dist/components/button.css +1 -1
  14. package/dist/components/button.min.css +1 -1
  15. package/dist/components/calendar.css +1 -1
  16. package/dist/components/calendar.js +1897 -1818
  17. package/dist/components/calendar.min.css +1 -1
  18. package/dist/components/calendar.min.js +1 -1
  19. package/dist/components/card.css +1 -1
  20. package/dist/components/card.min.css +1 -1
  21. package/dist/components/checkbox.css +1 -1
  22. package/dist/components/checkbox.js +844 -841
  23. package/dist/components/checkbox.min.css +1 -1
  24. package/dist/components/checkbox.min.js +1 -1
  25. package/dist/components/comment.css +1 -1
  26. package/dist/components/comment.min.css +1 -1
  27. package/dist/components/container.css +3 -1
  28. package/dist/components/container.min.css +2 -2
  29. package/dist/components/dimmer.css +1 -1
  30. package/dist/components/dimmer.js +710 -737
  31. package/dist/components/dimmer.min.css +1 -1
  32. package/dist/components/dimmer.min.js +1 -1
  33. package/dist/components/divider.css +1 -1
  34. package/dist/components/divider.min.css +1 -1
  35. package/dist/components/dropdown.css +11 -8
  36. package/dist/components/dropdown.js +4163 -4234
  37. package/dist/components/dropdown.min.css +2 -2
  38. package/dist/components/dropdown.min.js +2 -2
  39. package/dist/components/embed.css +1 -1
  40. package/dist/components/embed.js +653 -675
  41. package/dist/components/embed.min.css +1 -1
  42. package/dist/components/embed.min.js +1 -1
  43. package/dist/components/feed.css +1 -1
  44. package/dist/components/feed.min.css +1 -1
  45. package/dist/components/flag.css +1 -1
  46. package/dist/components/flag.min.css +1 -1
  47. package/dist/components/flyout.css +6 -3
  48. package/dist/components/flyout.js +1466 -1467
  49. package/dist/components/flyout.min.css +2 -2
  50. package/dist/components/flyout.min.js +1 -1
  51. package/dist/components/form.css +1 -1
  52. package/dist/components/form.js +1981 -2004
  53. package/dist/components/form.min.css +1 -1
  54. package/dist/components/form.min.js +1 -1
  55. package/dist/components/grid.css +1 -1
  56. package/dist/components/grid.min.css +1 -1
  57. package/dist/components/header.css +1 -1
  58. package/dist/components/header.min.css +1 -1
  59. package/dist/components/icon.css +1 -1
  60. package/dist/components/icon.min.css +1 -1
  61. package/dist/components/image.css +1 -1
  62. package/dist/components/image.min.css +1 -1
  63. package/dist/components/input.css +1 -1
  64. package/dist/components/input.min.css +1 -1
  65. package/dist/components/item.css +1 -1
  66. package/dist/components/item.min.css +1 -1
  67. package/dist/components/label.css +1 -1
  68. package/dist/components/label.min.css +1 -1
  69. package/dist/components/list.css +1 -1
  70. package/dist/components/list.min.css +1 -1
  71. package/dist/components/loader.css +1 -1
  72. package/dist/components/loader.min.css +1 -1
  73. package/dist/components/message.css +1 -1
  74. package/dist/components/message.min.css +1 -1
  75. package/dist/components/modal.css +7 -1
  76. package/dist/components/modal.js +1493 -1487
  77. package/dist/components/modal.min.css +2 -2
  78. package/dist/components/modal.min.js +1 -1
  79. package/dist/components/nag.css +1 -1
  80. package/dist/components/nag.js +520 -529
  81. package/dist/components/nag.min.css +1 -1
  82. package/dist/components/nag.min.js +1 -1
  83. package/dist/components/placeholder.css +1 -1
  84. package/dist/components/placeholder.min.css +1 -1
  85. package/dist/components/popup.css +1 -1
  86. package/dist/components/popup.js +1439 -1456
  87. package/dist/components/popup.min.css +1 -1
  88. package/dist/components/popup.min.js +1 -1
  89. package/dist/components/progress.css +1 -1
  90. package/dist/components/progress.js +971 -997
  91. package/dist/components/progress.min.css +1 -1
  92. package/dist/components/progress.min.js +1 -1
  93. package/dist/components/rail.css +1 -1
  94. package/dist/components/rail.min.css +1 -1
  95. package/dist/components/rating.css +1 -1
  96. package/dist/components/rating.js +508 -524
  97. package/dist/components/rating.min.css +1 -1
  98. package/dist/components/rating.min.js +1 -1
  99. package/dist/components/reset.css +1 -1
  100. package/dist/components/reset.min.css +1 -1
  101. package/dist/components/reveal.css +1 -1
  102. package/dist/components/reveal.min.css +1 -1
  103. package/dist/components/search.css +3 -1
  104. package/dist/components/search.js +1500 -1534
  105. package/dist/components/search.min.css +2 -2
  106. package/dist/components/search.min.js +1 -1
  107. package/dist/components/segment.css +3 -1
  108. package/dist/components/segment.min.css +2 -2
  109. package/dist/components/shape.css +1 -1
  110. package/dist/components/shape.js +794 -809
  111. package/dist/components/shape.min.css +1 -1
  112. package/dist/components/shape.min.js +1 -1
  113. package/dist/components/sidebar.css +3 -1
  114. package/dist/components/sidebar.js +1079 -1104
  115. package/dist/components/sidebar.min.css +2 -2
  116. package/dist/components/sidebar.min.js +1 -1
  117. package/dist/components/site.css +1 -1
  118. package/dist/components/site.js +457 -472
  119. package/dist/components/site.min.css +1 -1
  120. package/dist/components/site.min.js +1 -1
  121. package/dist/components/slider.js +1289 -1311
  122. package/dist/components/slider.min.js +1 -1
  123. package/dist/components/state.js +641 -657
  124. package/dist/components/state.min.js +1 -1
  125. package/dist/components/statistic.css +1 -1
  126. package/dist/components/statistic.min.css +1 -1
  127. package/dist/components/step.css +1 -1
  128. package/dist/components/step.min.css +1 -1
  129. package/dist/components/sticky.css +1 -1
  130. package/dist/components/sticky.js +859 -903
  131. package/dist/components/sticky.min.css +1 -1
  132. package/dist/components/sticky.min.js +1 -1
  133. package/dist/components/tab.css +1 -1
  134. package/dist/components/tab.js +923 -963
  135. package/dist/components/tab.min.css +1 -1
  136. package/dist/components/tab.min.js +1 -1
  137. package/dist/components/table.css +5 -1
  138. package/dist/components/table.min.css +2 -2
  139. package/dist/components/text.css +1 -1
  140. package/dist/components/text.min.css +1 -1
  141. package/dist/components/toast.css +1 -1
  142. package/dist/components/toast.js +889 -891
  143. package/dist/components/toast.min.css +1 -1
  144. package/dist/components/toast.min.js +1 -1
  145. package/dist/components/transition.css +1 -1
  146. package/dist/components/transition.js +1043 -1077
  147. package/dist/components/transition.min.css +1 -1
  148. package/dist/components/transition.min.js +1 -1
  149. package/dist/components/visibility.js +1222 -1244
  150. package/dist/components/visibility.min.js +1 -1
  151. package/dist/semantic.css +84 -60
  152. package/dist/semantic.js +29033 -29475
  153. package/dist/semantic.min.css +2 -2
  154. package/dist/semantic.min.js +2 -2
  155. package/examples/assets/show-examples.js +13 -13
  156. package/gulpfile.js +9 -10
  157. package/package.json +5 -2
  158. package/scripts/nightly-version.js +81 -75
  159. package/src/definitions/behaviors/api.js +1163 -1185
  160. package/src/definitions/behaviors/form.js +1980 -2003
  161. package/src/definitions/behaviors/state.js +647 -663
  162. package/src/definitions/behaviors/visibility.js +1221 -1243
  163. package/src/definitions/collections/table.less +2 -0
  164. package/src/definitions/elements/container.less +1 -0
  165. package/src/definitions/elements/segment.less +1 -0
  166. package/src/definitions/globals/site.js +456 -471
  167. package/src/definitions/modules/accordion.js +570 -597
  168. package/src/definitions/modules/calendar.js +1896 -1817
  169. package/src/definitions/modules/checkbox.js +849 -846
  170. package/src/definitions/modules/dimmer.js +709 -736
  171. package/src/definitions/modules/dropdown.js +4162 -4233
  172. package/src/definitions/modules/dropdown.less +5 -8
  173. package/src/definitions/modules/embed.js +652 -674
  174. package/src/definitions/modules/flyout.js +1465 -1466
  175. package/src/definitions/modules/flyout.less +15 -12
  176. package/src/definitions/modules/modal.js +1492 -1486
  177. package/src/definitions/modules/modal.less +3 -0
  178. package/src/definitions/modules/nag.js +519 -528
  179. package/src/definitions/modules/popup.js +1438 -1455
  180. package/src/definitions/modules/progress.js +970 -996
  181. package/src/definitions/modules/rating.js +507 -523
  182. package/src/definitions/modules/search.js +1499 -1533
  183. package/src/definitions/modules/search.less +1 -0
  184. package/src/definitions/modules/shape.js +801 -816
  185. package/src/definitions/modules/sidebar.js +1078 -1103
  186. package/src/definitions/modules/sidebar.less +1 -0
  187. package/src/definitions/modules/slider.js +1288 -1310
  188. package/src/definitions/modules/sticky.js +875 -919
  189. package/src/definitions/modules/tab.js +922 -962
  190. package/src/definitions/modules/toast.js +888 -890
  191. package/src/definitions/modules/transition.js +1048 -1082
  192. package/src/themes/default/elements/container.variables +0 -7
  193. package/src/themes/default/elements/segment.variables +0 -7
  194. package/src/themes/default/globals/site.variables +7 -0
  195. package/src/themes/default/globals/variation.variables +1 -0
  196. package/tasks/admin/components/create.js +274 -276
  197. package/tasks/admin/components/init.js +123 -130
  198. package/tasks/admin/components/update.js +149 -157
  199. package/tasks/admin/distributions/create.js +184 -187
  200. package/tasks/admin/distributions/init.js +123 -130
  201. package/tasks/admin/distributions/update.js +145 -152
  202. package/tasks/admin/publish.js +5 -7
  203. package/tasks/admin/register.js +36 -38
  204. package/tasks/admin/release.js +8 -10
  205. package/tasks/build/assets.js +42 -39
  206. package/tasks/build/css.js +225 -216
  207. package/tasks/build/javascript.js +118 -113
  208. package/tasks/build.js +10 -10
  209. package/tasks/check-install.js +14 -16
  210. package/tasks/clean.js +5 -5
  211. package/tasks/collections/admin.js +34 -36
  212. package/tasks/collections/build.js +18 -20
  213. package/tasks/collections/docs.js +9 -11
  214. package/tasks/collections/install.js +9 -11
  215. package/tasks/collections/rtl.js +9 -11
  216. package/tasks/collections/various.js +8 -10
  217. package/tasks/config/admin/github.js +17 -17
  218. package/tasks/config/admin/oauth.example.js +4 -4
  219. package/tasks/config/admin/release.js +98 -98
  220. package/tasks/config/admin/templates/component-package.js +9 -10
  221. package/tasks/config/admin/templates/css-package.js +18 -20
  222. package/tasks/config/admin/templates/less-package.js +11 -13
  223. package/tasks/config/defaults.js +116 -116
  224. package/tasks/config/docs.js +23 -23
  225. package/tasks/config/npm/gulpfile.js +8 -9
  226. package/tasks/config/project/config.js +127 -134
  227. package/tasks/config/project/install.js +715 -713
  228. package/tasks/config/project/release.js +32 -38
  229. package/tasks/config/tasks.js +163 -164
  230. package/tasks/config/user.js +23 -29
  231. package/tasks/docs/build.js +97 -95
  232. package/tasks/docs/metadata.js +90 -96
  233. package/tasks/docs/serve.js +80 -81
  234. package/tasks/install.js +370 -378
  235. package/tasks/rtl/build.js +2 -2
  236. package/tasks/rtl/watch.js +2 -2
  237. package/tasks/version.js +4 -4
  238. package/tasks/watch.js +28 -30
  239. package/test/meteor/assets.js +10 -13
  240. package/test/meteor/fonts.js +12 -13
  241. package/test/modules/accordion.spec.js +6 -8
  242. package/test/modules/checkbox.spec.js +5 -7
  243. package/test/modules/dropdown.spec.js +5 -7
  244. package/test/modules/modal.spec.js +6 -8
  245. package/test/modules/module.spec.js +158 -178
  246. package/test/modules/popup.spec.js +5 -7
  247. package/test/modules/search.spec.js +5 -7
  248. package/test/modules/shape.spec.js +5 -7
  249. package/test/modules/sidebar.spec.js +5 -7
  250. package/test/modules/tab.spec.js +6 -8
  251. package/test/modules/transition.spec.js +5 -7
  252. package/test/modules/video.spec.js +5 -7
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * # Fomantic-UI 2.9.1-beta.16+7071e59 - Modal
2
+ * # Fomantic-UI 2.9.1-beta.18+935e235 - Modal
3
3
  * https://github.com/fomantic/Fomantic-UI/
4
4
  *
5
5
  *
@@ -8,1551 +8,1557 @@
8
8
  *
9
9
  */
10
10
 
11
- ;(function ($, window, document, undefined) {
12
-
13
- 'use strict';
14
-
15
- function isFunction(obj) {
16
- return typeof obj === "function" && typeof obj.nodeType !== "number";
17
- }
18
-
19
- window = (typeof window != 'undefined' && window.Math == Math)
20
- ? window
21
- : (typeof self != 'undefined' && self.Math == Math)
22
- ? self
23
- : Function('return this')()
24
- ;
25
-
26
- $.modal = $.fn.modal = function(parameters) {
27
- var
28
- $allModules = $(this),
29
- $window = $(window),
30
- $document = $(document),
31
- $body = $('body'),
32
-
33
- moduleSelector = $allModules.selector || '',
34
-
35
- time = new Date().getTime(),
36
- performance = [],
37
-
38
- query = arguments[0],
39
- methodInvoked = (typeof query == 'string'),
40
- queryArguments = [].slice.call(arguments, 1),
41
-
42
- requestAnimationFrame = window.requestAnimationFrame
43
- || window.mozRequestAnimationFrame
44
- || window.webkitRequestAnimationFrame
45
- || window.msRequestAnimationFrame
46
- || function(callback) { setTimeout(callback, 0); },
47
-
48
- returnedValue
49
- ;
50
-
51
- $allModules
52
- .each(function() {
53
- var
54
- settings = ( $.isPlainObject(parameters) )
55
- ? $.extend(true, {}, $.fn.modal.settings, parameters)
56
- : $.extend({}, $.fn.modal.settings),
57
-
58
- selector = settings.selector,
59
- className = settings.className,
60
- namespace = settings.namespace,
61
- fields = settings.fields,
62
- error = settings.error,
63
-
64
- eventNamespace = '.' + namespace,
65
- moduleNamespace = 'module-' + namespace,
66
-
67
- $module = $(this),
68
- $context = [window,document].indexOf(settings.context) < 0 ? $document.find(settings.context) : $body,
69
- isBody = $context[0] === $body[0],
70
- $closeIcon = $module.find(selector.closeIcon),
71
- $inputs,
72
-
73
- $allModals,
74
- $otherModals,
75
- $focusedElement,
76
- $dimmable,
77
- $dimmer,
78
-
79
- isModalComponent = $module.hasClass('modal'),
80
-
81
- element = this,
82
- instance = isModalComponent ? $module.data(moduleNamespace) : undefined,
83
-
84
- ignoreRepeatedEvents = false,
85
-
86
- initialMouseDownInModal,
87
- initialMouseDownInScrollbar,
88
- initialBodyMargin = '',
89
- tempBodyMargin = '',
90
- keepScrollingClass = false,
91
- hadScrollbar = false,
92
-
93
- elementEventNamespace,
94
- id,
95
- observer,
96
- module
97
- ;
98
- module = {
99
-
100
- initialize: function() {
101
- module.create.id();
102
- if(!isModalComponent) {
103
- module.create.modal();
104
- if(!isFunction(settings.onHidden)) {
105
- settings.onHidden = function () {
106
- module.destroy();
107
- $module.remove();
108
- };
109
- }
110
- }
111
- $module.addClass(settings.class);
112
- if (settings.title !== '') {
113
- $module.find(selector.title).html(module.helpers.escape(settings.title, settings.preserveHTML)).addClass(settings.classTitle);
114
- }
115
- if (settings.content !== '') {
116
- $module.find(selector.content).html(module.helpers.escape(settings.content, settings.preserveHTML)).addClass(settings.classContent);
117
- }
118
- if(module.has.configActions()){
119
- var $actions = $module.find(selector.actions).addClass(settings.classActions);
120
- if ($actions.length === 0) {
121
- $actions = $('<div/>', {class: className.actions + ' ' + (settings.classActions || '')}).appendTo($module);
122
- } else {
123
- $actions.empty();
124
- }
125
- settings.actions.forEach(function (el) {
126
- var icon = el[fields.icon] ? '<i '+(el[fields.text] ? 'aria-hidden="true"' : '')+' class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '',
127
- text = module.helpers.escape(el[fields.text] || '', settings.preserveHTML),
128
- cls = module.helpers.deQuote(el[fields.class] || ''),
129
- click = el[fields.click] && isFunction(el[fields.click]) ? el[fields.click] : function () {};
130
- $actions.append($('<button/>', {
131
- html: icon + text,
132
- 'aria-label': (el[fields.text] || el[fields.icon] || '').replace(/<[^>]+(>|$)/g,''),
133
- class: className.button + ' ' + cls,
134
- on: {
135
- click: function () {
136
- var button = $(this);
137
- if (button.is(selector.approve) || button.is(selector.deny) || click.call(element, $module) === false) {
138
- return;
139
- }
140
- module.hide();
141
- }
142
- }
143
- }));
144
- });
145
- }
146
- module.cache = {};
147
- module.verbose('Initializing dimmer', $context);
148
-
149
- module.create.dimmer();
150
-
151
- if ( settings.allowMultiple ) {
152
- module.create.innerDimmer();
153
- }
154
- if (!settings.centered){
155
- $module.addClass('top aligned');
156
- }
157
- module.refreshModals();
158
- module.bind.events();
159
- module.observeChanges();
160
- module.instantiate();
161
- if(settings.autoShow){
162
- module.show();
163
- }
164
- },
11
+ (function ($, window, document, undefined) {
12
+ 'use strict';
165
13
 
166
- instantiate: function() {
167
- module.verbose('Storing instance of modal');
168
- instance = module;
169
- $module
170
- .data(moduleNamespace, instance)
171
- ;
172
- },
14
+ function isFunction(obj) {
15
+ return typeof obj === 'function' && typeof obj.nodeType !== 'number';
16
+ }
173
17
 
174
- create: {
175
- modal: function() {
176
- $module = $('<div/>', {class: className.modal, role: 'dialog', 'aria-modal': true});
177
- if (settings.closeIcon) {
178
- $closeIcon = $('<i/>', {class: className.close, role: 'button', tabindex: 0, 'aria-label': settings.text.close})
179
- $module.append($closeIcon);
180
- }
181
- if (settings.title !== '') {
182
- var titleId = '_' + module.get.id() + 'title';
183
- $module.attr('aria-labelledby', titleId);
184
- $('<div/>', {class: className.title, id: titleId}).appendTo($module);
185
- }
186
- if (settings.content !== '') {
187
- var descId = '_' + module.get.id() + 'desc';
188
- $module.attr('aria-describedby', descId);
189
- $('<div/>', {class: className.content, id: descId}).appendTo($module);
190
- }
191
- if (module.has.configActions()) {
192
- $('<div/>', {class: className.actions}).appendTo($module);
193
- }
194
- $context.append($module);
195
- element = $module[0];
196
- },
197
- dimmer: function() {
18
+ window = (typeof window != 'undefined' && window.Math == Math)
19
+ ? window
20
+ : (typeof self != 'undefined' && self.Math == Math)
21
+ ? self
22
+ : Function('return this')();
23
+
24
+ $.modal = $.fn.modal = function (parameters) {
25
+ var
26
+ $allModules = $(this),
27
+ $window = $(window),
28
+ $document = $(document),
29
+ $body = $('body'),
30
+
31
+ moduleSelector = $allModules.selector || '',
32
+
33
+ time = new Date().getTime(),
34
+ performance = [],
35
+
36
+ query = arguments[0],
37
+ methodInvoked = (typeof query == 'string'),
38
+ queryArguments = [].slice.call(arguments, 1),
39
+
40
+ requestAnimationFrame = window.requestAnimationFrame
41
+ || window.mozRequestAnimationFrame
42
+ || window.webkitRequestAnimationFrame
43
+ || window.msRequestAnimationFrame
44
+ || function (callback) {
45
+ setTimeout(callback, 0);
46
+ },
47
+
48
+ returnedValue
49
+ ;
50
+
51
+ $allModules.each(function () {
198
52
  var
199
- defaultSettings = {
200
- debug : settings.debug,
201
- dimmerName : 'modals'
202
- },
203
- dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings)
53
+ settings = ($.isPlainObject(parameters))
54
+ ? $.extend(true, {}, $.fn.modal.settings, parameters)
55
+ : $.extend({}, $.fn.modal.settings),
56
+
57
+ selector = settings.selector,
58
+ className = settings.className,
59
+ namespace = settings.namespace,
60
+ fields = settings.fields,
61
+ error = settings.error,
62
+
63
+ eventNamespace = '.' + namespace,
64
+ moduleNamespace = 'module-' + namespace,
65
+
66
+ $module = $(this),
67
+ $context = [window, document].indexOf(settings.context) < 0 ? $document.find(settings.context) : $body,
68
+ isBody = $context[0] === $body[0],
69
+ $closeIcon = $module.find(selector.closeIcon),
70
+ $inputs,
71
+
72
+ $allModals,
73
+ $otherModals,
74
+ $focusedElement,
75
+ $dimmable,
76
+ $dimmer,
77
+
78
+ isModalComponent = $module.hasClass('modal'),
79
+
80
+ element = this,
81
+ instance = isModalComponent ? $module.data(moduleNamespace) : undefined,
82
+
83
+ ignoreRepeatedEvents = false,
84
+
85
+ initialMouseDownInModal,
86
+ initialMouseDownInScrollbar,
87
+ initialBodyMargin = '',
88
+ tempBodyMargin = '',
89
+ keepScrollingClass = false,
90
+ hadScrollbar = false,
91
+
92
+ elementEventNamespace,
93
+ id,
94
+ observer,
95
+ module
204
96
  ;
205
- if($.fn.dimmer === undefined) {
206
- module.error(error.dimmer);
207
- return;
208
- }
209
- module.debug('Creating dimmer');
210
- $dimmable = $context.dimmer(dimmerSettings);
211
- keepScrollingClass = module.is.scrolling();
212
- if(settings.detachable) {
213
- module.verbose('Modal is detachable, moving content into dimmer');
214
- $dimmable.dimmer('add content', $module);
215
- }
216
- else {
217
- module.set.undetached();
218
- }
219
- $dimmer = $dimmable.dimmer('get dimmer');
220
- },
221
- id: function() {
222
- id = (Math.random().toString(16) + '000000000').slice(2, 10);
223
- elementEventNamespace = '.' + id;
224
- module.verbose('Creating unique id for element', id);
225
- },
226
- innerDimmer: function() {
227
- if ( $module.find(selector.dimmer).length === 0 ) {
228
- $('<div/>', {class: className.innerDimmer}).prependTo($module);
229
- }
230
- }
231
- },
97
+ module = {
98
+
99
+ initialize: function () {
100
+ module.create.id();
101
+ if (!isModalComponent) {
102
+ module.create.modal();
103
+ if (!isFunction(settings.onHidden)) {
104
+ settings.onHidden = function () {
105
+ module.destroy();
106
+ $module.remove();
107
+ };
108
+ }
109
+ }
110
+ $module.addClass(settings.class);
111
+ if (settings.title !== '') {
112
+ $module.find(selector.title).html(module.helpers.escape(settings.title, settings.preserveHTML)).addClass(settings.classTitle);
113
+ }
114
+ if (settings.content !== '') {
115
+ $module.find(selector.content).html(module.helpers.escape(settings.content, settings.preserveHTML)).addClass(settings.classContent);
116
+ }
117
+ if (module.has.configActions()) {
118
+ var $actions = $module.find(selector.actions).addClass(settings.classActions);
119
+ if ($actions.length === 0) {
120
+ $actions = $('<div/>', { class: className.actions + ' ' + (settings.classActions || '') }).appendTo($module);
121
+ } else {
122
+ $actions.empty();
123
+ }
124
+ settings.actions.forEach(function (el) {
125
+ var
126
+ icon = el[fields.icon] ? '<i ' + (el[fields.text] ? 'aria-hidden="true"' : '') + ' class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '',
127
+ text = module.helpers.escape(el[fields.text] || '', settings.preserveHTML),
128
+ cls = module.helpers.deQuote(el[fields.class] || ''),
129
+ click = el[fields.click] && isFunction(el[fields.click]) ? el[fields.click] : function () {}
130
+ ;
131
+ $actions.append($('<button/>', {
132
+ html: icon + text,
133
+ 'aria-label': (el[fields.text] || el[fields.icon] || '').replace(/<[^>]+(>|$)/g, ''),
134
+ class: className.button + ' ' + cls,
135
+ on: {
136
+ click: function () {
137
+ var button = $(this);
138
+ if (button.is(selector.approve) || button.is(selector.deny) || click.call(element, $module) === false) {
139
+ return;
140
+ }
141
+ module.hide();
142
+ },
143
+ },
144
+ }));
145
+ });
146
+ }
147
+ module.cache = {};
148
+ module.verbose('Initializing dimmer', $context);
232
149
 
233
- destroy: function() {
234
- if (observer) {
235
- observer.disconnect();
236
- }
237
- module.verbose('Destroying previous modal');
238
- $module
239
- .removeData(moduleNamespace)
240
- .off(eventNamespace)
241
- ;
242
- $window.off(elementEventNamespace);
243
- $dimmer.off(elementEventNamespace);
244
- $closeIcon.off(elementEventNamespace);
245
- if($inputs) {
246
- $inputs.off(elementEventNamespace);
247
- }
248
- $context.dimmer('destroy');
249
- },
150
+ module.create.dimmer();
250
151
 
251
- observeChanges: function() {
252
- if('MutationObserver' in window) {
253
- observer = new MutationObserver(function(mutations) {
254
- if(settings.observeChanges) {
255
- module.debug('DOM tree modified, refreshing');
256
- module.refresh();
257
- }
258
- module.refreshInputs();
259
- });
260
- observer.observe(element, {
261
- childList : true,
262
- subtree : true
263
- });
264
- module.debug('Setting up mutation observer', observer);
265
- }
266
- },
152
+ if (settings.allowMultiple) {
153
+ module.create.innerDimmer();
154
+ }
155
+ if (!settings.centered) {
156
+ $module.addClass('top aligned');
157
+ }
158
+ module.refreshModals();
159
+ module.bind.events();
160
+ module.observeChanges();
161
+ module.instantiate();
162
+ if (settings.autoShow) {
163
+ module.show();
164
+ }
165
+ },
267
166
 
268
- refresh: function() {
269
- module.remove.scrolling();
270
- module.cacheSizes();
271
- if(!module.can.useFlex()) {
272
- module.set.modalOffset();
273
- }
274
- module.set.screenHeight();
275
- module.set.type();
276
- },
167
+ instantiate: function () {
168
+ module.verbose('Storing instance of modal');
169
+ instance = module;
170
+ $module
171
+ .data(moduleNamespace, instance)
172
+ ;
173
+ },
277
174
 
278
- refreshModals: function() {
279
- $otherModals = $module.siblings(selector.modal);
280
- $allModals = $otherModals.add($module);
281
- },
175
+ create: {
176
+ modal: function () {
177
+ $module = $('<div/>', { class: className.modal, role: 'dialog', 'aria-modal': true });
178
+ if (settings.closeIcon) {
179
+ $closeIcon = $('<i/>', {
180
+ class: className.close,
181
+ role: 'button',
182
+ tabindex: 0,
183
+ 'aria-label': settings.text.close,
184
+ });
185
+ $module.append($closeIcon);
186
+ }
187
+ if (settings.title !== '') {
188
+ var titleId = '_' + module.get.id() + 'title';
189
+ $module.attr('aria-labelledby', titleId);
190
+ $('<div/>', { class: className.title, id: titleId }).appendTo($module);
191
+ }
192
+ if (settings.content !== '') {
193
+ var descId = '_' + module.get.id() + 'desc';
194
+ $module.attr('aria-describedby', descId);
195
+ $('<div/>', { class: className.content, id: descId }).appendTo($module);
196
+ }
197
+ if (module.has.configActions()) {
198
+ $('<div/>', { class: className.actions }).appendTo($module);
199
+ }
200
+ $context.append($module);
201
+ element = $module[0];
202
+ },
203
+ dimmer: function () {
204
+ var
205
+ defaultSettings = {
206
+ debug: settings.debug,
207
+ dimmerName: 'modals',
208
+ },
209
+ dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings)
210
+ ;
211
+ if ($.fn.dimmer === undefined) {
212
+ module.error(error.dimmer);
213
+
214
+ return;
215
+ }
216
+ module.debug('Creating dimmer');
217
+ $dimmable = $context.dimmer(dimmerSettings);
218
+ keepScrollingClass = module.is.scrolling();
219
+ if (settings.detachable) {
220
+ module.verbose('Modal is detachable, moving content into dimmer');
221
+ $dimmable.dimmer('add content', $module);
222
+ } else {
223
+ module.set.undetached();
224
+ }
225
+ $dimmer = $dimmable.dimmer('get dimmer');
226
+ },
227
+ id: function () {
228
+ id = (Math.random().toString(16) + '000000000').slice(2, 10);
229
+ elementEventNamespace = '.' + id;
230
+ module.verbose('Creating unique id for element', id);
231
+ },
232
+ innerDimmer: function () {
233
+ if ($module.find(selector.dimmer).length === 0) {
234
+ $('<div/>', { class: className.innerDimmer }).prependTo($module);
235
+ }
236
+ },
237
+ },
282
238
 
283
- refreshInputs: function(){
284
- if($inputs){
285
- $inputs
286
- .off('keydown' + elementEventNamespace)
287
- ;
288
- }
289
- $inputs = $module.find('[tabindex], :input').filter(':visible').filter(function() {
290
- return $(this).closest('.disabled').length === 0;
291
- });
292
- $inputs.first()
293
- .on('keydown' + elementEventNamespace, module.event.inputKeyDown.first)
294
- ;
295
- $inputs.last()
296
- .on('keydown' + elementEventNamespace, module.event.inputKeyDown.last)
297
- ;
298
- },
239
+ destroy: function () {
240
+ if (observer) {
241
+ observer.disconnect();
242
+ }
243
+ module.verbose('Destroying previous modal');
244
+ $module
245
+ .removeData(moduleNamespace)
246
+ .off(eventNamespace)
247
+ ;
248
+ $window.off(elementEventNamespace);
249
+ $dimmer.off(elementEventNamespace);
250
+ $closeIcon.off(elementEventNamespace);
251
+ if ($inputs) {
252
+ $inputs.off(elementEventNamespace);
253
+ }
254
+ $context.dimmer('destroy');
255
+ },
299
256
 
300
- attachEvents: function(selector, event) {
301
- var
302
- $toggle = $(selector)
303
- ;
304
- event = isFunction(module[event])
305
- ? module[event]
306
- : module.toggle
307
- ;
308
- if($toggle.length > 0) {
309
- module.debug('Attaching modal events to element', selector, event);
310
- $toggle
311
- .off(eventNamespace)
312
- .on('click' + eventNamespace, event)
313
- ;
314
- }
315
- else {
316
- module.error(error.notFound, selector);
317
- }
318
- },
257
+ observeChanges: function () {
258
+ if ('MutationObserver' in window) {
259
+ observer = new MutationObserver(function (mutations) {
260
+ if (settings.observeChanges) {
261
+ module.debug('DOM tree modified, refreshing');
262
+ module.refresh();
263
+ }
264
+ module.refreshInputs();
265
+ });
266
+ observer.observe(element, {
267
+ childList: true,
268
+ subtree: true,
269
+ });
270
+ module.debug('Setting up mutation observer', observer);
271
+ }
272
+ },
319
273
 
320
- bind: {
321
- events: function() {
322
- module.verbose('Attaching events');
323
- $module
324
- .on('click' + eventNamespace, selector.close, module.event.close)
325
- .on('click' + eventNamespace, selector.approve, module.event.approve)
326
- .on('click' + eventNamespace, selector.deny, module.event.deny)
327
- ;
328
- $closeIcon
329
- .on('keyup' + elementEventNamespace, module.event.closeKeyUp)
330
- ;
331
- $window
332
- .on('resize' + elementEventNamespace, module.event.resize)
333
- ;
334
- },
335
- scrollLock: function() {
336
- // touch events default to passive, due to changes in chrome to optimize mobile perf
337
- $dimmable[0].addEventListener('touchmove', module.event.preventScroll, { passive: false });
338
- }
339
- },
274
+ refresh: function () {
275
+ module.remove.scrolling();
276
+ module.cacheSizes();
277
+ if (!module.can.useFlex()) {
278
+ module.set.modalOffset();
279
+ }
280
+ module.set.screenHeight();
281
+ module.set.type();
282
+ },
340
283
 
341
- unbind: {
342
- scrollLock: function() {
343
- $dimmable[0].removeEventListener('touchmove', module.event.preventScroll, { passive: false });
344
- }
345
- },
284
+ refreshModals: function () {
285
+ $otherModals = $module.siblings(selector.modal);
286
+ $allModals = $otherModals.add($module);
287
+ },
346
288
 
347
- get: {
348
- id: function() {
349
- return id;
350
- },
351
- element: function() {
352
- return $module;
353
- },
354
- settings: function() {
355
- return settings;
356
- }
357
- },
289
+ refreshInputs: function () {
290
+ if ($inputs) {
291
+ $inputs
292
+ .off('keydown' + elementEventNamespace)
293
+ ;
294
+ }
295
+ $inputs = $module.find('[tabindex], :input').filter(':visible').filter(function () {
296
+ return $(this).closest('.disabled').length === 0;
297
+ });
298
+ $inputs.first()
299
+ .on('keydown' + elementEventNamespace, module.event.inputKeyDown.first)
300
+ ;
301
+ $inputs.last()
302
+ .on('keydown' + elementEventNamespace, module.event.inputKeyDown.last)
303
+ ;
304
+ },
358
305
 
359
- event: {
360
- approve: function() {
361
- if(ignoreRepeatedEvents || settings.onApprove.call(element, $(this)) === false) {
362
- module.verbose('Approve callback returned false cancelling hide');
363
- return;
364
- }
365
- ignoreRepeatedEvents = true;
366
- module.hide(function() {
367
- ignoreRepeatedEvents = false;
368
- });
369
- },
370
- preventScroll: function(event) {
371
- if(event.target.className.indexOf('dimmer') !== -1) {
372
- event.preventDefault();
373
- }
374
- },
375
- deny: function() {
376
- if(ignoreRepeatedEvents || settings.onDeny.call(element, $(this)) === false) {
377
- module.verbose('Deny callback returned false cancelling hide');
378
- return;
379
- }
380
- ignoreRepeatedEvents = true;
381
- module.hide(function() {
382
- ignoreRepeatedEvents = false;
383
- });
384
- },
385
- close: function() {
386
- module.hide();
387
- },
388
- closeKeyUp: function(event){
389
- var
390
- keyCode = event.which
391
- ;
392
- if ((keyCode === settings.keys.enter || keyCode === settings.keys.space) && $module.hasClass(className.front)) {
393
- module.hide();
394
- }
395
- },
396
- inputKeyDown: {
397
- first: function(event) {
398
- var
399
- keyCode = event.which
400
- ;
401
- if (keyCode === settings.keys.tab && event.shiftKey) {
402
- $inputs.last().trigger('focus');
403
- event.preventDefault();
404
- }
405
- },
406
- last: function(event) {
407
- var
408
- keyCode = event.which
409
- ;
410
- if (keyCode === settings.keys.tab && !event.shiftKey) {
411
- $inputs.first().trigger('focus');
412
- event.preventDefault();
413
- }
414
- }
415
- },
416
- mousedown: function(event) {
417
- var
418
- $target = $(event.target),
419
- isRtl = module.is.rtl()
420
- ;
421
- initialMouseDownInModal = ($target.closest(selector.modal).length > 0);
422
- if(initialMouseDownInModal) {
423
- module.verbose('Mouse down event registered inside the modal');
424
- }
425
- initialMouseDownInScrollbar = module.is.scrolling() && ((!isRtl && $window.outerWidth() - settings.scrollbarWidth <= event.clientX) || (isRtl && settings.scrollbarWidth >= event.clientX));
426
- if(initialMouseDownInScrollbar) {
427
- module.verbose('Mouse down event registered inside the scrollbar');
428
- }
429
- },
430
- mouseup: function(event) {
431
- if(!settings.closable) {
432
- module.verbose('Dimmer clicked but closable setting is disabled');
433
- return;
434
- }
435
- if(initialMouseDownInModal) {
436
- module.debug('Dimmer clicked but mouse down was initially registered inside the modal');
437
- return;
438
- }
439
- if(initialMouseDownInScrollbar){
440
- module.debug('Dimmer clicked but mouse down was initially registered inside the scrollbar');
441
- return;
442
- }
443
- var
444
- $target = $(event.target),
445
- isInModal = ($target.closest(selector.modal).length > 0),
446
- isInDOM = $.contains(document.documentElement, event.target)
447
- ;
448
- if(!isInModal && isInDOM && module.is.active() && $module.hasClass(className.front) ) {
449
- module.debug('Dimmer clicked, hiding all modals');
450
- if(settings.allowMultiple) {
451
- if(!module.hideAll()) {
452
- return;
453
- }
454
- }
455
- else if(!module.hide()){
456
- return;
457
- }
458
- module.remove.clickaway();
459
- }
460
- },
461
- debounce: function(method, delay) {
462
- clearTimeout(module.timer);
463
- module.timer = setTimeout(method, delay);
464
- },
465
- keyboard: function(event) {
466
- var
467
- keyCode = event.which
468
- ;
469
- if(keyCode === settings.keys.escape) {
470
- if(settings.closable) {
471
- module.debug('Escape key pressed hiding modal');
472
- if ( $module.hasClass(className.front) ) {
473
- module.hide();
474
- }
475
- }
476
- else {
477
- module.debug('Escape key pressed, but closable is set to false');
478
- }
479
- event.preventDefault();
480
- }
481
- },
482
- resize: function() {
483
- if( $dimmable.dimmer('is active') && ( module.is.animating() || module.is.active() ) ) {
484
- requestAnimationFrame(module.refresh);
485
- }
486
- }
487
- },
306
+ attachEvents: function (selector, event) {
307
+ var
308
+ $toggle = $(selector)
309
+ ;
310
+ event = isFunction(module[event])
311
+ ? module[event]
312
+ : module.toggle;
313
+ if ($toggle.length > 0) {
314
+ module.debug('Attaching modal events to element', selector, event);
315
+ $toggle
316
+ .off(eventNamespace)
317
+ .on('click' + eventNamespace, event)
318
+ ;
319
+ } else {
320
+ module.error(error.notFound, selector);
321
+ }
322
+ },
488
323
 
489
- toggle: function() {
490
- if( module.is.active() || module.is.animating() ) {
491
- module.hide();
492
- }
493
- else {
494
- module.show();
495
- }
496
- },
324
+ bind: {
325
+ events: function () {
326
+ module.verbose('Attaching events');
327
+ $module
328
+ .on('click' + eventNamespace, selector.close, module.event.close)
329
+ .on('click' + eventNamespace, selector.approve, module.event.approve)
330
+ .on('click' + eventNamespace, selector.deny, module.event.deny)
331
+ ;
332
+ $closeIcon
333
+ .on('keyup' + elementEventNamespace, module.event.closeKeyUp)
334
+ ;
335
+ $window
336
+ .on('resize' + elementEventNamespace, module.event.resize)
337
+ ;
338
+ },
339
+ scrollLock: function () {
340
+ // touch events default to passive, due to changes in chrome to optimize mobile perf
341
+ $dimmable[0].addEventListener('touchmove', module.event.preventScroll, { passive: false });
342
+ },
343
+ },
497
344
 
498
- show: function(callback) {
499
- callback = isFunction(callback)
500
- ? callback
501
- : function(){}
502
- ;
503
- module.refreshModals();
504
- module.set.dimmerSettings();
505
- module.set.dimmerStyles();
345
+ unbind: {
346
+ scrollLock: function () {
347
+ $dimmable[0].removeEventListener('touchmove', module.event.preventScroll, { passive: false });
348
+ },
349
+ },
506
350
 
507
- module.showModal(callback);
508
- },
351
+ get: {
352
+ id: function () {
353
+ return id;
354
+ },
355
+ element: function () {
356
+ return $module;
357
+ },
358
+ settings: function () {
359
+ return settings;
360
+ },
361
+ },
509
362
 
510
- hide: function(callback) {
511
- callback = isFunction(callback)
512
- ? callback
513
- : function(){}
514
- ;
515
- module.refreshModals();
516
- return module.hideModal(callback);
517
- },
363
+ event: {
364
+ approve: function () {
365
+ if (ignoreRepeatedEvents || settings.onApprove.call(element, $(this)) === false) {
366
+ module.verbose('Approve callback returned false cancelling hide');
367
+
368
+ return;
369
+ }
370
+ ignoreRepeatedEvents = true;
371
+ module.hide(function () {
372
+ ignoreRepeatedEvents = false;
373
+ });
374
+ },
375
+ preventScroll: function (event) {
376
+ if (event.target.className.indexOf('dimmer') !== -1) {
377
+ event.preventDefault();
378
+ }
379
+ },
380
+ deny: function () {
381
+ if (ignoreRepeatedEvents || settings.onDeny.call(element, $(this)) === false) {
382
+ module.verbose('Deny callback returned false cancelling hide');
383
+
384
+ return;
385
+ }
386
+ ignoreRepeatedEvents = true;
387
+ module.hide(function () {
388
+ ignoreRepeatedEvents = false;
389
+ });
390
+ },
391
+ close: function () {
392
+ module.hide();
393
+ },
394
+ closeKeyUp: function (event) {
395
+ var
396
+ keyCode = event.which
397
+ ;
398
+ if ((keyCode === settings.keys.enter || keyCode === settings.keys.space) && $module.hasClass(className.front)) {
399
+ module.hide();
400
+ }
401
+ },
402
+ inputKeyDown: {
403
+ first: function (event) {
404
+ var
405
+ keyCode = event.which
406
+ ;
407
+ if (keyCode === settings.keys.tab && event.shiftKey) {
408
+ $inputs.last().trigger('focus');
409
+ event.preventDefault();
410
+ }
411
+ },
412
+ last: function (event) {
413
+ var
414
+ keyCode = event.which
415
+ ;
416
+ if (keyCode === settings.keys.tab && !event.shiftKey) {
417
+ $inputs.first().trigger('focus');
418
+ event.preventDefault();
419
+ }
420
+ },
421
+ },
422
+ mousedown: function (event) {
423
+ var
424
+ $target = $(event.target),
425
+ isRtl = module.is.rtl()
426
+ ;
427
+ initialMouseDownInModal = ($target.closest(selector.modal).length > 0);
428
+ if (initialMouseDownInModal) {
429
+ module.verbose('Mouse down event registered inside the modal');
430
+ }
431
+ initialMouseDownInScrollbar = module.is.scrolling() && ((!isRtl && $window.outerWidth() - settings.scrollbarWidth <= event.clientX) || (isRtl && settings.scrollbarWidth >= event.clientX));
432
+ if (initialMouseDownInScrollbar) {
433
+ module.verbose('Mouse down event registered inside the scrollbar');
434
+ }
435
+ },
436
+ mouseup: function (event) {
437
+ if (!settings.closable) {
438
+ module.verbose('Dimmer clicked but closable setting is disabled');
439
+
440
+ return;
441
+ }
442
+ if (initialMouseDownInModal) {
443
+ module.debug('Dimmer clicked but mouse down was initially registered inside the modal');
444
+
445
+ return;
446
+ }
447
+ if (initialMouseDownInScrollbar) {
448
+ module.debug('Dimmer clicked but mouse down was initially registered inside the scrollbar');
449
+
450
+ return;
451
+ }
452
+ var
453
+ $target = $(event.target),
454
+ isInModal = ($target.closest(selector.modal).length > 0),
455
+ isInDOM = $.contains(document.documentElement, event.target)
456
+ ;
457
+ if (!isInModal && isInDOM && module.is.active() && $module.hasClass(className.front)) {
458
+ module.debug('Dimmer clicked, hiding all modals');
459
+ if (settings.allowMultiple) {
460
+ if (!module.hideAll()) {
461
+ return;
462
+ }
463
+ } else if (!module.hide()) {
464
+ return;
465
+ }
466
+ module.remove.clickaway();
467
+ }
468
+ },
469
+ debounce: function (method, delay) {
470
+ clearTimeout(module.timer);
471
+ module.timer = setTimeout(method, delay);
472
+ },
473
+ keyboard: function (event) {
474
+ var
475
+ keyCode = event.which
476
+ ;
477
+ if (keyCode === settings.keys.escape) {
478
+ if (settings.closable) {
479
+ module.debug('Escape key pressed hiding modal');
480
+ if ($module.hasClass(className.front)) {
481
+ module.hide();
482
+ }
483
+ } else {
484
+ module.debug('Escape key pressed, but closable is set to false');
485
+ }
486
+ event.preventDefault();
487
+ }
488
+ },
489
+ resize: function () {
490
+ if ($dimmable.dimmer('is active') && (module.is.animating() || module.is.active())) {
491
+ requestAnimationFrame(module.refresh);
492
+ }
493
+ },
494
+ },
518
495
 
519
- showModal: function(callback) {
520
- callback = isFunction(callback)
521
- ? callback
522
- : function(){}
523
- ;
524
- if( module.is.animating() || !module.is.active() ) {
525
- if(settings.onShow.call(element) === false) {
526
- module.verbose('Show callback returned false cancelling show');
527
- return;
528
- }
529
- hadScrollbar = module.has.scrollbar();
530
- module.showDimmer();
531
- module.cacheSizes();
532
- if(hadScrollbar) {
533
- module.set.bodyMargin();
534
- }
535
- if(module.can.useFlex()) {
536
- module.remove.legacy();
537
- }
538
- else {
539
- module.set.legacy();
540
- module.set.modalOffset();
541
- module.debug('Using non-flex legacy modal positioning.');
542
- }
543
- module.set.screenHeight();
544
- module.set.type();
545
- module.set.clickaway();
496
+ toggle: function () {
497
+ if (module.is.active() || module.is.animating()) {
498
+ module.hide();
499
+ } else {
500
+ module.show();
501
+ }
502
+ },
546
503
 
547
- if( !settings.allowMultiple && module.others.active() ) {
548
- module.hideOthers(module.showModal);
549
- }
550
- else {
551
- ignoreRepeatedEvents = false;
552
- if( settings.allowMultiple ) {
553
- if ( module.others.active() ) {
554
- $otherModals.filter('.' + className.active).find(selector.dimmer).addClass('active');
555
- }
504
+ show: function (callback) {
505
+ callback = isFunction(callback)
506
+ ? callback
507
+ : function () {};
508
+ module.refreshModals();
509
+ module.set.dimmerSettings();
510
+ module.set.dimmerStyles();
556
511
 
557
- if ( settings.detachable ) {
558
- $module.detach().appendTo($dimmer);
559
- }
560
- }
561
- if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
562
- module.debug('Showing modal with css animations');
563
- $module
564
- .transition({
565
- debug : settings.debug,
566
- verbose : settings.verbose,
567
- silent : settings.silent,
568
- animation : (settings.transition.showMethod || settings.transition) + ' in',
569
- queue : settings.queue,
570
- duration : settings.transition.showDuration || settings.duration,
571
- useFailSafe : true,
572
- onComplete : function() {
573
- settings.onVisible.apply(element);
574
- if(settings.keyboardShortcuts) {
575
- module.add.keyboardShortcuts();
576
- }
577
- module.save.focus();
578
- module.set.active();
579
- module.refreshInputs()
580
- if(settings.autofocus) {
581
- module.set.autofocus();
582
- }
583
- callback();
512
+ module.showModal(callback);
513
+ },
514
+
515
+ hide: function (callback) {
516
+ callback = isFunction(callback)
517
+ ? callback
518
+ : function () {};
519
+ module.refreshModals();
520
+
521
+ return module.hideModal(callback);
522
+ },
523
+
524
+ showModal: function (callback) {
525
+ callback = isFunction(callback)
526
+ ? callback
527
+ : function () {};
528
+ if (module.is.animating() || !module.is.active()) {
529
+ if (settings.onShow.call(element) === false) {
530
+ module.verbose('Show callback returned false cancelling show');
531
+
532
+ return;
533
+ }
534
+ hadScrollbar = module.has.scrollbar();
535
+ module.showDimmer();
536
+ module.cacheSizes();
537
+ if (hadScrollbar) {
538
+ module.set.bodyMargin();
539
+ }
540
+ if (module.can.useFlex()) {
541
+ module.remove.legacy();
542
+ } else {
543
+ module.set.legacy();
544
+ module.set.modalOffset();
545
+ module.debug('Using non-flex legacy modal positioning.');
546
+ }
547
+ module.set.screenHeight();
548
+ module.set.type();
549
+ module.set.clickaway();
550
+
551
+ if (!settings.allowMultiple && module.others.active()) {
552
+ module.hideOthers(module.showModal);
553
+ } else {
554
+ ignoreRepeatedEvents = false;
555
+ if (settings.allowMultiple) {
556
+ if (module.others.active()) {
557
+ $otherModals.filter('.' + className.active).find(selector.dimmer).addClass('active');
558
+ }
559
+
560
+ if (settings.detachable) {
561
+ $module.detach().appendTo($dimmer);
562
+ }
563
+ }
564
+ if (settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
565
+ module.debug('Showing modal with css animations');
566
+ $module
567
+ .transition({
568
+ debug: settings.debug,
569
+ verbose: settings.verbose,
570
+ silent: settings.silent,
571
+ animation: (settings.transition.showMethod || settings.transition) + ' in',
572
+ queue: settings.queue,
573
+ duration: settings.transition.showDuration || settings.duration,
574
+ useFailSafe: true,
575
+ onComplete: function () {
576
+ settings.onVisible.apply(element);
577
+ if (settings.keyboardShortcuts) {
578
+ module.add.keyboardShortcuts();
579
+ }
580
+ module.save.focus();
581
+ module.set.active();
582
+ module.refreshInputs();
583
+ if (settings.autofocus) {
584
+ module.set.autofocus();
585
+ }
586
+ callback();
587
+ },
588
+ })
589
+ ;
590
+ } else {
591
+ module.error(error.noTransition);
592
+ }
593
+ }
594
+ } else {
595
+ module.debug('Modal is already visible');
584
596
  }
585
- })
586
- ;
587
- }
588
- else {
589
- module.error(error.noTransition);
590
- }
591
- }
592
- }
593
- else {
594
- module.debug('Modal is already visible');
595
- }
596
- },
597
+ },
597
598
 
598
- hideModal: function(callback, keepDimmed, hideOthersToo) {
599
- var
600
- $previousModal = $otherModals.filter('.' + className.active).last()
601
- ;
602
- callback = isFunction(callback)
603
- ? callback
604
- : function(){}
605
- ;
606
- if(settings.onHide.call(element, $(this)) === false) {
607
- module.verbose('Hide callback returned false cancelling hide');
608
- ignoreRepeatedEvents = false;
609
- return false;
610
- }
611
-
612
- if( module.is.animating() || module.is.active() ) {
613
- module.debug('Hiding modal');
614
- if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
615
- module.remove.active();
616
- $module
617
- .transition({
618
- debug : settings.debug,
619
- verbose : settings.verbose,
620
- silent : settings.silent,
621
- animation : (settings.transition.hideMethod || settings.transition) + ' out',
622
- queue : settings.queue,
623
- duration : settings.transition.hideDuration || settings.duration,
624
- useFailSafe : true,
625
- onStart : function() {
626
- if(!module.others.active() && !module.others.animating() && !keepDimmed) {
627
- module.hideDimmer();
599
+ hideModal: function (callback, keepDimmed, hideOthersToo) {
600
+ var
601
+ $previousModal = $otherModals.filter('.' + className.active).last()
602
+ ;
603
+ callback = isFunction(callback)
604
+ ? callback
605
+ : function () {};
606
+ if (settings.onHide.call(element, $(this)) === false) {
607
+ module.verbose('Hide callback returned false cancelling hide');
608
+ ignoreRepeatedEvents = false;
609
+
610
+ return false;
628
611
  }
629
- if( settings.keyboardShortcuts && !module.others.active() ) {
630
- module.remove.keyboardShortcuts();
612
+
613
+ if (module.is.animating() || module.is.active()) {
614
+ module.debug('Hiding modal');
615
+ if (settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
616
+ module.remove.active();
617
+ $module
618
+ .transition({
619
+ debug: settings.debug,
620
+ verbose: settings.verbose,
621
+ silent: settings.silent,
622
+ animation: (settings.transition.hideMethod || settings.transition) + ' out',
623
+ queue: settings.queue,
624
+ duration: settings.transition.hideDuration || settings.duration,
625
+ useFailSafe: true,
626
+ onStart: function () {
627
+ if (!module.others.active() && !module.others.animating() && !keepDimmed) {
628
+ module.hideDimmer();
629
+ }
630
+ if (settings.keyboardShortcuts && !module.others.active()) {
631
+ module.remove.keyboardShortcuts();
632
+ }
633
+ },
634
+ onComplete: function () {
635
+ module.unbind.scrollLock();
636
+ if (settings.allowMultiple) {
637
+ $previousModal.addClass(className.front);
638
+ $module.removeClass(className.front);
639
+
640
+ if (hideOthersToo) {
641
+ $allModals.find(selector.dimmer).removeClass('active');
642
+ } else {
643
+ $previousModal.find(selector.dimmer).removeClass('active');
644
+ }
645
+ }
646
+ if (isFunction(settings.onHidden)) {
647
+ settings.onHidden.call(element);
648
+ }
649
+ module.remove.dimmerStyles();
650
+ module.restore.focus();
651
+ callback();
652
+ },
653
+ })
654
+ ;
655
+ } else {
656
+ module.error(error.noTransition);
657
+ }
631
658
  }
632
- },
633
- onComplete : function() {
634
- module.unbind.scrollLock();
635
- if ( settings.allowMultiple ) {
636
- $previousModal.addClass(className.front);
637
- $module.removeClass(className.front);
638
-
639
- if ( hideOthersToo ) {
640
- $allModals.find(selector.dimmer).removeClass('active');
641
- }
642
- else {
643
- $previousModal.find(selector.dimmer).removeClass('active');
644
- }
659
+ },
660
+
661
+ showDimmer: function () {
662
+ if ($dimmable.dimmer('is animating') || !$dimmable.dimmer('is active')) {
663
+ if (hadScrollbar) {
664
+ if (!isBody) {
665
+ $dimmer.css('top', $dimmable.scrollTop());
666
+ }
667
+ module.save.bodyMargin();
668
+ }
669
+ module.debug('Showing dimmer');
670
+ $dimmable.dimmer('show');
671
+ } else {
672
+ module.debug('Dimmer already visible');
645
673
  }
646
- if(isFunction(settings.onHidden)) {
647
- settings.onHidden.call(element);
674
+ },
675
+
676
+ hideDimmer: function () {
677
+ if ($dimmable.dimmer('is animating') || ($dimmable.dimmer('is active'))) {
678
+ module.unbind.scrollLock();
679
+ $dimmable.dimmer('hide', function () {
680
+ if (hadScrollbar) {
681
+ module.restore.bodyMargin();
682
+ }
683
+ module.remove.clickaway();
684
+ module.remove.screenHeight();
685
+ });
686
+ } else {
687
+ module.debug('Dimmer is not visible cannot hide');
648
688
  }
649
- module.remove.dimmerStyles();
650
- module.restore.focus();
651
- callback();
652
- }
653
- })
654
- ;
655
- }
656
- else {
657
- module.error(error.noTransition);
658
- }
659
- }
660
- },
689
+ },
661
690
 
662
- showDimmer: function() {
663
- if($dimmable.dimmer('is animating') || !$dimmable.dimmer('is active') ) {
664
- if(hadScrollbar) {
665
- if(!isBody) {
666
- $dimmer.css('top', $dimmable.scrollTop());
667
- }
668
- module.save.bodyMargin();
669
- }
670
- module.debug('Showing dimmer');
671
- $dimmable.dimmer('show');
672
- }
673
- else {
674
- module.debug('Dimmer already visible');
675
- }
676
- },
691
+ hideAll: function (callback) {
692
+ var
693
+ $visibleModals = $allModals.filter('.' + className.active + ', .' + className.animating)
694
+ ;
695
+ callback = isFunction(callback)
696
+ ? callback
697
+ : function () {};
698
+ if ($visibleModals.length > 0) {
699
+ module.debug('Hiding all visible modals');
700
+ var hideOk = true;
701
+ // check in reverse order trying to hide most top displayed modal first
702
+ $($visibleModals.get().reverse()).each(function (index, element) {
703
+ if (hideOk) {
704
+ hideOk = $(element).modal('hide modal', callback, false, true);
705
+ }
706
+ });
707
+ if (hideOk) {
708
+ module.hideDimmer();
709
+ }
710
+
711
+ return hideOk;
712
+ }
713
+ },
677
714
 
678
- hideDimmer: function() {
679
- if( $dimmable.dimmer('is animating') || ($dimmable.dimmer('is active')) ) {
680
- module.unbind.scrollLock();
681
- $dimmable.dimmer('hide', function() {
682
- if(hadScrollbar) {
683
- module.restore.bodyMargin();
684
- }
685
- module.remove.clickaway();
686
- module.remove.screenHeight();
687
- });
688
- }
689
- else {
690
- module.debug('Dimmer is not visible cannot hide');
691
- }
692
- },
715
+ hideOthers: function (callback) {
716
+ var
717
+ $visibleModals = $otherModals.filter('.' + className.active + ', .' + className.animating)
718
+ ;
719
+ callback = isFunction(callback)
720
+ ? callback
721
+ : function () {};
722
+ if ($visibleModals.length > 0) {
723
+ module.debug('Hiding other modals', $otherModals);
724
+ $visibleModals
725
+ .modal('hide modal', callback, true)
726
+ ;
727
+ }
728
+ },
729
+
730
+ others: {
731
+ active: function () {
732
+ return ($otherModals.filter('.' + className.active).length > 0);
733
+ },
734
+ animating: function () {
735
+ return ($otherModals.filter('.' + className.animating).length > 0);
736
+ },
737
+ },
738
+
739
+ add: {
740
+ keyboardShortcuts: function () {
741
+ module.verbose('Adding keyboard shortcuts');
742
+ $document
743
+ .on('keydown' + eventNamespace, module.event.keyboard)
744
+ ;
745
+ },
746
+ },
747
+
748
+ save: {
749
+ focus: function () {
750
+ var
751
+ $activeElement = $(document.activeElement),
752
+ inCurrentModal = $activeElement.closest($module).length > 0
753
+ ;
754
+ if (!inCurrentModal) {
755
+ $focusedElement = $(document.activeElement).trigger('blur');
756
+ }
757
+ },
758
+ bodyMargin: function () {
759
+ initialBodyMargin = $context.css((isBody ? 'margin-' : 'padding-') + (module.can.leftBodyScrollbar() ? 'left' : 'right'));
760
+ var
761
+ bodyMarginRightPixel = parseInt(initialBodyMargin.replace(/[^\d.]/g, '')),
762
+ bodyScrollbarWidth = isBody ? window.innerWidth - document.documentElement.clientWidth : $context[0].offsetWidth - $context[0].clientWidth
763
+ ;
764
+ tempBodyMargin = bodyMarginRightPixel + bodyScrollbarWidth;
765
+ },
766
+ },
693
767
 
694
- hideAll: function(callback) {
695
- var
696
- $visibleModals = $allModals.filter('.' + className.active + ', .' + className.animating)
697
- ;
698
- callback = isFunction(callback)
699
- ? callback
700
- : function(){}
701
- ;
702
- if( $visibleModals.length > 0 ) {
703
- module.debug('Hiding all visible modals');
704
- var hideOk = true;
705
- //check in reverse order trying to hide most top displayed modal first
706
- $($visibleModals.get().reverse()).each(function(index,element){
707
- if(hideOk){
708
- hideOk = $(element).modal('hide modal', callback, false, true);
768
+ restore: {
769
+ focus: function () {
770
+ if ($focusedElement && $focusedElement.length > 0 && settings.restoreFocus) {
771
+ $focusedElement.trigger('focus');
772
+ }
773
+ },
774
+ bodyMargin: function () {
775
+ var position = module.can.leftBodyScrollbar() ? 'left' : 'right';
776
+ $context.css((isBody ? 'margin-' : 'padding-') + position, initialBodyMargin);
777
+ $context.find(selector.bodyFixed.replace('right', position)).each(function () {
778
+ var
779
+ el = $(this),
780
+ attribute = el.css('position') === 'fixed' ? 'padding-' + position : position
781
+ ;
782
+ el.css(attribute, '');
783
+ });
784
+ },
785
+ },
786
+
787
+ remove: {
788
+ active: function () {
789
+ $module.removeClass(className.active);
790
+ },
791
+ legacy: function () {
792
+ $module.removeClass(className.legacy);
793
+ },
794
+ clickaway: function () {
795
+ if (!settings.detachable) {
796
+ $module
797
+ .off('mousedown' + elementEventNamespace)
798
+ ;
799
+ }
800
+ $dimmer
801
+ .off('mousedown' + elementEventNamespace)
802
+ ;
803
+ $dimmer
804
+ .off('mouseup' + elementEventNamespace)
805
+ ;
806
+ },
807
+ dimmerStyles: function () {
808
+ $dimmer.removeClass(className.inverted);
809
+ $dimmable.removeClass(className.blurring);
810
+ },
811
+ bodyStyle: function () {
812
+ if ($context.attr('style') === '') {
813
+ module.verbose('Removing style attribute');
814
+ $context.removeAttr('style');
815
+ }
816
+ },
817
+ screenHeight: function () {
818
+ module.debug('Removing page height');
819
+ $context
820
+ .css('height', '')
821
+ ;
822
+ module.remove.bodyStyle();
823
+ },
824
+ keyboardShortcuts: function () {
825
+ module.verbose('Removing keyboard shortcuts');
826
+ $document
827
+ .off('keydown' + eventNamespace)
828
+ ;
829
+ },
830
+ scrolling: function () {
831
+ if (!keepScrollingClass) {
832
+ $dimmable.removeClass(className.scrolling);
833
+ }
834
+ $module.removeClass(className.scrolling);
835
+ },
836
+ },
837
+
838
+ cacheSizes: function () {
839
+ $module.addClass(className.loading);
840
+ var
841
+ scrollHeight = $module.prop('scrollHeight'),
842
+ modalWidth = $module.outerWidth(),
843
+ modalHeight = $module.outerHeight()
844
+ ;
845
+ if (module.cache.pageHeight === undefined || modalHeight !== 0) {
846
+ $.extend(module.cache, {
847
+ pageHeight: $document.outerHeight(),
848
+ width: modalWidth,
849
+ height: modalHeight + settings.offset,
850
+ scrollHeight: scrollHeight + settings.offset,
851
+ contextHeight: isBody
852
+ ? $window.height()
853
+ : $dimmable.height(),
854
+ });
855
+ module.cache.topOffset = -(module.cache.height / 2);
856
+ }
857
+ $module.removeClass(className.loading);
858
+ module.debug('Caching modal and container sizes', module.cache);
859
+ },
860
+ helpers: {
861
+ deQuote: function (string) {
862
+ return String(string).replace(/"/g, '');
863
+ },
864
+ escape: function (string, preserveHTML) {
865
+ if (preserveHTML) {
866
+ return string;
867
+ }
868
+ var
869
+ badChars = /[<>"'`]/g,
870
+ shouldEscape = /[&<>"'`]/,
871
+ escape = {
872
+ '<': '&lt;',
873
+ '>': '&gt;',
874
+ '"': '&quot;',
875
+ "'": '&#x27;',
876
+ '`': '&#x60;',
877
+ },
878
+ escapedChar = function (chr) {
879
+ return escape[chr];
880
+ }
881
+ ;
882
+ if (shouldEscape.test(string)) {
883
+ string = string.replace(/&(?![a-z0-9#]{1,12};)/gi, '&amp;');
884
+
885
+ return string.replace(badChars, escapedChar);
886
+ }
887
+
888
+ return string;
889
+ },
890
+ },
891
+ can: {
892
+ leftBodyScrollbar: function () {
893
+ if (module.cache.leftBodyScrollbar === undefined) {
894
+ module.cache.leftBodyScrollbar = module.is.rtl() && ((module.is.iframe && !module.is.firefox()) || module.is.safari() || module.is.edge() || module.is.ie());
895
+ }
896
+
897
+ return module.cache.leftBodyScrollbar;
898
+ },
899
+ useFlex: function () {
900
+ if (settings.useFlex === 'auto') {
901
+ return settings.detachable && !module.is.ie();
902
+ }
903
+ if (settings.useFlex && module.is.ie()) {
904
+ module.debug('useFlex true is not supported in IE');
905
+ } else if (settings.useFlex && !settings.detachable) {
906
+ module.debug('useFlex true in combination with detachable false is not supported');
907
+ }
908
+
909
+ return settings.useFlex;
910
+ },
911
+ fit: function () {
912
+ var
913
+ contextHeight = module.cache.contextHeight,
914
+ verticalCenter = module.cache.contextHeight / 2,
915
+ topOffset = module.cache.topOffset,
916
+ scrollHeight = module.cache.scrollHeight,
917
+ height = module.cache.height,
918
+ paddingHeight = settings.padding,
919
+ startPosition = (verticalCenter + topOffset)
920
+ ;
921
+
922
+ return (scrollHeight > height)
923
+ ? (startPosition + scrollHeight + paddingHeight < contextHeight)
924
+ : (height + (paddingHeight * 2) < contextHeight);
925
+ },
926
+ },
927
+ has: {
928
+ configActions: function () {
929
+ return Array.isArray(settings.actions) && settings.actions.length > 0;
930
+ },
931
+ scrollbar: function () {
932
+ return isBody || $context.css('overflow-y') !== 'hidden';
933
+ },
934
+ },
935
+ is: {
936
+ active: function () {
937
+ return $module.hasClass(className.active);
938
+ },
939
+ ie: function () {
940
+ if (module.cache.isIE === undefined) {
941
+ var
942
+ isIE11 = (!(window.ActiveXObject) && 'ActiveXObject' in window),
943
+ isIE = ('ActiveXObject' in window)
944
+ ;
945
+ module.cache.isIE = (isIE11 || isIE);
946
+ }
947
+
948
+ return module.cache.isIE;
949
+ },
950
+ animating: function () {
951
+ return $module.transition('is supported')
952
+ ? $module.transition('is animating')
953
+ : $module.is(':visible');
954
+ },
955
+ scrolling: function () {
956
+ return $dimmable.hasClass(className.scrolling);
957
+ },
958
+ modernBrowser: function () {
959
+ // appName for IE11 reports 'Netscape' can no longer use
960
+ return !(window.ActiveXObject || 'ActiveXObject' in window);
961
+ },
962
+ rtl: function () {
963
+ if (module.cache.isRTL === undefined) {
964
+ module.cache.isRTL = $module.attr('dir') === 'rtl' || $module.css('direction') === 'rtl' || $body.attr('dir') === 'rtl' || $body.css('direction') === 'rtl' || $context.attr('dir') === 'rtl' || $context.css('direction') === 'rtl';
965
+ }
966
+
967
+ return module.cache.isRTL;
968
+ },
969
+ safari: function () {
970
+ if (module.cache.isSafari === undefined) {
971
+ module.cache.isSafari = /constructor/i.test(window.HTMLElement) || !!window.ApplePaySession;
972
+ }
973
+
974
+ return module.cache.isSafari;
975
+ },
976
+ edge: function () {
977
+ if (module.cache.isEdge === undefined) {
978
+ module.cache.isEdge = !!window.setImmediate && !module.is.ie();
979
+ }
980
+
981
+ return module.cache.isEdge;
982
+ },
983
+ firefox: function () {
984
+ if (module.cache.isFirefox === undefined) {
985
+ module.cache.isFirefox = !!window.InstallTrigger;
986
+ }
987
+
988
+ return module.cache.isFirefox;
989
+ },
990
+ iframe: function () {
991
+ return !(self === top);
992
+ },
993
+ },
994
+
995
+ set: {
996
+ autofocus: function () {
997
+ var
998
+ $autofocus = $inputs.filter('[autofocus]'),
999
+ $input = ($autofocus.length > 0)
1000
+ ? $autofocus.first()
1001
+ : ($inputs.length > 1 ? $inputs.filter(':not(i.close)') : $inputs).first()
1002
+ ;
1003
+ if ($input.length > 0) {
1004
+ $input.trigger('focus');
1005
+ }
1006
+ },
1007
+ bodyMargin: function () {
1008
+ var position = module.can.leftBodyScrollbar() ? 'left' : 'right';
1009
+ if (settings.detachable || module.can.fit()) {
1010
+ $context.css((isBody ? 'margin-' : 'padding-') + position, tempBodyMargin + 'px');
1011
+ }
1012
+ $context.find(selector.bodyFixed.replace('right', position)).each(function () {
1013
+ var
1014
+ el = $(this),
1015
+ attribute = el.css('position') === 'fixed' ? 'padding-' + position : position
1016
+ ;
1017
+ el.css(attribute, 'calc(' + el.css(attribute) + ' + ' + tempBodyMargin + 'px)');
1018
+ });
1019
+ },
1020
+ clickaway: function () {
1021
+ if (!settings.detachable) {
1022
+ $module
1023
+ .on('mousedown' + elementEventNamespace, module.event.mousedown)
1024
+ ;
1025
+ }
1026
+ $dimmer
1027
+ .on('mousedown' + elementEventNamespace, module.event.mousedown)
1028
+ ;
1029
+ $dimmer
1030
+ .on('mouseup' + elementEventNamespace, module.event.mouseup)
1031
+ ;
1032
+ },
1033
+ dimmerSettings: function () {
1034
+ if ($.fn.dimmer === undefined) {
1035
+ module.error(error.dimmer);
1036
+
1037
+ return;
1038
+ }
1039
+ var
1040
+ defaultSettings = {
1041
+ debug: settings.debug,
1042
+ dimmerName: 'modals',
1043
+ closable: 'auto',
1044
+ useFlex: module.can.useFlex(),
1045
+ duration: {
1046
+ show: settings.transition.showDuration || settings.duration,
1047
+ hide: settings.transition.hideDuration || settings.duration,
1048
+ },
1049
+ },
1050
+ dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings)
1051
+ ;
1052
+ if (settings.inverted) {
1053
+ dimmerSettings.variation = (dimmerSettings.variation !== undefined)
1054
+ ? dimmerSettings.variation + ' inverted'
1055
+ : 'inverted';
1056
+ }
1057
+ $context.dimmer('setting', dimmerSettings);
1058
+ },
1059
+ dimmerStyles: function () {
1060
+ if (settings.inverted) {
1061
+ $dimmer.addClass(className.inverted);
1062
+ } else {
1063
+ $dimmer.removeClass(className.inverted);
1064
+ }
1065
+ if (settings.blurring) {
1066
+ $dimmable.addClass(className.blurring);
1067
+ } else {
1068
+ $dimmable.removeClass(className.blurring);
1069
+ }
1070
+ },
1071
+ modalOffset: function () {
1072
+ if (!settings.detachable) {
1073
+ var canFit = module.can.fit();
1074
+ $module
1075
+ .css({
1076
+ top: (!$module.hasClass('aligned') && canFit)
1077
+ ? $document.scrollTop() + (module.cache.contextHeight - module.cache.height) / 2
1078
+ : !canFit || $module.hasClass('top')
1079
+ ? $document.scrollTop() + settings.padding
1080
+ : $document.scrollTop() + (module.cache.contextHeight - module.cache.height - settings.padding),
1081
+ marginLeft: -(module.cache.width / 2),
1082
+ })
1083
+ ;
1084
+ } else {
1085
+ $module
1086
+ .css({
1087
+ marginTop: (!$module.hasClass('aligned') && module.can.fit())
1088
+ ? -(module.cache.height / 2)
1089
+ : settings.padding / 2,
1090
+ marginLeft: -(module.cache.width / 2),
1091
+ })
1092
+ ;
1093
+ }
1094
+ module.verbose('Setting modal offset for legacy mode');
1095
+ },
1096
+ screenHeight: function () {
1097
+ if (module.can.fit()) {
1098
+ $context.css('height', '');
1099
+ } else if (!$module.hasClass('bottom')) {
1100
+ module.debug('Modal is taller than page content, resizing page height');
1101
+ $context
1102
+ .css('height', module.cache.height + (settings.padding * 2) + 'px')
1103
+ ;
1104
+ }
1105
+ },
1106
+ active: function () {
1107
+ $module.addClass(className.active + ' ' + className.front);
1108
+ $otherModals.filter('.' + className.active).removeClass(className.front);
1109
+ },
1110
+ scrolling: function () {
1111
+ $dimmable.addClass(className.scrolling);
1112
+ $module.addClass(className.scrolling);
1113
+ module.unbind.scrollLock();
1114
+ },
1115
+ legacy: function () {
1116
+ $module.addClass(className.legacy);
1117
+ },
1118
+ type: function () {
1119
+ if (module.can.fit()) {
1120
+ module.verbose('Modal fits on screen');
1121
+ if (!module.others.active() && !module.others.animating()) {
1122
+ module.remove.scrolling();
1123
+ module.bind.scrollLock();
1124
+ }
1125
+ } else if (!$module.hasClass('bottom')) {
1126
+ module.verbose('Modal cannot fit on screen setting to scrolling');
1127
+ module.set.scrolling();
1128
+ } else {
1129
+ module.verbose('Bottom aligned modal not fitting on screen is unsupported for scrolling');
1130
+ }
1131
+ },
1132
+ undetached: function () {
1133
+ $dimmable.addClass(className.undetached);
1134
+ },
1135
+ },
1136
+
1137
+ setting: function (name, value) {
1138
+ module.debug('Changing setting', name, value);
1139
+ if ($.isPlainObject(name)) {
1140
+ $.extend(true, settings, name);
1141
+ } else if (value !== undefined) {
1142
+ if ($.isPlainObject(settings[name])) {
1143
+ $.extend(true, settings[name], value);
1144
+ } else {
1145
+ settings[name] = value;
1146
+ }
1147
+ } else {
1148
+ return settings[name];
1149
+ }
1150
+ },
1151
+ internal: function (name, value) {
1152
+ if ($.isPlainObject(name)) {
1153
+ $.extend(true, module, name);
1154
+ } else if (value !== undefined) {
1155
+ module[name] = value;
1156
+ } else {
1157
+ return module[name];
1158
+ }
1159
+ },
1160
+ debug: function () {
1161
+ if (!settings.silent && settings.debug) {
1162
+ if (settings.performance) {
1163
+ module.performance.log(arguments);
1164
+ } else {
1165
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
1166
+ module.debug.apply(console, arguments);
1167
+ }
1168
+ }
1169
+ },
1170
+ verbose: function () {
1171
+ if (!settings.silent && settings.verbose && settings.debug) {
1172
+ if (settings.performance) {
1173
+ module.performance.log(arguments);
1174
+ } else {
1175
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
1176
+ module.verbose.apply(console, arguments);
1177
+ }
1178
+ }
1179
+ },
1180
+ error: function () {
1181
+ if (!settings.silent) {
1182
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
1183
+ module.error.apply(console, arguments);
1184
+ }
1185
+ },
1186
+ performance: {
1187
+ log: function (message) {
1188
+ var
1189
+ currentTime,
1190
+ executionTime,
1191
+ previousTime
1192
+ ;
1193
+ if (settings.performance) {
1194
+ currentTime = new Date().getTime();
1195
+ previousTime = time || currentTime;
1196
+ executionTime = currentTime - previousTime;
1197
+ time = currentTime;
1198
+ performance.push({
1199
+ Name: message[0],
1200
+ Arguments: [].slice.call(message, 1) || '',
1201
+ Element: element,
1202
+ 'Execution Time': executionTime,
1203
+ });
1204
+ }
1205
+ clearTimeout(module.performance.timer);
1206
+ module.performance.timer = setTimeout(module.performance.display, 500);
1207
+ },
1208
+ display: function () {
1209
+ var
1210
+ title = settings.name + ':',
1211
+ totalTime = 0
1212
+ ;
1213
+ time = false;
1214
+ clearTimeout(module.performance.timer);
1215
+ $.each(performance, function (index, data) {
1216
+ totalTime += data['Execution Time'];
1217
+ });
1218
+ title += ' ' + totalTime + 'ms';
1219
+ if (moduleSelector) {
1220
+ title += ' \'' + moduleSelector + '\'';
1221
+ }
1222
+ if ((console.group !== undefined || console.table !== undefined) && performance.length > 0) {
1223
+ console.groupCollapsed(title);
1224
+ if (console.table) {
1225
+ console.table(performance);
1226
+ } else {
1227
+ $.each(performance, function (index, data) {
1228
+ console.log(data.Name + ': ' + data['Execution Time'] + 'ms');
1229
+ });
1230
+ }
1231
+ console.groupEnd();
1232
+ }
1233
+ performance = [];
1234
+ },
1235
+ },
1236
+ invoke: function (query, passedArguments, context) {
1237
+ var
1238
+ object = instance,
1239
+ maxDepth,
1240
+ found,
1241
+ response
1242
+ ;
1243
+ passedArguments = passedArguments || queryArguments;
1244
+ context = context || element;
1245
+ if (typeof query == 'string' && object !== undefined) {
1246
+ query = query.split(/[\. ]/);
1247
+ maxDepth = query.length - 1;
1248
+ $.each(query, function (depth, value) {
1249
+ var camelCaseValue = (depth != maxDepth)
1250
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
1251
+ : query;
1252
+ if ($.isPlainObject(object[camelCaseValue]) && (depth != maxDepth)) {
1253
+ object = object[camelCaseValue];
1254
+ } else if (object[camelCaseValue] !== undefined) {
1255
+ found = object[camelCaseValue];
1256
+
1257
+ return false;
1258
+ } else if ($.isPlainObject(object[value]) && (depth != maxDepth)) {
1259
+ object = object[value];
1260
+ } else if (object[value] !== undefined) {
1261
+ found = object[value];
1262
+
1263
+ return false;
1264
+ } else {
1265
+ return false;
1266
+ }
1267
+ });
1268
+ }
1269
+ if (isFunction(found)) {
1270
+ response = found.apply(context, passedArguments);
1271
+ } else if (found !== undefined) {
1272
+ response = found;
1273
+ }
1274
+ if (Array.isArray(returnedValue)) {
1275
+ returnedValue.push(response);
1276
+ } else if (returnedValue !== undefined) {
1277
+ returnedValue = [returnedValue, response];
1278
+ } else if (response !== undefined) {
1279
+ returnedValue = response;
1280
+ }
1281
+
1282
+ return found;
1283
+ },
1284
+ };
1285
+
1286
+ if (methodInvoked) {
1287
+ if (instance === undefined) {
1288
+ if (isFunction(settings.templates[query])) {
1289
+ settings.autoShow = true;
1290
+ settings.className.modal = settings.className.template;
1291
+ settings = $.extend(true, {}, settings, settings.templates[query].apply(module, queryArguments));
1292
+
1293
+ // reassign shortcuts
1294
+ className = settings.className;
1295
+ namespace = settings.namespace;
1296
+ fields = settings.fields;
1297
+ error = settings.error;
1298
+ }
1299
+ module.initialize();
709
1300
  }
710
- });
711
- if(hideOk) {
712
- module.hideDimmer();
1301
+ if (!isFunction(settings.templates[query])) {
1302
+ module.invoke(query);
1303
+ }
1304
+ } else {
1305
+ if (instance !== undefined) {
1306
+ instance.invoke('destroy');
1307
+ }
1308
+ module.initialize();
1309
+ returnedValue = $module;
713
1310
  }
714
- return hideOk;
715
- }
716
- },
1311
+ });
717
1312
 
718
- hideOthers: function(callback) {
719
- var
720
- $visibleModals = $otherModals.filter('.' + className.active + ', .' + className.animating)
721
- ;
722
- callback = isFunction(callback)
723
- ? callback
724
- : function(){}
725
- ;
726
- if( $visibleModals.length > 0 ) {
727
- module.debug('Hiding other modals', $otherModals);
728
- $visibleModals
729
- .modal('hide modal', callback, true)
730
- ;
731
- }
1313
+ return (returnedValue !== undefined)
1314
+ ? returnedValue
1315
+ : this;
1316
+ };
1317
+
1318
+ $.fn.modal.settings = {
1319
+
1320
+ name: 'Modal',
1321
+ namespace: 'modal',
1322
+
1323
+ useFlex: 'auto',
1324
+ offset: 0,
1325
+
1326
+ silent: false,
1327
+ debug: false,
1328
+ verbose: false,
1329
+ performance: true,
1330
+
1331
+ observeChanges: false,
1332
+
1333
+ allowMultiple: false,
1334
+ detachable: true,
1335
+ closable: true,
1336
+ autofocus: true,
1337
+ restoreFocus: true,
1338
+ autoShow: false,
1339
+
1340
+ inverted: false,
1341
+ blurring: false,
1342
+
1343
+ centered: true,
1344
+
1345
+ dimmerSettings: {
1346
+ closable: false,
1347
+ useCSS: true,
732
1348
  },
733
1349
 
734
- others: {
735
- active: function() {
736
- return ($otherModals.filter('.' + className.active).length > 0);
737
- },
738
- animating: function() {
739
- return ($otherModals.filter('.' + className.animating).length > 0);
740
- }
1350
+ // whether to use keyboard shortcuts
1351
+ keyboardShortcuts: true,
1352
+
1353
+ context: 'body',
1354
+
1355
+ queue: false,
1356
+ duration: 500,
1357
+ transition: 'scale',
1358
+
1359
+ // padding with edge of page
1360
+ padding: 50,
1361
+ scrollbarWidth: 10,
1362
+
1363
+ // dynamic content
1364
+ title: '',
1365
+ content: '',
1366
+ class: '',
1367
+ classTitle: '',
1368
+ classContent: '',
1369
+ classActions: '',
1370
+ closeIcon: false,
1371
+ actions: false,
1372
+ preserveHTML: true,
1373
+
1374
+ fields: {
1375
+ class: 'class',
1376
+ text: 'text',
1377
+ icon: 'icon',
1378
+ click: 'click',
741
1379
  },
742
1380
 
1381
+ // called before show animation
1382
+ onShow: function () {},
743
1383
 
744
- add: {
745
- keyboardShortcuts: function() {
746
- module.verbose('Adding keyboard shortcuts');
747
- $document
748
- .on('keydown' + eventNamespace, module.event.keyboard)
749
- ;
750
- }
1384
+ // called after show animation
1385
+ onVisible: function () {},
1386
+
1387
+ // called before hide animation
1388
+ onHide: function () {
1389
+ return true;
751
1390
  },
752
1391
 
753
- save: {
754
- focus: function() {
755
- var
756
- $activeElement = $(document.activeElement),
757
- inCurrentModal = $activeElement.closest($module).length > 0
758
- ;
759
- if(!inCurrentModal) {
760
- $focusedElement = $(document.activeElement).trigger('blur');
761
- }
762
- },
763
- bodyMargin: function() {
764
- initialBodyMargin = $context.css((isBody ? 'margin-':'padding-')+(module.can.leftBodyScrollbar() ? 'left':'right'));
765
- var bodyMarginRightPixel = parseInt(initialBodyMargin.replace(/[^\d.]/g, '')),
766
- bodyScrollbarWidth = isBody ? window.innerWidth - document.documentElement.clientWidth : $context[0].offsetWidth - $context[0].clientWidth;
767
- tempBodyMargin = bodyMarginRightPixel + bodyScrollbarWidth;
768
- }
1392
+ // called after hide animation
1393
+ onHidden: false,
1394
+
1395
+ // called after approve selector match
1396
+ onApprove: function () {
1397
+ return true;
769
1398
  },
770
1399
 
771
- restore: {
772
- focus: function() {
773
- if($focusedElement && $focusedElement.length > 0 && settings.restoreFocus) {
774
- $focusedElement.trigger('focus');
775
- }
776
- },
777
- bodyMargin: function() {
778
- var position = module.can.leftBodyScrollbar() ? 'left':'right';
779
- $context.css((isBody ? 'margin-':'padding-')+position, initialBodyMargin);
780
- $context.find(selector.bodyFixed.replace('right',position)).each(function(){
781
- var el = $(this),
782
- attribute = el.css('position') === 'fixed' ? 'padding-'+position : position
783
- ;
784
- el.css(attribute, '');
785
- });
786
- }
1400
+ // called after deny selector match
1401
+ onDeny: function () {
1402
+ return true;
787
1403
  },
788
1404
 
789
- remove: {
790
- active: function() {
791
- $module.removeClass(className.active);
792
- },
793
- legacy: function() {
794
- $module.removeClass(className.legacy);
795
- },
796
- clickaway: function() {
797
- if (!settings.detachable) {
798
- $module
799
- .off('mousedown' + elementEventNamespace)
800
- ;
801
- }
802
- $dimmer
803
- .off('mousedown' + elementEventNamespace)
804
- ;
805
- $dimmer
806
- .off('mouseup' + elementEventNamespace)
807
- ;
808
- },
809
- dimmerStyles: function() {
810
- $dimmer.removeClass(className.inverted);
811
- $dimmable.removeClass(className.blurring);
812
- },
813
- bodyStyle: function() {
814
- if($context.attr('style') === '') {
815
- module.verbose('Removing style attribute');
816
- $context.removeAttr('style');
817
- }
818
- },
819
- screenHeight: function() {
820
- module.debug('Removing page height');
821
- $context
822
- .css('height', '')
823
- ;
824
- module.remove.bodyStyle()
825
- },
826
- keyboardShortcuts: function() {
827
- module.verbose('Removing keyboard shortcuts');
828
- $document
829
- .off('keydown' + eventNamespace)
830
- ;
831
- },
832
- scrolling: function() {
833
- if(!keepScrollingClass) {
834
- $dimmable.removeClass(className.scrolling);
835
- }
836
- $module.removeClass(className.scrolling);
837
- }
1405
+ keys: {
1406
+ space: 32,
1407
+ enter: 13,
1408
+ escape: 27,
1409
+ tab: 9,
838
1410
  },
839
1411
 
840
- cacheSizes: function() {
841
- $module.addClass(className.loading);
842
- var
843
- scrollHeight = $module.prop('scrollHeight'),
844
- modalWidth = $module.outerWidth(),
845
- modalHeight = $module.outerHeight()
846
- ;
847
- if(module.cache.pageHeight === undefined || modalHeight !== 0) {
848
- $.extend(module.cache, {
849
- pageHeight : $document.outerHeight(),
850
- width : modalWidth,
851
- height : modalHeight + settings.offset,
852
- scrollHeight : scrollHeight + settings.offset,
853
- contextHeight : isBody
854
- ? $window.height()
855
- : $dimmable.height(),
856
- });
857
- module.cache.topOffset = -(module.cache.height / 2);
858
- }
859
- $module.removeClass(className.loading);
860
- module.debug('Caching modal and container sizes', module.cache);
1412
+ selector: {
1413
+ title: '> .header',
1414
+ content: '> .content',
1415
+ actions: '> .actions',
1416
+ close: '> .close',
1417
+ closeIcon: '> .close',
1418
+ approve: '.actions .positive, .actions .approve, .actions .ok',
1419
+ deny: '.actions .negative, .actions .deny, .actions .cancel',
1420
+ modal: '.ui.modal',
1421
+ dimmer: '> .ui.dimmer',
1422
+ bodyFixed: '> .ui.fixed.menu, > .ui.right.toast-container, > .ui.right.sidebar, > .ui.fixed.nag, > .ui.fixed.nag > .close',
1423
+ prompt: '.ui.input > input',
861
1424
  },
862
- helpers: {
863
- deQuote: function(string) {
864
- return String(string).replace(/"/g,"");
865
- },
866
- escape: function(string, preserveHTML) {
867
- if (preserveHTML){
868
- return string;
869
- }
870
- var
871
- badChars = /[<>"'`]/g,
872
- shouldEscape = /[&<>"'`]/,
873
- escape = {
874
- "<": "&lt;",
875
- ">": "&gt;",
876
- '"': "&quot;",
877
- "'": "&#x27;",
878
- "`": "&#x60;"
879
- },
880
- escapedChar = function(chr) {
881
- return escape[chr];
882
- }
883
- ;
884
- if(shouldEscape.test(string)) {
885
- string = string.replace(/&(?![a-z0-9#]{1,12};)/gi, "&amp;");
886
- return string.replace(badChars, escapedChar);
887
- }
888
- return string;
889
- }
1425
+ error: {
1426
+ dimmer: 'UI Dimmer, a required component is not included in this page',
1427
+ method: 'The method you called is not defined.',
1428
+ notFound: 'The element you specified could not be found',
890
1429
  },
891
- can: {
892
- leftBodyScrollbar: function(){
893
- if(module.cache.leftBodyScrollbar === undefined) {
894
- module.cache.leftBodyScrollbar = module.is.rtl() && ((module.is.iframe && !module.is.firefox()) || module.is.safari() || module.is.edge() || module.is.ie());
895
- }
896
- return module.cache.leftBodyScrollbar;
897
- },
898
- useFlex: function() {
899
- if (settings.useFlex === 'auto') {
900
- return settings.detachable && !module.is.ie();
901
- }
902
- if(settings.useFlex && module.is.ie()) {
903
- module.debug('useFlex true is not supported in IE');
904
- } else if(settings.useFlex && !settings.detachable) {
905
- module.debug('useFlex true in combination with detachable false is not supported');
906
- }
907
- return settings.useFlex;
908
- },
909
- fit: function() {
910
- var
911
- contextHeight = module.cache.contextHeight,
912
- verticalCenter = module.cache.contextHeight / 2,
913
- topOffset = module.cache.topOffset,
914
- scrollHeight = module.cache.scrollHeight,
915
- height = module.cache.height,
916
- paddingHeight = settings.padding,
917
- startPosition = (verticalCenter + topOffset)
918
- ;
919
- return (scrollHeight > height)
920
- ? (startPosition + scrollHeight + paddingHeight < contextHeight)
921
- : (height + (paddingHeight * 2) < contextHeight)
922
- ;
923
- }
1430
+ className: {
1431
+ active: 'active',
1432
+ animating: 'animating',
1433
+ blurring: 'blurring',
1434
+ inverted: 'inverted',
1435
+ legacy: 'legacy',
1436
+ loading: 'loading',
1437
+ scrolling: 'scrolling',
1438
+ undetached: 'undetached',
1439
+ front: 'front',
1440
+ close: 'close icon',
1441
+ button: 'ui button',
1442
+ modal: 'ui modal',
1443
+ title: 'header',
1444
+ content: 'content',
1445
+ actions: 'actions',
1446
+ template: 'ui tiny modal',
1447
+ ok: 'positive',
1448
+ cancel: 'negative',
1449
+ prompt: 'ui fluid input',
1450
+ innerDimmer: 'ui inverted dimmer',
924
1451
  },
925
- has: {
926
- configActions: function () {
927
- return Array.isArray(settings.actions) && settings.actions.length > 0;
928
- },
929
- scrollbar: function() {
930
- return isBody || $context.css('overflow-y') !== 'hidden';
931
- }
1452
+ text: {
1453
+ ok: 'Ok',
1454
+ cancel: 'Cancel',
1455
+ close: 'Close',
932
1456
  },
933
- is: {
934
- active: function() {
935
- return $module.hasClass(className.active);
936
- },
937
- ie: function() {
938
- if(module.cache.isIE === undefined) {
939
- var
940
- isIE11 = (!(window.ActiveXObject) && 'ActiveXObject' in window),
941
- isIE = ('ActiveXObject' in window)
942
- ;
943
- module.cache.isIE = (isIE11 || isIE);
944
- }
945
- return module.cache.isIE;
946
- },
947
- animating: function() {
948
- return $module.transition('is supported')
949
- ? $module.transition('is animating')
950
- : $module.is(':visible')
951
- ;
952
- },
953
- scrolling: function() {
954
- return $dimmable.hasClass(className.scrolling);
955
- },
956
- modernBrowser: function() {
957
- // appName for IE11 reports 'Netscape' can no longer use
958
- return !(window.ActiveXObject || 'ActiveXObject' in window);
959
- },
960
- rtl: function() {
961
- if(module.cache.isRTL === undefined) {
962
- module.cache.isRTL = $module.attr('dir') === 'rtl' || $module.css('direction') === 'rtl' || $body.attr('dir') === 'rtl' || $body.css('direction') === 'rtl' || $context.attr('dir') === 'rtl' || $context.css('direction') === 'rtl';
963
- }
964
- return module.cache.isRTL;
965
- },
966
- safari: function() {
967
- if(module.cache.isSafari === undefined) {
968
- module.cache.isSafari = /constructor/i.test(window.HTMLElement) || !!window.ApplePaySession;
969
- }
970
- return module.cache.isSafari;
971
- },
972
- edge: function(){
973
- if(module.cache.isEdge === undefined) {
974
- module.cache.isEdge = !!window.setImmediate && !module.is.ie();
975
- }
976
- return module.cache.isEdge;
977
- },
978
- firefox: function(){
979
- if(module.cache.isFirefox === undefined) {
980
- module.cache.isFirefox = !!window.InstallTrigger;
1457
+ };
1458
+
1459
+ $.fn.modal.settings.templates = {
1460
+ getArguments: function (args) {
1461
+ var queryArguments = [].slice.call(args);
1462
+ if ($.isPlainObject(queryArguments[0])) {
1463
+ return $.extend({
1464
+ handler: function () {},
1465
+ content: '',
1466
+ title: '',
1467
+ }, queryArguments[0]);
1468
+ } else {
1469
+ if (!isFunction(queryArguments[queryArguments.length - 1])) {
1470
+ queryArguments.push(function () {});
1471
+ }
1472
+
1473
+ return {
1474
+ handler: queryArguments.pop(),
1475
+ content: queryArguments.pop() || '',
1476
+ title: queryArguments.pop() || '',
1477
+ };
981
1478
  }
982
- return module.cache.isFirefox;
983
- },
984
- iframe: function() {
985
- return !(self === top);
986
- }
987
1479
  },
988
-
989
- set: {
990
- autofocus: function() {
1480
+ alert: function () {
991
1481
  var
992
- $autofocus = $inputs.filter('[autofocus]'),
993
- $input = ($autofocus.length > 0)
994
- ? $autofocus.first()
995
- : ($inputs.length > 1 ? $inputs.filter(':not(i.close)') : $inputs).first()
1482
+ settings = this.get.settings(),
1483
+ args = settings.templates.getArguments(arguments),
1484
+ approveFn = args.handler
996
1485
  ;
997
- if($input.length > 0) {
998
- $input.trigger('focus');
999
- }
1000
- },
1001
- bodyMargin: function() {
1002
- var position = module.can.leftBodyScrollbar() ? 'left':'right';
1003
- if(settings.detachable || module.can.fit()) {
1004
- $context.css((isBody ? 'margin-':'padding-')+position, tempBodyMargin + 'px');
1005
- }
1006
- $context.find(selector.bodyFixed.replace('right',position)).each(function(){
1007
- var el = $(this),
1008
- attribute = el.css('position') === 'fixed' ? 'padding-'+position : position
1009
- ;
1010
- el.css(attribute, 'calc(' + el.css(attribute) + ' + ' + tempBodyMargin + 'px)');
1011
- });
1012
- },
1013
- clickaway: function() {
1014
- if (!settings.detachable) {
1015
- $module
1016
- .on('mousedown' + elementEventNamespace, module.event.mousedown)
1017
- ;
1018
- }
1019
- $dimmer
1020
- .on('mousedown' + elementEventNamespace, module.event.mousedown)
1021
- ;
1022
- $dimmer
1023
- .on('mouseup' + elementEventNamespace, module.event.mouseup)
1024
- ;
1025
- },
1026
- dimmerSettings: function() {
1027
- if($.fn.dimmer === undefined) {
1028
- module.error(error.dimmer);
1029
- return;
1030
- }
1486
+
1487
+ return {
1488
+ title: args.title,
1489
+ content: args.content,
1490
+ onApprove: approveFn,
1491
+ actions: [{
1492
+ text: settings.text.ok,
1493
+ class: settings.className.ok,
1494
+ click: approveFn,
1495
+ }],
1496
+ };
1497
+ },
1498
+ confirm: function () {
1031
1499
  var
1032
- defaultSettings = {
1033
- debug : settings.debug,
1034
- dimmerName : 'modals',
1035
- closable : 'auto',
1036
- useFlex : module.can.useFlex(),
1037
- duration : {
1038
- show : settings.transition.showDuration || settings.duration,
1039
- hide : settings.transition.hideDuration || settings.duration
1500
+ settings = this.get.settings(),
1501
+ args = settings.templates.getArguments(arguments),
1502
+ approveFn = function () {
1503
+ args.handler(true);
1504
+ },
1505
+ denyFn = function () {
1506
+ args.handler(false);
1040
1507
  }
1041
- },
1042
- dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings)
1043
1508
  ;
1044
- if(settings.inverted) {
1045
- dimmerSettings.variation = (dimmerSettings.variation !== undefined)
1046
- ? dimmerSettings.variation + ' inverted'
1047
- : 'inverted'
1048
- ;
1049
- }
1050
- $context.dimmer('setting', dimmerSettings);
1051
- },
1052
- dimmerStyles: function() {
1053
- if(settings.inverted) {
1054
- $dimmer.addClass(className.inverted);
1055
- }
1056
- else {
1057
- $dimmer.removeClass(className.inverted);
1058
- }
1059
- if(settings.blurring) {
1060
- $dimmable.addClass(className.blurring);
1061
- }
1062
- else {
1063
- $dimmable.removeClass(className.blurring);
1064
- }
1065
- },
1066
- modalOffset: function() {
1067
- if (!settings.detachable) {
1068
- var canFit = module.can.fit();
1069
- $module
1070
- .css({
1071
- top: (!$module.hasClass('aligned') && canFit)
1072
- ? $document.scrollTop() + (module.cache.contextHeight - module.cache.height) / 2
1073
- : !canFit || $module.hasClass('top')
1074
- ? $document.scrollTop() + settings.padding
1075
- : $document.scrollTop() + (module.cache.contextHeight - module.cache.height - settings.padding),
1076
- marginLeft: -(module.cache.width / 2)
1077
- })
1078
- ;
1079
- } else {
1080
- $module
1081
- .css({
1082
- marginTop: (!$module.hasClass('aligned') && module.can.fit())
1083
- ? -(module.cache.height / 2)
1084
- : settings.padding / 2,
1085
- marginLeft: -(module.cache.width / 2)
1086
- })
1087
- ;
1088
- }
1089
- module.verbose('Setting modal offset for legacy mode');
1090
- },
1091
- screenHeight: function() {
1092
- if( module.can.fit() ) {
1093
- $context.css('height', '');
1094
- }
1095
- else if(!$module.hasClass('bottom')) {
1096
- module.debug('Modal is taller than page content, resizing page height');
1097
- $context
1098
- .css('height', module.cache.height + (settings.padding * 2) + 'px')
1099
- ;
1100
- }
1101
- },
1102
- active: function() {
1103
- $module.addClass(className.active + ' ' + className.front);
1104
- $otherModals.filter('.' + className.active).removeClass(className.front);
1105
- },
1106
- scrolling: function() {
1107
- $dimmable.addClass(className.scrolling);
1108
- $module.addClass(className.scrolling);
1109
- module.unbind.scrollLock();
1110
- },
1111
- legacy: function() {
1112
- $module.addClass(className.legacy);
1113
- },
1114
- type: function() {
1115
- if(module.can.fit()) {
1116
- module.verbose('Modal fits on screen');
1117
- if(!module.others.active() && !module.others.animating()) {
1118
- module.remove.scrolling();
1119
- module.bind.scrollLock();
1120
- }
1121
- }
1122
- else if (!$module.hasClass('bottom')){
1123
- module.verbose('Modal cannot fit on screen setting to scrolling');
1124
- module.set.scrolling();
1125
- } else {
1126
- module.verbose('Bottom aligned modal not fitting on screen is unsupported for scrolling');
1127
- }
1128
- },
1129
- undetached: function() {
1130
- $dimmable.addClass(className.undetached);
1131
- }
1132
- },
1133
1509
 
1134
- setting: function(name, value) {
1135
- module.debug('Changing setting', name, value);
1136
- if( $.isPlainObject(name) ) {
1137
- $.extend(true, settings, name);
1138
- }
1139
- else if(value !== undefined) {
1140
- if($.isPlainObject(settings[name])) {
1141
- $.extend(true, settings[name], value);
1142
- }
1143
- else {
1144
- settings[name] = value;
1145
- }
1146
- }
1147
- else {
1148
- return settings[name];
1149
- }
1150
- },
1151
- internal: function(name, value) {
1152
- if( $.isPlainObject(name) ) {
1153
- $.extend(true, module, name);
1154
- }
1155
- else if(value !== undefined) {
1156
- module[name] = value;
1157
- }
1158
- else {
1159
- return module[name];
1160
- }
1161
- },
1162
- debug: function() {
1163
- if(!settings.silent && settings.debug) {
1164
- if(settings.performance) {
1165
- module.performance.log(arguments);
1166
- }
1167
- else {
1168
- module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
1169
- module.debug.apply(console, arguments);
1170
- }
1171
- }
1172
- },
1173
- verbose: function() {
1174
- if(!settings.silent && settings.verbose && settings.debug) {
1175
- if(settings.performance) {
1176
- module.performance.log(arguments);
1177
- }
1178
- else {
1179
- module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
1180
- module.verbose.apply(console, arguments);
1181
- }
1182
- }
1510
+ return {
1511
+ title: args.title,
1512
+ content: args.content,
1513
+ onApprove: approveFn,
1514
+ onDeny: denyFn,
1515
+ actions: [{
1516
+ text: settings.text.ok,
1517
+ class: settings.className.ok,
1518
+ click: approveFn,
1519
+ }, {
1520
+ text: settings.text.cancel,
1521
+ class: settings.className.cancel,
1522
+ click: denyFn,
1523
+ }],
1524
+ };
1183
1525
  },
1184
- error: function() {
1185
- if(!settings.silent) {
1186
- module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
1187
- module.error.apply(console, arguments);
1188
- }
1189
- },
1190
- performance: {
1191
- log: function(message) {
1192
- var
1193
- currentTime,
1194
- executionTime,
1195
- previousTime
1196
- ;
1197
- if(settings.performance) {
1198
- currentTime = new Date().getTime();
1199
- previousTime = time || currentTime;
1200
- executionTime = currentTime - previousTime;
1201
- time = currentTime;
1202
- performance.push({
1203
- 'Name' : message[0],
1204
- 'Arguments' : [].slice.call(message, 1) || '',
1205
- 'Element' : element,
1206
- 'Execution Time' : executionTime
1207
- });
1208
- }
1209
- clearTimeout(module.performance.timer);
1210
- module.performance.timer = setTimeout(module.performance.display, 500);
1211
- },
1212
- display: function() {
1526
+ prompt: function () {
1213
1527
  var
1214
- title = settings.name + ':',
1215
- totalTime = 0
1528
+ $this = this,
1529
+ settings = this.get.settings(),
1530
+ args = settings.templates.getArguments(arguments),
1531
+ input = $($.parseHTML(args.content)).filter('.ui.input'),
1532
+ approveFn = function () {
1533
+ var
1534
+ settings = $this.get.settings(),
1535
+ inputField = $this.get.element().find(settings.selector.prompt)[0]
1536
+ ;
1537
+ args.handler($(inputField).val());
1538
+ },
1539
+ denyFn = function () {
1540
+ args.handler(null);
1541
+ }
1216
1542
  ;
1217
- time = false;
1218
- clearTimeout(module.performance.timer);
1219
- $.each(performance, function(index, data) {
1220
- totalTime += data['Execution Time'];
1221
- });
1222
- title += ' ' + totalTime + 'ms';
1223
- if(moduleSelector) {
1224
- title += ' \'' + moduleSelector + '\'';
1225
- }
1226
- if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
1227
- console.groupCollapsed(title);
1228
- if(console.table) {
1229
- console.table(performance);
1230
- }
1231
- else {
1232
- $.each(performance, function(index, data) {
1233
- console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
1234
- });
1235
- }
1236
- console.groupEnd();
1237
- }
1238
- performance = [];
1239
- }
1543
+ if (input.length === 0) {
1544
+ args.content += '<p><div class="' + this.helpers.deQuote(settings.className.prompt) + '"><input placeholder="' + this.helpers.deQuote(args.placeholder || '') + '" type="text" value="' + this.helpers.deQuote(args.defaultValue || '') + '"></div></p>';
1545
+ }
1546
+
1547
+ return {
1548
+ title: args.title,
1549
+ content: args.content,
1550
+ onApprove: approveFn,
1551
+ onDeny: denyFn,
1552
+ actions: [{
1553
+ text: settings.text.ok,
1554
+ class: settings.className.ok,
1555
+ click: approveFn,
1556
+ }, {
1557
+ text: settings.text.cancel,
1558
+ class: settings.className.cancel,
1559
+ click: denyFn,
1560
+ }],
1561
+ };
1240
1562
  },
1241
- invoke: function(query, passedArguments, context) {
1242
- var
1243
- object = instance,
1244
- maxDepth,
1245
- found,
1246
- response
1247
- ;
1248
- passedArguments = passedArguments || queryArguments;
1249
- context = context || element;
1250
- if(typeof query == 'string' && object !== undefined) {
1251
- query = query.split(/[\. ]/);
1252
- maxDepth = query.length - 1;
1253
- $.each(query, function(depth, value) {
1254
- var camelCaseValue = (depth != maxDepth)
1255
- ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
1256
- : query
1257
- ;
1258
- if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
1259
- object = object[camelCaseValue];
1260
- }
1261
- else if( object[camelCaseValue] !== undefined ) {
1262
- found = object[camelCaseValue];
1263
- return false;
1264
- }
1265
- else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
1266
- object = object[value];
1267
- }
1268
- else if( object[value] !== undefined ) {
1269
- found = object[value];
1270
- return false;
1271
- }
1272
- else {
1273
- return false;
1274
- }
1275
- });
1276
- }
1277
- if ( isFunction( found ) ) {
1278
- response = found.apply(context, passedArguments);
1279
- }
1280
- else if(found !== undefined) {
1281
- response = found;
1282
- }
1283
- if(Array.isArray(returnedValue)) {
1284
- returnedValue.push(response);
1285
- }
1286
- else if(returnedValue !== undefined) {
1287
- returnedValue = [returnedValue, response];
1288
- }
1289
- else if(response !== undefined) {
1290
- returnedValue = response;
1291
- }
1292
- return found;
1293
- }
1294
- };
1295
-
1296
- if(methodInvoked) {
1297
- if(instance === undefined) {
1298
- if (isFunction(settings.templates[query])) {
1299
- settings.autoShow = true;
1300
- settings.className.modal = settings.className.template;
1301
- settings = $.extend(true, {}, settings, settings.templates[query].apply(module ,queryArguments));
1302
-
1303
- // reassign shortcuts
1304
- className = settings.className;
1305
- namespace = settings.namespace;
1306
- fields = settings.fields;
1307
- error = settings.error;
1308
- }
1309
- module.initialize();
1310
- }
1311
- if (!isFunction(settings.templates[query])) {
1312
- module.invoke(query);
1313
- }
1314
- }
1315
- else {
1316
- if(instance !== undefined) {
1317
- instance.invoke('destroy');
1318
- }
1319
- module.initialize();
1320
- returnedValue = $module;
1321
- }
1322
- })
1323
- ;
1324
-
1325
- return (returnedValue !== undefined)
1326
- ? returnedValue
1327
- : this
1328
- ;
1329
- };
1330
-
1331
- $.fn.modal.settings = {
1332
-
1333
- name : 'Modal',
1334
- namespace : 'modal',
1335
-
1336
- useFlex : 'auto',
1337
- offset : 0,
1338
-
1339
- silent : false,
1340
- debug : false,
1341
- verbose : false,
1342
- performance : true,
1343
-
1344
- observeChanges : false,
1345
-
1346
- allowMultiple : false,
1347
- detachable : true,
1348
- closable : true,
1349
- autofocus : true,
1350
- restoreFocus : true,
1351
- autoShow : false,
1352
-
1353
- inverted : false,
1354
- blurring : false,
1355
-
1356
- centered : true,
1357
-
1358
- dimmerSettings : {
1359
- closable : false,
1360
- useCSS : true
1361
- },
1362
-
1363
- // whether to use keyboard shortcuts
1364
- keyboardShortcuts: true,
1365
-
1366
- context : 'body',
1367
-
1368
- queue : false,
1369
- duration : 500,
1370
- transition : 'scale',
1371
-
1372
- // padding with edge of page
1373
- padding : 50,
1374
- scrollbarWidth: 10,
1375
-
1376
- //dynamic content
1377
- title : '',
1378
- content : '',
1379
- class : '',
1380
- classTitle : '',
1381
- classContent : '',
1382
- classActions : '',
1383
- closeIcon : false,
1384
- actions : false,
1385
- preserveHTML : true,
1386
-
1387
- fields : {
1388
- class : 'class',
1389
- text : 'text',
1390
- icon : 'icon',
1391
- click : 'click'
1392
- },
1393
-
1394
- // called before show animation
1395
- onShow : function(){},
1396
-
1397
- // called after show animation
1398
- onVisible : function(){},
1399
-
1400
- // called before hide animation
1401
- onHide : function(){ return true; },
1402
-
1403
- // called after hide animation
1404
- onHidden : false,
1405
-
1406
- // called after approve selector match
1407
- onApprove : function(){ return true; },
1408
-
1409
- // called after deny selector match
1410
- onDeny : function(){ return true; },
1411
-
1412
- keys : {
1413
- space : 32,
1414
- enter : 13,
1415
- escape : 27,
1416
- tab : 9,
1417
- },
1418
-
1419
- selector : {
1420
- title : '> .header',
1421
- content : '> .content',
1422
- actions : '> .actions',
1423
- close : '> .close',
1424
- closeIcon: '> .close',
1425
- approve : '.actions .positive, .actions .approve, .actions .ok',
1426
- deny : '.actions .negative, .actions .deny, .actions .cancel',
1427
- modal : '.ui.modal',
1428
- dimmer : '> .ui.dimmer',
1429
- bodyFixed: '> .ui.fixed.menu, > .ui.right.toast-container, > .ui.right.sidebar, > .ui.fixed.nag, > .ui.fixed.nag > .close',
1430
- prompt : '.ui.input > input'
1431
- },
1432
- error : {
1433
- dimmer : 'UI Dimmer, a required component is not included in this page',
1434
- method : 'The method you called is not defined.',
1435
- notFound : 'The element you specified could not be found'
1436
- },
1437
- className : {
1438
- active : 'active',
1439
- animating : 'animating',
1440
- blurring : 'blurring',
1441
- inverted : 'inverted',
1442
- legacy : 'legacy',
1443
- loading : 'loading',
1444
- scrolling : 'scrolling',
1445
- undetached : 'undetached',
1446
- front : 'front',
1447
- close : 'close icon',
1448
- button : 'ui button',
1449
- modal : 'ui modal',
1450
- title : 'header',
1451
- content : 'content',
1452
- actions : 'actions',
1453
- template : 'ui tiny modal',
1454
- ok : 'positive',
1455
- cancel : 'negative',
1456
- prompt : 'ui fluid input',
1457
- innerDimmer: 'ui inverted dimmer'
1458
- },
1459
- text: {
1460
- ok : 'Ok',
1461
- cancel: 'Cancel',
1462
- close : 'Close'
1463
- }
1464
- };
1465
-
1466
- $.fn.modal.settings.templates = {
1467
- getArguments: function(args) {
1468
- var queryArguments = [].slice.call(args);
1469
- if($.isPlainObject(queryArguments[0])){
1470
- return $.extend({
1471
- handler:function(){},
1472
- content:'',
1473
- title: ''
1474
- }, queryArguments[0]);
1475
- } else {
1476
- if(!isFunction(queryArguments[queryArguments.length-1])) {
1477
- queryArguments.push(function() {});
1478
- }
1479
- return {
1480
- handler: queryArguments.pop(),
1481
- content: queryArguments.pop() || '',
1482
- title: queryArguments.pop() || ''
1483
- };
1484
- }
1485
- },
1486
- alert: function () {
1487
- var settings = this.get.settings(),
1488
- args = settings.templates.getArguments(arguments),
1489
- approveFn = args.handler
1490
- ;
1491
- return {
1492
- title : args.title,
1493
- content: args.content,
1494
- onApprove: approveFn,
1495
- actions: [{
1496
- text : settings.text.ok,
1497
- class: settings.className.ok,
1498
- click: approveFn
1499
- }]
1500
- }
1501
- },
1502
- confirm: function () {
1503
- var settings = this.get.settings(),
1504
- args = settings.templates.getArguments(arguments),
1505
- approveFn = function(){args.handler(true)},
1506
- denyFn = function(){args.handler(false)}
1507
- ;
1508
- return {
1509
- title : args.title,
1510
- content: args.content,
1511
- onApprove: approveFn,
1512
- onDeny: denyFn,
1513
- actions: [{
1514
- text : settings.text.ok,
1515
- class: settings.className.ok,
1516
- click: approveFn
1517
- },{
1518
- text: settings.text.cancel,
1519
- class: settings.className.cancel,
1520
- click: denyFn
1521
- }]
1522
- }
1523
- },
1524
- prompt: function () {
1525
- var $this = this,
1526
- settings = this.get.settings(),
1527
- args = settings.templates.getArguments(arguments),
1528
- input = $($.parseHTML(args.content)).filter('.ui.input'),
1529
- approveFn = function(){
1530
- var settings = $this.get.settings(),
1531
- inputField = $this.get.element().find(settings.selector.prompt)[0]
1532
- ;
1533
- args.handler($(inputField).val());
1534
- },
1535
- denyFn = function(){args.handler(null)}
1536
- ;
1537
- if (input.length === 0) {
1538
- args.content += '<p><div class="'+this.helpers.deQuote(settings.className.prompt)+'"><input placeholder="'+this.helpers.deQuote(args.placeholder || '')+'" type="text" value="'+this.helpers.deQuote(args.defaultValue || '')+'"></div></p>';
1539
- }
1540
- return {
1541
- title : args.title,
1542
- content: args.content,
1543
- onApprove: approveFn,
1544
- onDeny: denyFn,
1545
- actions: [{
1546
- text: settings.text.ok,
1547
- class: settings.className.ok,
1548
- click: approveFn
1549
- },{
1550
- text: settings.text.cancel,
1551
- class: settings.className.cancel,
1552
- click: denyFn
1553
- }]
1554
- }
1555
- }
1556
- }
1557
-
1558
- })( jQuery, window, document );
1563
+ };
1564
+ })(jQuery, window, document);