oxymoron 1.2.7 → 1.2.8
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.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62a6b77289f2f0d7c32ff182428d0311520a0e34
|
4
|
+
data.tar.gz: 0e3754d7993ceb1e3f3995eef4e06bce151b4cce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 24d7cd163a28db571bd2f83ccb11e3197d6ffe693d4c3b033c3731ef0bff04681cb7ae0a997ee80907f35f19178761b593dba6373749e4fa62546d6162cb555e
|
7
|
+
data.tar.gz: 913e8c771cdf6c5e3566159065176d3f551529218fcb7bd5ae23f97453b460cb1ea80349d4e38dc4bc62c552766c80d0bc4f49527dd67ad3d4a0684e975100ec
|
data/lib/oxymoron/version.rb
CHANGED
@@ -0,0 +1,953 @@
|
|
1
|
+
/*
|
2
|
+
* ngDialog - easy modals and popup windows
|
3
|
+
* http://github.com/likeastore/ngDialog
|
4
|
+
* (c) 2013-2015 MIT License, https://likeastore.com
|
5
|
+
*/
|
6
|
+
|
7
|
+
(function (root, factory) {
|
8
|
+
if (typeof module !== 'undefined' && module.exports) {
|
9
|
+
// CommonJS
|
10
|
+
if (typeof angular === 'undefined') {
|
11
|
+
factory(require('angular'));
|
12
|
+
} else {
|
13
|
+
factory(angular);
|
14
|
+
}
|
15
|
+
module.exports = 'ngDialog';
|
16
|
+
} else if (typeof define === 'function' && define.amd) {
|
17
|
+
// AMD
|
18
|
+
define(['angular'], factory);
|
19
|
+
} else {
|
20
|
+
// Global Variables
|
21
|
+
factory(root.angular);
|
22
|
+
}
|
23
|
+
}(this, function (angular) {
|
24
|
+
'use strict';
|
25
|
+
|
26
|
+
var m = angular.module('ngDialog', []);
|
27
|
+
|
28
|
+
var $el = angular.element;
|
29
|
+
var isDef = angular.isDefined;
|
30
|
+
var style = (document.body || document.documentElement).style;
|
31
|
+
var animationEndSupport = isDef(style.animation) || isDef(style.WebkitAnimation) || isDef(style.MozAnimation) || isDef(style.MsAnimation) || isDef(style.OAnimation);
|
32
|
+
var animationEndEvent = 'animationend webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend';
|
33
|
+
var focusableElementSelector = 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]';
|
34
|
+
var disabledAnimationClass = 'ngdialog-disabled-animation';
|
35
|
+
var forceElementsReload = { html: false, body: false };
|
36
|
+
var scopes = {};
|
37
|
+
var openIdStack = [];
|
38
|
+
var activeBodyClasses = [];
|
39
|
+
var keydownIsBound = false;
|
40
|
+
var openOnePerName = false;
|
41
|
+
var closeByNavigationDialogStack = [];
|
42
|
+
|
43
|
+
var UI_ROUTER_VERSION_LEGACY = 'legacy';
|
44
|
+
var UI_ROUTER_VERSION_ONE_PLUS = '1.0.0+';
|
45
|
+
|
46
|
+
m.provider('ngDialog', function () {
|
47
|
+
var defaults = this.defaults = {
|
48
|
+
className: 'ngdialog-theme-default',
|
49
|
+
appendClassName: '',
|
50
|
+
disableAnimation: false,
|
51
|
+
plain: false,
|
52
|
+
showClose: true,
|
53
|
+
closeByDocument: true,
|
54
|
+
closeByEscape: true,
|
55
|
+
closeByNavigation: false,
|
56
|
+
appendTo: false,
|
57
|
+
preCloseCallback: false,
|
58
|
+
onOpenCallback: false,
|
59
|
+
overlay: true,
|
60
|
+
cache: true,
|
61
|
+
trapFocus: true,
|
62
|
+
preserveFocus: true,
|
63
|
+
ariaAuto: true,
|
64
|
+
ariaRole: null,
|
65
|
+
ariaLabelledById: null,
|
66
|
+
ariaLabelledBySelector: null,
|
67
|
+
ariaDescribedById: null,
|
68
|
+
ariaDescribedBySelector: null,
|
69
|
+
bodyClassName: 'ngdialog-open',
|
70
|
+
width: null,
|
71
|
+
height: null
|
72
|
+
};
|
73
|
+
|
74
|
+
this.setForceHtmlReload = function (_useIt) {
|
75
|
+
forceElementsReload.html = _useIt || false;
|
76
|
+
};
|
77
|
+
|
78
|
+
this.setForceBodyReload = function (_useIt) {
|
79
|
+
forceElementsReload.body = _useIt || false;
|
80
|
+
};
|
81
|
+
|
82
|
+
this.setDefaults = function (newDefaults) {
|
83
|
+
angular.extend(defaults, newDefaults);
|
84
|
+
};
|
85
|
+
|
86
|
+
this.setOpenOnePerName = function (isOpenOne) {
|
87
|
+
openOnePerName = isOpenOne || false;
|
88
|
+
};
|
89
|
+
|
90
|
+
var globalID = 0, dialogsCount = 0, closeByDocumentHandler, defers = {};
|
91
|
+
|
92
|
+
this.$get = ['$document', '$templateCache', '$compile', '$q', '$http', '$rootScope', '$timeout', '$window', '$controller', '$injector',
|
93
|
+
function ($document, $templateCache, $compile, $q, $http, $rootScope, $timeout, $window, $controller, $injector) {
|
94
|
+
var $elements = [];
|
95
|
+
|
96
|
+
var privateMethods = {
|
97
|
+
onDocumentKeydown: function (event) {
|
98
|
+
if (event.keyCode === 27) {
|
99
|
+
publicMethods.close('$escape');
|
100
|
+
}
|
101
|
+
},
|
102
|
+
|
103
|
+
activate: function($dialog) {
|
104
|
+
var options = $dialog.data('$ngDialogOptions');
|
105
|
+
|
106
|
+
if (options.trapFocus) {
|
107
|
+
$dialog.on('keydown', privateMethods.onTrapFocusKeydown);
|
108
|
+
|
109
|
+
// Catch rogue changes (eg. after unfocusing everything by clicking a non-focusable element)
|
110
|
+
$elements.body.on('keydown', privateMethods.onTrapFocusKeydown);
|
111
|
+
}
|
112
|
+
},
|
113
|
+
|
114
|
+
deactivate: function ($dialog) {
|
115
|
+
$dialog.off('keydown', privateMethods.onTrapFocusKeydown);
|
116
|
+
$elements.body.off('keydown', privateMethods.onTrapFocusKeydown);
|
117
|
+
},
|
118
|
+
|
119
|
+
deactivateAll: function (els) {
|
120
|
+
angular.forEach(els,function(el) {
|
121
|
+
var $dialog = angular.element(el);
|
122
|
+
privateMethods.deactivate($dialog);
|
123
|
+
});
|
124
|
+
},
|
125
|
+
|
126
|
+
setBodyPadding: function (width) {
|
127
|
+
var originalBodyPadding = parseInt(($elements.body.css('padding-right') || 0), 10);
|
128
|
+
$elements.body.css('padding-right', (originalBodyPadding + width) + 'px');
|
129
|
+
$elements.body.data('ng-dialog-original-padding', originalBodyPadding);
|
130
|
+
$rootScope.$broadcast('ngDialog.setPadding', width);
|
131
|
+
},
|
132
|
+
|
133
|
+
resetBodyPadding: function () {
|
134
|
+
var originalBodyPadding = $elements.body.data('ng-dialog-original-padding');
|
135
|
+
if (originalBodyPadding) {
|
136
|
+
$elements.body.css('padding-right', originalBodyPadding + 'px');
|
137
|
+
} else {
|
138
|
+
$elements.body.css('padding-right', '');
|
139
|
+
}
|
140
|
+
$rootScope.$broadcast('ngDialog.setPadding', 0);
|
141
|
+
},
|
142
|
+
|
143
|
+
performCloseDialog: function ($dialog, value) {
|
144
|
+
var options = $dialog.data('$ngDialogOptions');
|
145
|
+
var id = $dialog.attr('id');
|
146
|
+
var scope = scopes[id];
|
147
|
+
privateMethods.deactivate($dialog);
|
148
|
+
|
149
|
+
if (!scope) {
|
150
|
+
// Already closed
|
151
|
+
return;
|
152
|
+
}
|
153
|
+
|
154
|
+
if (typeof $window.Hammer !== 'undefined') {
|
155
|
+
var hammerTime = scope.hammerTime;
|
156
|
+
hammerTime.off('tap', closeByDocumentHandler);
|
157
|
+
hammerTime.destroy && hammerTime.destroy();
|
158
|
+
delete scope.hammerTime;
|
159
|
+
} else {
|
160
|
+
$dialog.unbind('click');
|
161
|
+
}
|
162
|
+
|
163
|
+
if (dialogsCount === 1) {
|
164
|
+
$elements.body.unbind('keydown', privateMethods.onDocumentKeydown);
|
165
|
+
}
|
166
|
+
|
167
|
+
if (!$dialog.hasClass('ngdialog-closing')){
|
168
|
+
dialogsCount -= 1;
|
169
|
+
}
|
170
|
+
|
171
|
+
var previousFocus = $dialog.data('$ngDialogPreviousFocus');
|
172
|
+
if (previousFocus && previousFocus.focus) {
|
173
|
+
previousFocus.focus();
|
174
|
+
}
|
175
|
+
|
176
|
+
$rootScope.$broadcast('ngDialog.closing', $dialog, value);
|
177
|
+
dialogsCount = dialogsCount < 0 ? 0 : dialogsCount;
|
178
|
+
if (animationEndSupport && !options.disableAnimation) {
|
179
|
+
scope.$destroy();
|
180
|
+
$dialog.unbind(animationEndEvent).bind(animationEndEvent, function () {
|
181
|
+
privateMethods.closeDialogElement($dialog, value);
|
182
|
+
}).addClass('ngdialog-closing');
|
183
|
+
} else {
|
184
|
+
scope.$destroy();
|
185
|
+
privateMethods.closeDialogElement($dialog, value);
|
186
|
+
}
|
187
|
+
if (defers[id]) {
|
188
|
+
defers[id].resolve({
|
189
|
+
id: id,
|
190
|
+
value: value,
|
191
|
+
$dialog: $dialog,
|
192
|
+
remainingDialogs: dialogsCount
|
193
|
+
});
|
194
|
+
delete defers[id];
|
195
|
+
}
|
196
|
+
if (scopes[id]) {
|
197
|
+
delete scopes[id];
|
198
|
+
}
|
199
|
+
openIdStack.splice(openIdStack.indexOf(id), 1);
|
200
|
+
if (!openIdStack.length) {
|
201
|
+
$elements.body.unbind('keydown', privateMethods.onDocumentKeydown);
|
202
|
+
keydownIsBound = false;
|
203
|
+
}
|
204
|
+
|
205
|
+
if (dialogsCount == 0)
|
206
|
+
{
|
207
|
+
closeByDocumentHandler = undefined;
|
208
|
+
}
|
209
|
+
},
|
210
|
+
|
211
|
+
closeDialogElement: function($dialog, value) {
|
212
|
+
var options = $dialog.data('$ngDialogOptions');
|
213
|
+
$dialog.remove();
|
214
|
+
|
215
|
+
activeBodyClasses.splice(activeBodyClasses.indexOf(options.bodyClassName), 1);
|
216
|
+
if (activeBodyClasses.indexOf(options.bodyClassName) === -1) {
|
217
|
+
$elements.html.removeClass(options.bodyClassName);
|
218
|
+
$elements.body.removeClass(options.bodyClassName);
|
219
|
+
}
|
220
|
+
|
221
|
+
if (dialogsCount === 0) {
|
222
|
+
privateMethods.resetBodyPadding();
|
223
|
+
}
|
224
|
+
|
225
|
+
$rootScope.$broadcast('ngDialog.closed', $dialog, value);
|
226
|
+
},
|
227
|
+
|
228
|
+
closeDialog: function ($dialog, value) {
|
229
|
+
var preCloseCallback = $dialog.data('$ngDialogPreCloseCallback');
|
230
|
+
|
231
|
+
if (preCloseCallback && angular.isFunction(preCloseCallback)) {
|
232
|
+
|
233
|
+
var preCloseCallbackResult = preCloseCallback.call($dialog, value);
|
234
|
+
|
235
|
+
if (angular.isObject(preCloseCallbackResult)) {
|
236
|
+
if (preCloseCallbackResult.closePromise) {
|
237
|
+
preCloseCallbackResult.closePromise.then(function () {
|
238
|
+
privateMethods.performCloseDialog($dialog, value);
|
239
|
+
}, function () {
|
240
|
+
return false;
|
241
|
+
});
|
242
|
+
} else {
|
243
|
+
preCloseCallbackResult.then(function () {
|
244
|
+
privateMethods.performCloseDialog($dialog, value);
|
245
|
+
}, function () {
|
246
|
+
return false;
|
247
|
+
});
|
248
|
+
}
|
249
|
+
} else if (preCloseCallbackResult !== false) {
|
250
|
+
privateMethods.performCloseDialog($dialog, value);
|
251
|
+
} else {
|
252
|
+
return false;
|
253
|
+
}
|
254
|
+
} else {
|
255
|
+
privateMethods.performCloseDialog($dialog, value);
|
256
|
+
}
|
257
|
+
},
|
258
|
+
|
259
|
+
onTrapFocusKeydown: function(ev) {
|
260
|
+
var el = angular.element(ev.currentTarget);
|
261
|
+
var $dialog;
|
262
|
+
|
263
|
+
if (el.hasClass('ngdialog')) {
|
264
|
+
$dialog = el;
|
265
|
+
} else {
|
266
|
+
$dialog = privateMethods.getActiveDialog();
|
267
|
+
|
268
|
+
if ($dialog === null) {
|
269
|
+
return;
|
270
|
+
}
|
271
|
+
}
|
272
|
+
|
273
|
+
var isTab = (ev.keyCode === 9);
|
274
|
+
var backward = (ev.shiftKey === true);
|
275
|
+
|
276
|
+
if (isTab) {
|
277
|
+
privateMethods.handleTab($dialog, ev, backward);
|
278
|
+
}
|
279
|
+
},
|
280
|
+
|
281
|
+
handleTab: function($dialog, ev, backward) {
|
282
|
+
var focusableElements = privateMethods.getFocusableElements($dialog);
|
283
|
+
|
284
|
+
if (focusableElements.length === 0) {
|
285
|
+
if (document.activeElement && document.activeElement.blur) {
|
286
|
+
document.activeElement.blur();
|
287
|
+
}
|
288
|
+
return;
|
289
|
+
}
|
290
|
+
|
291
|
+
var currentFocus = document.activeElement;
|
292
|
+
var focusIndex = Array.prototype.indexOf.call(focusableElements, currentFocus);
|
293
|
+
|
294
|
+
var isFocusIndexUnknown = (focusIndex === -1);
|
295
|
+
var isFirstElementFocused = (focusIndex === 0);
|
296
|
+
var isLastElementFocused = (focusIndex === focusableElements.length - 1);
|
297
|
+
|
298
|
+
var cancelEvent = false;
|
299
|
+
|
300
|
+
if (backward) {
|
301
|
+
if (isFocusIndexUnknown || isFirstElementFocused) {
|
302
|
+
focusableElements[focusableElements.length - 1].focus();
|
303
|
+
cancelEvent = true;
|
304
|
+
}
|
305
|
+
} else {
|
306
|
+
if (isFocusIndexUnknown || isLastElementFocused) {
|
307
|
+
focusableElements[0].focus();
|
308
|
+
cancelEvent = true;
|
309
|
+
}
|
310
|
+
}
|
311
|
+
|
312
|
+
if (cancelEvent) {
|
313
|
+
ev.preventDefault();
|
314
|
+
ev.stopPropagation();
|
315
|
+
}
|
316
|
+
},
|
317
|
+
|
318
|
+
autoFocus: function($dialog) {
|
319
|
+
var dialogEl = $dialog[0];
|
320
|
+
|
321
|
+
// Browser's (Chrome 40, Forefix 37, IE 11) don't appear to honor autofocus on the dialog, but we should
|
322
|
+
var autoFocusEl = dialogEl.querySelector('*[autofocus]');
|
323
|
+
if (autoFocusEl !== null) {
|
324
|
+
autoFocusEl.focus();
|
325
|
+
|
326
|
+
if (document.activeElement === autoFocusEl) {
|
327
|
+
return;
|
328
|
+
}
|
329
|
+
|
330
|
+
// Autofocus element might was display: none, so let's continue
|
331
|
+
}
|
332
|
+
|
333
|
+
var focusableElements = privateMethods.getFocusableElements($dialog);
|
334
|
+
|
335
|
+
if (focusableElements.length > 0) {
|
336
|
+
focusableElements[0].focus();
|
337
|
+
return;
|
338
|
+
}
|
339
|
+
|
340
|
+
// We need to focus something for the screen readers to notice the dialog
|
341
|
+
var contentElements = privateMethods.filterVisibleElements(dialogEl.querySelectorAll('h1,h2,h3,h4,h5,h6,p,span'));
|
342
|
+
|
343
|
+
if (contentElements.length > 0) {
|
344
|
+
var contentElement = contentElements[0];
|
345
|
+
$el(contentElement).attr('tabindex', '-1').css('outline', '0');
|
346
|
+
contentElement.focus();
|
347
|
+
}
|
348
|
+
},
|
349
|
+
|
350
|
+
getFocusableElements: function ($dialog) {
|
351
|
+
var dialogEl = $dialog[0];
|
352
|
+
|
353
|
+
var rawElements = dialogEl.querySelectorAll(focusableElementSelector);
|
354
|
+
|
355
|
+
// Ignore untabbable elements, ie. those with tabindex = -1
|
356
|
+
var tabbableElements = privateMethods.filterTabbableElements(rawElements);
|
357
|
+
|
358
|
+
return privateMethods.filterVisibleElements(tabbableElements);
|
359
|
+
},
|
360
|
+
|
361
|
+
filterTabbableElements: function (els) {
|
362
|
+
var tabbableFocusableElements = [];
|
363
|
+
|
364
|
+
for (var i = 0; i < els.length; i++) {
|
365
|
+
var el = els[i];
|
366
|
+
|
367
|
+
if ($el(el).attr('tabindex') !== '-1') {
|
368
|
+
tabbableFocusableElements.push(el);
|
369
|
+
}
|
370
|
+
}
|
371
|
+
|
372
|
+
return tabbableFocusableElements;
|
373
|
+
},
|
374
|
+
|
375
|
+
filterVisibleElements: function (els) {
|
376
|
+
var visibleFocusableElements = [];
|
377
|
+
|
378
|
+
for (var i = 0; i < els.length; i++) {
|
379
|
+
var el = els[i];
|
380
|
+
|
381
|
+
if (el.offsetWidth > 0 || el.offsetHeight > 0) {
|
382
|
+
visibleFocusableElements.push(el);
|
383
|
+
}
|
384
|
+
}
|
385
|
+
|
386
|
+
return visibleFocusableElements;
|
387
|
+
},
|
388
|
+
|
389
|
+
getActiveDialog: function () {
|
390
|
+
var dialogs = document.querySelectorAll('.ngdialog');
|
391
|
+
|
392
|
+
if (dialogs.length === 0) {
|
393
|
+
return null;
|
394
|
+
}
|
395
|
+
|
396
|
+
// TODO: This might be incorrect if there are a mix of open dialogs with different 'appendTo' values
|
397
|
+
return $el(dialogs[dialogs.length - 1]);
|
398
|
+
},
|
399
|
+
|
400
|
+
applyAriaAttributes: function ($dialog, options) {
|
401
|
+
if (options.ariaAuto) {
|
402
|
+
if (!options.ariaRole) {
|
403
|
+
var detectedRole = (privateMethods.getFocusableElements($dialog).length > 0) ?
|
404
|
+
'dialog' :
|
405
|
+
'alertdialog';
|
406
|
+
|
407
|
+
options.ariaRole = detectedRole;
|
408
|
+
}
|
409
|
+
|
410
|
+
if (!options.ariaLabelledBySelector) {
|
411
|
+
options.ariaLabelledBySelector = 'h1,h2,h3,h4,h5,h6';
|
412
|
+
}
|
413
|
+
|
414
|
+
if (!options.ariaDescribedBySelector) {
|
415
|
+
options.ariaDescribedBySelector = 'article,section,p';
|
416
|
+
}
|
417
|
+
}
|
418
|
+
|
419
|
+
if (options.ariaRole) {
|
420
|
+
$dialog.attr('role', options.ariaRole);
|
421
|
+
}
|
422
|
+
|
423
|
+
privateMethods.applyAriaAttribute(
|
424
|
+
$dialog, 'aria-labelledby', options.ariaLabelledById, options.ariaLabelledBySelector);
|
425
|
+
|
426
|
+
privateMethods.applyAriaAttribute(
|
427
|
+
$dialog, 'aria-describedby', options.ariaDescribedById, options.ariaDescribedBySelector);
|
428
|
+
},
|
429
|
+
|
430
|
+
applyAriaAttribute: function($dialog, attr, id, selector) {
|
431
|
+
if (id) {
|
432
|
+
$dialog.attr(attr, id);
|
433
|
+
return;
|
434
|
+
}
|
435
|
+
|
436
|
+
if (selector) {
|
437
|
+
var dialogId = $dialog.attr('id');
|
438
|
+
|
439
|
+
var firstMatch = $dialog[0].querySelector(selector);
|
440
|
+
|
441
|
+
if (!firstMatch) {
|
442
|
+
return;
|
443
|
+
}
|
444
|
+
|
445
|
+
var generatedId = dialogId + '-' + attr;
|
446
|
+
|
447
|
+
$el(firstMatch).attr('id', generatedId);
|
448
|
+
|
449
|
+
$dialog.attr(attr, generatedId);
|
450
|
+
|
451
|
+
return generatedId;
|
452
|
+
}
|
453
|
+
},
|
454
|
+
|
455
|
+
detectUIRouter: function() {
|
456
|
+
// Detect if ui-router module is installed
|
457
|
+
// Returns ui-router version string if installed
|
458
|
+
// Otherwise false
|
459
|
+
|
460
|
+
if ($injector.has('$transitions')) {
|
461
|
+
// Only 1.0.0+ ui.router allows us to inject $transitions
|
462
|
+
return UI_ROUTER_VERSION_ONE_PLUS;
|
463
|
+
}
|
464
|
+
else if ($injector.has('$state')) {
|
465
|
+
// The legacy ui.router allows us to inject $state
|
466
|
+
return UI_ROUTER_VERSION_LEGACY;
|
467
|
+
}
|
468
|
+
return false;
|
469
|
+
},
|
470
|
+
|
471
|
+
getRouterLocationEventName: function() {
|
472
|
+
if (privateMethods.detectUIRouter()) {
|
473
|
+
return '$stateChangeStart';
|
474
|
+
}
|
475
|
+
return '$locationChangeStart';
|
476
|
+
}
|
477
|
+
};
|
478
|
+
|
479
|
+
var publicMethods = {
|
480
|
+
__PRIVATE__: privateMethods,
|
481
|
+
|
482
|
+
/*
|
483
|
+
* @param {Object} options:
|
484
|
+
* - template {String} - id of ng-template, url for partial, plain string (if enabled)
|
485
|
+
* - plain {Boolean} - enable plain string templates, default false
|
486
|
+
* - scope {Object}
|
487
|
+
* - controller {String}
|
488
|
+
* - controllerAs {String}
|
489
|
+
* - className {String} - dialog theme class
|
490
|
+
* - appendClassName {String} - dialog theme class to be appended to defaults
|
491
|
+
* - disableAnimation {Boolean} - set to true to disable animation
|
492
|
+
* - showClose {Boolean} - show close button, default true
|
493
|
+
* - closeByEscape {Boolean} - default true
|
494
|
+
* - closeByDocument {Boolean} - default true
|
495
|
+
* - preCloseCallback {String|Function} - user supplied function name/function called before closing dialog (if set)
|
496
|
+
* - onOpenCallback {String|Function} - user supplied function name/function called after opening dialog (if set)
|
497
|
+
* - bodyClassName {String} - class added to body at open dialog
|
498
|
+
* @return {Object} dialog
|
499
|
+
*/
|
500
|
+
open: function (opts) {
|
501
|
+
var dialogID = null;
|
502
|
+
opts = opts || {};
|
503
|
+
if (openOnePerName && opts.name) {
|
504
|
+
dialogID = opts.name.toLowerCase().replace(/\s/g, '-') + '-dialog';
|
505
|
+
if (this.isOpen(dialogID)) {
|
506
|
+
return;
|
507
|
+
}
|
508
|
+
}
|
509
|
+
var options = angular.copy(defaults);
|
510
|
+
var localID = ++globalID;
|
511
|
+
dialogID = dialogID || 'ngdialog' + localID;
|
512
|
+
openIdStack.push(dialogID);
|
513
|
+
|
514
|
+
// Merge opts.data with predefined via setDefaults
|
515
|
+
if (typeof options.data !== 'undefined') {
|
516
|
+
if (typeof opts.data === 'undefined') {
|
517
|
+
opts.data = {};
|
518
|
+
}
|
519
|
+
opts.data = angular.merge(angular.copy(options.data), opts.data);
|
520
|
+
}
|
521
|
+
|
522
|
+
angular.extend(options, opts);
|
523
|
+
|
524
|
+
var defer;
|
525
|
+
defers[dialogID] = defer = $q.defer();
|
526
|
+
|
527
|
+
var scope;
|
528
|
+
scopes[dialogID] = scope = angular.isObject(options.scope) ? options.scope.$new() : $rootScope.$new();
|
529
|
+
|
530
|
+
var $dialog, $dialogParent, $dialogContent;
|
531
|
+
|
532
|
+
var resolve = angular.extend({}, options.resolve);
|
533
|
+
|
534
|
+
angular.forEach(resolve, function (value, key) {
|
535
|
+
resolve[key] = angular.isString(value) ? $injector.get(value) : $injector.invoke(value, null, null, key);
|
536
|
+
});
|
537
|
+
|
538
|
+
$q.all({
|
539
|
+
template: loadTemplate(options.template || options.templateUrl),
|
540
|
+
locals: $q.all(resolve)
|
541
|
+
}).then(function (setup) {
|
542
|
+
var template = setup.template,
|
543
|
+
locals = setup.locals;
|
544
|
+
|
545
|
+
if (options.showClose) {
|
546
|
+
template += '<button aria-label="Dismiss" class="ngdialog-close"></button>';
|
547
|
+
}
|
548
|
+
|
549
|
+
var hasOverlayClass = options.overlay ? '' : ' ngdialog-no-overlay';
|
550
|
+
$dialog = $el('<div id="' + dialogID + '" class="ngdialog' + hasOverlayClass + '"></div>');
|
551
|
+
$dialog.html((options.overlay ?
|
552
|
+
'<div class="ngdialog-overlay"></div><div class="ngdialog-content" role="document">' + template + '</div>' :
|
553
|
+
'<div class="ngdialog-content" role="document">' + template + '</div>'));
|
554
|
+
|
555
|
+
$dialog.data('$ngDialogOptions', options);
|
556
|
+
|
557
|
+
scope.ngDialogId = dialogID;
|
558
|
+
|
559
|
+
if (options.data && angular.isString(options.data)) {
|
560
|
+
var firstLetter = options.data.replace(/^\s*/, '')[0];
|
561
|
+
scope.ngDialogData = (firstLetter === '{' || firstLetter === '[') ? angular.fromJson(options.data) : new String(options.data);
|
562
|
+
scope.ngDialogData.ngDialogId = dialogID;
|
563
|
+
} else if (options.data && angular.isObject(options.data)) {
|
564
|
+
scope.ngDialogData = options.data;
|
565
|
+
scope.ngDialogData.ngDialogId = dialogID;
|
566
|
+
}
|
567
|
+
|
568
|
+
if (options.className) {
|
569
|
+
$dialog.addClass(options.className);
|
570
|
+
}
|
571
|
+
|
572
|
+
if (options.appendClassName) {
|
573
|
+
$dialog.addClass(options.appendClassName);
|
574
|
+
}
|
575
|
+
|
576
|
+
if (options.width) {
|
577
|
+
$dialogContent = $dialog[0].querySelector('.ngdialog-content');
|
578
|
+
if (angular.isString(options.width)) {
|
579
|
+
$dialogContent.style.width = options.width;
|
580
|
+
} else {
|
581
|
+
$dialogContent.style.width = options.width + 'px';
|
582
|
+
}
|
583
|
+
}
|
584
|
+
|
585
|
+
if (options.height) {
|
586
|
+
$dialogContent = $dialog[0].querySelector('.ngdialog-content');
|
587
|
+
if (angular.isString(options.height)) {
|
588
|
+
$dialogContent.style.height = options.height;
|
589
|
+
} else {
|
590
|
+
$dialogContent.style.height = options.height + 'px';
|
591
|
+
}
|
592
|
+
}
|
593
|
+
|
594
|
+
if (options.disableAnimation) {
|
595
|
+
$dialog.addClass(disabledAnimationClass);
|
596
|
+
}
|
597
|
+
|
598
|
+
if (options.appendTo && angular.isString(options.appendTo)) {
|
599
|
+
$dialogParent = angular.element(document.querySelector(options.appendTo));
|
600
|
+
} else {
|
601
|
+
$dialogParent = $elements.body;
|
602
|
+
}
|
603
|
+
|
604
|
+
privateMethods.applyAriaAttributes($dialog, options);
|
605
|
+
|
606
|
+
[
|
607
|
+
{ name: '$ngDialogPreCloseCallback', value: options.preCloseCallback },
|
608
|
+
{ name: '$ngDialogOnOpenCallback', value: options.onOpenCallback }
|
609
|
+
].forEach(function (option) {
|
610
|
+
if (option.value) {
|
611
|
+
var callback;
|
612
|
+
|
613
|
+
if (angular.isFunction(option.value)) {
|
614
|
+
callback = option.value;
|
615
|
+
} else if (angular.isString(option.value)) {
|
616
|
+
if (scope) {
|
617
|
+
if (angular.isFunction(scope[option.value])) {
|
618
|
+
callback = scope[option.value];
|
619
|
+
} else if (scope.$parent && angular.isFunction(scope.$parent[option.value])) {
|
620
|
+
callback = scope.$parent[option.value];
|
621
|
+
} else if ($rootScope && angular.isFunction($rootScope[option.value])) {
|
622
|
+
callback = $rootScope[option.value];
|
623
|
+
}
|
624
|
+
}
|
625
|
+
}
|
626
|
+
|
627
|
+
if (callback) {
|
628
|
+
$dialog.data(option.name, callback);
|
629
|
+
}
|
630
|
+
}
|
631
|
+
});
|
632
|
+
|
633
|
+
scope.closeThisDialog = function (value) {
|
634
|
+
privateMethods.closeDialog($dialog, value);
|
635
|
+
};
|
636
|
+
|
637
|
+
if (options.controller && (angular.isString(options.controller) || angular.isArray(options.controller) || angular.isFunction(options.controller))) {
|
638
|
+
|
639
|
+
var label;
|
640
|
+
|
641
|
+
if (options.controllerAs && angular.isString(options.controllerAs)) {
|
642
|
+
label = options.controllerAs;
|
643
|
+
}
|
644
|
+
|
645
|
+
var controllerInstance = $controller(options.controller, angular.extend(
|
646
|
+
locals,
|
647
|
+
{
|
648
|
+
$scope: scope,
|
649
|
+
$element: $dialog
|
650
|
+
}),
|
651
|
+
true,
|
652
|
+
label
|
653
|
+
);
|
654
|
+
|
655
|
+
if(options.bindToController) {
|
656
|
+
angular.extend(controllerInstance.instance, {ngDialogId: scope.ngDialogId, ngDialogData: scope.ngDialogData, closeThisDialog: scope.closeThisDialog, confirm: scope.confirm});
|
657
|
+
}
|
658
|
+
|
659
|
+
if(typeof controllerInstance === 'function'){
|
660
|
+
$dialog.data('$ngDialogControllerController', controllerInstance());
|
661
|
+
} else {
|
662
|
+
$dialog.data('$ngDialogControllerController', controllerInstance);
|
663
|
+
}
|
664
|
+
}
|
665
|
+
|
666
|
+
$timeout(function () {
|
667
|
+
var $activeDialogs = document.querySelectorAll('.ngdialog');
|
668
|
+
privateMethods.deactivateAll($activeDialogs);
|
669
|
+
|
670
|
+
$compile($dialog)(scope);
|
671
|
+
var widthDiffs = $window.innerWidth - $elements.body.prop('clientWidth');
|
672
|
+
$elements.html.addClass(options.bodyClassName);
|
673
|
+
$elements.body.addClass(options.bodyClassName);
|
674
|
+
activeBodyClasses.push(options.bodyClassName);
|
675
|
+
var scrollBarWidth = widthDiffs - ($window.innerWidth - $elements.body.prop('clientWidth'));
|
676
|
+
if (scrollBarWidth > 0) {
|
677
|
+
privateMethods.setBodyPadding(scrollBarWidth);
|
678
|
+
}
|
679
|
+
$dialogParent.append($dialog);
|
680
|
+
|
681
|
+
privateMethods.activate($dialog);
|
682
|
+
|
683
|
+
if (options.trapFocus) {
|
684
|
+
privateMethods.autoFocus($dialog);
|
685
|
+
}
|
686
|
+
|
687
|
+
if (options.name) {
|
688
|
+
$rootScope.$broadcast('ngDialog.opened', {dialog: $dialog, name: options.name});
|
689
|
+
} else {
|
690
|
+
$rootScope.$broadcast('ngDialog.opened', $dialog);
|
691
|
+
}
|
692
|
+
var onOpenCallback = $dialog.data('$ngDialogOnOpenCallback');
|
693
|
+
if (onOpenCallback && angular.isFunction(onOpenCallback)) {
|
694
|
+
onOpenCallback.call($dialog);
|
695
|
+
}
|
696
|
+
|
697
|
+
});
|
698
|
+
|
699
|
+
if (!keydownIsBound) {
|
700
|
+
$elements.body.bind('keydown', privateMethods.onDocumentKeydown);
|
701
|
+
keydownIsBound = true;
|
702
|
+
}
|
703
|
+
|
704
|
+
if (options.closeByNavigation) {
|
705
|
+
closeByNavigationDialogStack.push($dialog);
|
706
|
+
}
|
707
|
+
|
708
|
+
if (options.preserveFocus) {
|
709
|
+
$dialog.data('$ngDialogPreviousFocus', document.activeElement);
|
710
|
+
}
|
711
|
+
|
712
|
+
closeByDocumentHandler = function (event) {
|
713
|
+
var isOverlay = options.closeByDocument ? $el(event.target).hasClass('ngdialog-overlay') : false;
|
714
|
+
var isCloseBtn = $el(event.target).hasClass('ngdialog-close');
|
715
|
+
|
716
|
+
if (isOverlay || isCloseBtn) {
|
717
|
+
publicMethods.close($dialog.attr('id'), isCloseBtn ? '$closeButton' : '$document');
|
718
|
+
}
|
719
|
+
};
|
720
|
+
|
721
|
+
if (typeof $window.Hammer !== 'undefined') {
|
722
|
+
var hammerTime = scope.hammerTime = $window.Hammer($dialog[0]);
|
723
|
+
hammerTime.on('tap', closeByDocumentHandler);
|
724
|
+
} else {
|
725
|
+
$dialog.bind('click', closeByDocumentHandler);
|
726
|
+
}
|
727
|
+
|
728
|
+
dialogsCount += 1;
|
729
|
+
|
730
|
+
return publicMethods;
|
731
|
+
});
|
732
|
+
|
733
|
+
return {
|
734
|
+
id: dialogID,
|
735
|
+
closePromise: defer.promise,
|
736
|
+
close: function (value) {
|
737
|
+
privateMethods.closeDialog($dialog, value);
|
738
|
+
}
|
739
|
+
};
|
740
|
+
|
741
|
+
function loadTemplateUrl (tmpl, config) {
|
742
|
+
var config = config || {};
|
743
|
+
config.headers = config.headers || {};
|
744
|
+
|
745
|
+
angular.extend(config.headers, {'Accept': 'text/html'});
|
746
|
+
|
747
|
+
$rootScope.$broadcast('ngDialog.templateLoading', tmpl);
|
748
|
+
return $http.get(tmpl, config).then(function(res) {
|
749
|
+
$rootScope.$broadcast('ngDialog.templateLoaded', tmpl);
|
750
|
+
return res.data || '';
|
751
|
+
});
|
752
|
+
}
|
753
|
+
|
754
|
+
function loadTemplate (tmpl) {
|
755
|
+
if (!tmpl) {
|
756
|
+
return 'Empty template';
|
757
|
+
}
|
758
|
+
|
759
|
+
if (angular.isString(tmpl) && options.plain) {
|
760
|
+
return tmpl;
|
761
|
+
}
|
762
|
+
|
763
|
+
if (typeof options.cache === 'boolean' && !options.cache) {
|
764
|
+
return loadTemplateUrl(tmpl, {cache: false});
|
765
|
+
}
|
766
|
+
|
767
|
+
return loadTemplateUrl(tmpl, {cache: $templateCache});
|
768
|
+
}
|
769
|
+
},
|
770
|
+
|
771
|
+
/*
|
772
|
+
* @param {Object} options:
|
773
|
+
* - template {String} - id of ng-template, url for partial, plain string (if enabled)
|
774
|
+
* - plain {Boolean} - enable plain string templates, default false
|
775
|
+
* - name {String}
|
776
|
+
* - scope {Object}
|
777
|
+
* - controller {String}
|
778
|
+
* - controllerAs {String}
|
779
|
+
* - className {String} - dialog theme class
|
780
|
+
* - appendClassName {String} - dialog theme class to be appended to defaults
|
781
|
+
* - showClose {Boolean} - show close button, default true
|
782
|
+
* - closeByEscape {Boolean} - default false
|
783
|
+
* - closeByDocument {Boolean} - default false
|
784
|
+
* - preCloseCallback {String|Function} - user supplied function name/function called before closing dialog (if set); not called on confirm
|
785
|
+
* - bodyClassName {String} - class added to body at open dialog
|
786
|
+
*
|
787
|
+
* @return {Object} dialog
|
788
|
+
*/
|
789
|
+
openConfirm: function (opts) {
|
790
|
+
var defer = $q.defer();
|
791
|
+
var options = angular.copy(defaults);
|
792
|
+
|
793
|
+
opts = opts || {};
|
794
|
+
|
795
|
+
// Merge opts.data with predefined via setDefaults
|
796
|
+
if (typeof options.data !== 'undefined') {
|
797
|
+
if (typeof opts.data === 'undefined') {
|
798
|
+
opts.data = {};
|
799
|
+
}
|
800
|
+
opts.data = angular.merge(angular.copy(options.data), opts.data);
|
801
|
+
}
|
802
|
+
|
803
|
+
angular.extend(options, opts);
|
804
|
+
|
805
|
+
options.scope = angular.isObject(options.scope) ? options.scope.$new() : $rootScope.$new();
|
806
|
+
options.scope.confirm = function (value) {
|
807
|
+
defer.resolve(value);
|
808
|
+
var $dialog = $el(document.getElementById(openResult.id));
|
809
|
+
privateMethods.performCloseDialog($dialog, value);
|
810
|
+
};
|
811
|
+
|
812
|
+
var openResult = publicMethods.open(options);
|
813
|
+
if (openResult) {
|
814
|
+
openResult.closePromise.then(function (data) {
|
815
|
+
if (data) {
|
816
|
+
return defer.reject(data.value);
|
817
|
+
}
|
818
|
+
return defer.reject();
|
819
|
+
});
|
820
|
+
return defer.promise;
|
821
|
+
}
|
822
|
+
},
|
823
|
+
|
824
|
+
isOpen: function(id) {
|
825
|
+
var $dialog = $el(document.getElementById(id));
|
826
|
+
return $dialog.length > 0;
|
827
|
+
},
|
828
|
+
|
829
|
+
/*
|
830
|
+
* @param {String} id
|
831
|
+
* @return {Object} dialog
|
832
|
+
*/
|
833
|
+
close: function (id, value) {
|
834
|
+
var $dialog = $el(document.getElementById(id));
|
835
|
+
|
836
|
+
if ($dialog.length) {
|
837
|
+
privateMethods.closeDialog($dialog, value);
|
838
|
+
} else {
|
839
|
+
if (id === '$escape') {
|
840
|
+
var topDialogId = openIdStack[openIdStack.length - 1];
|
841
|
+
$dialog = $el(document.getElementById(topDialogId));
|
842
|
+
if ($dialog.data('$ngDialogOptions').closeByEscape) {
|
843
|
+
privateMethods.closeDialog($dialog, '$escape');
|
844
|
+
}
|
845
|
+
} else {
|
846
|
+
publicMethods.closeAll(value);
|
847
|
+
}
|
848
|
+
}
|
849
|
+
|
850
|
+
return publicMethods;
|
851
|
+
},
|
852
|
+
|
853
|
+
closeAll: function (value) {
|
854
|
+
var $all = document.querySelectorAll('.ngdialog');
|
855
|
+
|
856
|
+
// Reverse order to ensure focus restoration works as expected
|
857
|
+
for (var i = $all.length - 1; i >= 0; i--) {
|
858
|
+
var dialog = $all[i];
|
859
|
+
privateMethods.closeDialog($el(dialog), value);
|
860
|
+
}
|
861
|
+
},
|
862
|
+
|
863
|
+
getOpenDialogs: function() {
|
864
|
+
return openIdStack;
|
865
|
+
},
|
866
|
+
|
867
|
+
getDefaults: function () {
|
868
|
+
return defaults;
|
869
|
+
}
|
870
|
+
};
|
871
|
+
|
872
|
+
angular.forEach(
|
873
|
+
['html', 'body'],
|
874
|
+
function(elementName) {
|
875
|
+
$elements[elementName] = $document.find(elementName);
|
876
|
+
if (forceElementsReload[elementName]) {
|
877
|
+
var eventName = privateMethods.getRouterLocationEventName();
|
878
|
+
$rootScope.$on(eventName, function () {
|
879
|
+
$elements[elementName] = $document.find(elementName);
|
880
|
+
});
|
881
|
+
}
|
882
|
+
}
|
883
|
+
);
|
884
|
+
|
885
|
+
// Listen to navigation events to close dialog
|
886
|
+
var uiRouterVersion = privateMethods.detectUIRouter();
|
887
|
+
if (uiRouterVersion === UI_ROUTER_VERSION_ONE_PLUS) {
|
888
|
+
var $transitions = $injector.get('$transitions');
|
889
|
+
$transitions.onStart({}, function (trans) {
|
890
|
+
while (closeByNavigationDialogStack.length > 0) {
|
891
|
+
var toCloseDialog = closeByNavigationDialogStack.pop();
|
892
|
+
if (privateMethods.closeDialog(toCloseDialog) === false) {
|
893
|
+
return false;
|
894
|
+
}
|
895
|
+
}
|
896
|
+
});
|
897
|
+
}
|
898
|
+
else {
|
899
|
+
var eventName = uiRouterVersion === UI_ROUTER_VERSION_LEGACY ? '$stateChangeStart' : '$locationChangeStart';
|
900
|
+
$rootScope.$on(eventName, function ($event) {
|
901
|
+
while (closeByNavigationDialogStack.length > 0) {
|
902
|
+
var toCloseDialog = closeByNavigationDialogStack.pop();
|
903
|
+
if (privateMethods.closeDialog(toCloseDialog) === false) {
|
904
|
+
$event.preventDefault();
|
905
|
+
}
|
906
|
+
}
|
907
|
+
});
|
908
|
+
}
|
909
|
+
|
910
|
+
return publicMethods;
|
911
|
+
}];
|
912
|
+
});
|
913
|
+
|
914
|
+
m.directive('ngDialog', ['ngDialog', function (ngDialog) {
|
915
|
+
return {
|
916
|
+
restrict: 'A',
|
917
|
+
scope: {
|
918
|
+
ngDialogScope: '='
|
919
|
+
},
|
920
|
+
link: function (scope, elem, attrs) {
|
921
|
+
elem.on('click', function (e) {
|
922
|
+
e.preventDefault();
|
923
|
+
|
924
|
+
var ngDialogScope = angular.isDefined(scope.ngDialogScope) ? scope.ngDialogScope : 'noScope';
|
925
|
+
angular.isDefined(attrs.ngDialogClosePrevious) && ngDialog.close(attrs.ngDialogClosePrevious);
|
926
|
+
|
927
|
+
var defaults = ngDialog.getDefaults();
|
928
|
+
|
929
|
+
ngDialog.open({
|
930
|
+
template: attrs.ngDialog,
|
931
|
+
className: attrs.ngDialogClass || defaults.className,
|
932
|
+
appendClassName: attrs.ngDialogAppendClass,
|
933
|
+
controller: attrs.ngDialogController,
|
934
|
+
controllerAs: attrs.ngDialogControllerAs,
|
935
|
+
bindToController: attrs.ngDialogBindToController,
|
936
|
+
disableAnimation: attrs.ngDialogDisableAnimation,
|
937
|
+
scope: ngDialogScope,
|
938
|
+
data: attrs.ngDialogData,
|
939
|
+
showClose: attrs.ngDialogShowClose === 'false' ? false : (attrs.ngDialogShowClose === 'true' ? true : defaults.showClose),
|
940
|
+
closeByDocument: attrs.ngDialogCloseByDocument === 'false' ? false : (attrs.ngDialogCloseByDocument === 'true' ? true : defaults.closeByDocument),
|
941
|
+
closeByEscape: attrs.ngDialogCloseByEscape === 'false' ? false : (attrs.ngDialogCloseByEscape === 'true' ? true : defaults.closeByEscape),
|
942
|
+
overlay: attrs.ngDialogOverlay === 'false' ? false : (attrs.ngDialogOverlay === 'true' ? true : defaults.overlay),
|
943
|
+
preCloseCallback: attrs.ngDialogPreCloseCallback || defaults.preCloseCallback,
|
944
|
+
onOpenCallback: attrs.ngDialogOnOpenCallback || defaults.onOpenCallback,
|
945
|
+
bodyClassName: attrs.ngDialogBodyClass || defaults.bodyClassName
|
946
|
+
});
|
947
|
+
});
|
948
|
+
}
|
949
|
+
};
|
950
|
+
}]);
|
951
|
+
|
952
|
+
return m;
|
953
|
+
}));
|
@@ -0,0 +1,188 @@
|
|
1
|
+
@-webkit-keyframes ngdialog-flyin {
|
2
|
+
0% {
|
3
|
+
opacity: 0;
|
4
|
+
-webkit-transform: translateY(-40px);
|
5
|
+
transform: translateY(-40px);
|
6
|
+
}
|
7
|
+
|
8
|
+
100% {
|
9
|
+
opacity: 1;
|
10
|
+
-webkit-transform: translateY(0);
|
11
|
+
transform: translateY(0);
|
12
|
+
}
|
13
|
+
}
|
14
|
+
|
15
|
+
@keyframes ngdialog-flyin {
|
16
|
+
0% {
|
17
|
+
opacity: 0;
|
18
|
+
-webkit-transform: translateY(-40px);
|
19
|
+
transform: translateY(-40px);
|
20
|
+
}
|
21
|
+
|
22
|
+
100% {
|
23
|
+
opacity: 1;
|
24
|
+
-webkit-transform: translateY(0);
|
25
|
+
transform: translateY(0);
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
@-webkit-keyframes ngdialog-flyout {
|
30
|
+
0% {
|
31
|
+
opacity: 1;
|
32
|
+
-webkit-transform: translateY(0);
|
33
|
+
transform: translateY(0);
|
34
|
+
}
|
35
|
+
|
36
|
+
100% {
|
37
|
+
opacity: 0;
|
38
|
+
-webkit-transform: translateY(-40px);
|
39
|
+
transform: translateY(-40px);
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
@keyframes ngdialog-flyout {
|
44
|
+
0% {
|
45
|
+
opacity: 1;
|
46
|
+
-webkit-transform: translateY(0);
|
47
|
+
transform: translateY(0);
|
48
|
+
}
|
49
|
+
|
50
|
+
100% {
|
51
|
+
opacity: 0;
|
52
|
+
-webkit-transform: translateY(-40px);
|
53
|
+
transform: translateY(-40px);
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
.ngdialog.ngdialog-theme-default {
|
58
|
+
padding-bottom: 160px;
|
59
|
+
padding-top: 160px;
|
60
|
+
}
|
61
|
+
|
62
|
+
.ngdialog.ngdialog-theme-default.ngdialog-closing .ngdialog-content {
|
63
|
+
-webkit-animation: ngdialog-flyout .5s;
|
64
|
+
animation: ngdialog-flyout .5s;
|
65
|
+
}
|
66
|
+
|
67
|
+
.ngdialog.ngdialog-theme-default .ngdialog-content {
|
68
|
+
-webkit-animation: ngdialog-flyin .5s;
|
69
|
+
animation: ngdialog-flyin .5s;
|
70
|
+
background: #f0f0f0;
|
71
|
+
border-radius: 5px;
|
72
|
+
color: #444;
|
73
|
+
font-family: 'Helvetica',sans-serif;
|
74
|
+
font-size: 1.1em;
|
75
|
+
line-height: 1.5em;
|
76
|
+
margin: 0 auto;
|
77
|
+
max-width: 100%;
|
78
|
+
padding: 1em;
|
79
|
+
position: relative;
|
80
|
+
width: 450px;
|
81
|
+
}
|
82
|
+
|
83
|
+
.ngdialog.ngdialog-theme-default .ngdialog-close {
|
84
|
+
border: none;
|
85
|
+
background: transparent;
|
86
|
+
cursor: pointer;
|
87
|
+
position: absolute;
|
88
|
+
right: 0;
|
89
|
+
top: 0;
|
90
|
+
}
|
91
|
+
|
92
|
+
.ngdialog.ngdialog-theme-default .ngdialog-close:before {
|
93
|
+
display: block;
|
94
|
+
padding: 3px;
|
95
|
+
background: transparent;
|
96
|
+
color: #bbb;
|
97
|
+
content: '\00D7';
|
98
|
+
font-size: 26px;
|
99
|
+
font-weight: 400;
|
100
|
+
line-height: 26px;
|
101
|
+
text-align: center;
|
102
|
+
}
|
103
|
+
|
104
|
+
.ngdialog.ngdialog-theme-default .ngdialog-close:hover:before,
|
105
|
+
.ngdialog.ngdialog-theme-default .ngdialog-close:active:before {
|
106
|
+
color: #777;
|
107
|
+
}
|
108
|
+
|
109
|
+
.ngdialog.ngdialog-theme-default .ngdialog-message {
|
110
|
+
margin-bottom: .5em;
|
111
|
+
}
|
112
|
+
|
113
|
+
.ngdialog.ngdialog-theme-default .ngdialog-input {
|
114
|
+
margin-bottom: 1em;
|
115
|
+
}
|
116
|
+
|
117
|
+
.ngdialog.ngdialog-theme-default .ngdialog-input textarea,
|
118
|
+
.ngdialog.ngdialog-theme-default .ngdialog-input input[type="text"],
|
119
|
+
.ngdialog.ngdialog-theme-default .ngdialog-input input[type="password"],
|
120
|
+
.ngdialog.ngdialog-theme-default .ngdialog-input input[type="email"],
|
121
|
+
.ngdialog.ngdialog-theme-default .ngdialog-input input[type="url"] {
|
122
|
+
background: #fff;
|
123
|
+
border: 0;
|
124
|
+
border-radius: 3px;
|
125
|
+
font-family: inherit;
|
126
|
+
font-size: inherit;
|
127
|
+
font-weight: inherit;
|
128
|
+
margin: 0 0 .25em;
|
129
|
+
min-height: 2.5em;
|
130
|
+
padding: .25em .67em;
|
131
|
+
width: 100%;
|
132
|
+
}
|
133
|
+
|
134
|
+
.ngdialog.ngdialog-theme-default .ngdialog-input textarea:focus,
|
135
|
+
.ngdialog.ngdialog-theme-default .ngdialog-input input[type="text"]:focus,
|
136
|
+
.ngdialog.ngdialog-theme-default .ngdialog-input input[type="password"]:focus,
|
137
|
+
.ngdialog.ngdialog-theme-default .ngdialog-input input[type="email"]:focus,
|
138
|
+
.ngdialog.ngdialog-theme-default .ngdialog-input input[type="url"]:focus {
|
139
|
+
box-shadow: inset 0 0 0 2px #8dbdf1;
|
140
|
+
outline: none;
|
141
|
+
}
|
142
|
+
|
143
|
+
.ngdialog.ngdialog-theme-default .ngdialog-buttons {
|
144
|
+
*zoom: 1;
|
145
|
+
}
|
146
|
+
|
147
|
+
.ngdialog.ngdialog-theme-default .ngdialog-buttons:after {
|
148
|
+
content: '';
|
149
|
+
display: table;
|
150
|
+
clear: both;
|
151
|
+
}
|
152
|
+
|
153
|
+
.ngdialog.ngdialog-theme-default .ngdialog-button {
|
154
|
+
border: 0;
|
155
|
+
border-radius: 3px;
|
156
|
+
cursor: pointer;
|
157
|
+
float: right;
|
158
|
+
font-family: inherit;
|
159
|
+
font-size: .8em;
|
160
|
+
letter-spacing: .1em;
|
161
|
+
line-height: 1em;
|
162
|
+
margin: 0 0 0 .5em;
|
163
|
+
padding: .75em 2em;
|
164
|
+
text-transform: uppercase;
|
165
|
+
}
|
166
|
+
|
167
|
+
.ngdialog.ngdialog-theme-default .ngdialog-button:focus {
|
168
|
+
-webkit-animation: ngdialog-pulse 1.1s infinite;
|
169
|
+
animation: ngdialog-pulse 1.1s infinite;
|
170
|
+
outline: none;
|
171
|
+
}
|
172
|
+
|
173
|
+
@media (max-width: 568px) {
|
174
|
+
.ngdialog.ngdialog-theme-default .ngdialog-button:focus {
|
175
|
+
-webkit-animation: none;
|
176
|
+
animation: none;
|
177
|
+
}
|
178
|
+
}
|
179
|
+
|
180
|
+
.ngdialog.ngdialog-theme-default .ngdialog-button.ngdialog-button-primary {
|
181
|
+
background: #3288e6;
|
182
|
+
color: #fff;
|
183
|
+
}
|
184
|
+
|
185
|
+
.ngdialog.ngdialog-theme-default .ngdialog-button.ngdialog-button-secondary {
|
186
|
+
background: #e0e0e0;
|
187
|
+
color: #777;
|
188
|
+
}
|
@@ -0,0 +1,121 @@
|
|
1
|
+
@-webkit-keyframes ngdialog-fadeout {
|
2
|
+
0% {
|
3
|
+
opacity: 1;
|
4
|
+
}
|
5
|
+
|
6
|
+
100% {
|
7
|
+
opacity: 0;
|
8
|
+
}
|
9
|
+
}
|
10
|
+
|
11
|
+
@keyframes ngdialog-fadeout {
|
12
|
+
0% {
|
13
|
+
opacity: 1;
|
14
|
+
}
|
15
|
+
|
16
|
+
100% {
|
17
|
+
opacity: 0;
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
@-webkit-keyframes ngdialog-fadein {
|
22
|
+
0% {
|
23
|
+
opacity: 0;
|
24
|
+
}
|
25
|
+
|
26
|
+
100% {
|
27
|
+
opacity: 1;
|
28
|
+
}
|
29
|
+
}
|
30
|
+
|
31
|
+
@keyframes ngdialog-fadein {
|
32
|
+
0% {
|
33
|
+
opacity: 0;
|
34
|
+
}
|
35
|
+
|
36
|
+
100% {
|
37
|
+
opacity: 1;
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
.ngdialog {
|
42
|
+
box-sizing: border-box;
|
43
|
+
}
|
44
|
+
|
45
|
+
.ngdialog *,
|
46
|
+
.ngdialog *:before,
|
47
|
+
.ngdialog *:after {
|
48
|
+
box-sizing: inherit;
|
49
|
+
}
|
50
|
+
|
51
|
+
.ngdialog {
|
52
|
+
position: fixed;
|
53
|
+
overflow: auto;
|
54
|
+
-webkit-overflow-scrolling: touch;
|
55
|
+
z-index: 10000;
|
56
|
+
top: 0;
|
57
|
+
right: 0;
|
58
|
+
bottom: 0;
|
59
|
+
left: 0;
|
60
|
+
/* fix for Scrollbars not clickable on overflow #552 */
|
61
|
+
background: rgba(0, 0, 0, 0.4);
|
62
|
+
animation: ngdialog-fadein 0.5s;
|
63
|
+
/* end fix for Scrollbars not clickable on overflow #552 */
|
64
|
+
}
|
65
|
+
|
66
|
+
.ngdialog.ngdialog-disabled-animation,
|
67
|
+
.ngdialog.ngdialog-disabled-animation .ngdialog-overlay,
|
68
|
+
.ngdialog.ngdialog-disabled-animation .ngdialog-content {
|
69
|
+
-webkit-animation: none!important;
|
70
|
+
animation: none!important;
|
71
|
+
}
|
72
|
+
|
73
|
+
.ngdialog-overlay {
|
74
|
+
position: fixed;
|
75
|
+
top: 0;
|
76
|
+
right: 0;
|
77
|
+
bottom: 0;
|
78
|
+
left: 0;
|
79
|
+
-webkit-backface-visibility: hidden;
|
80
|
+
-webkit-animation: ngdialog-fadein 0.5s;
|
81
|
+
animation: ngdialog-fadein 0.5s;
|
82
|
+
/* fix for Scrollbars not clickable on overflow #552 */
|
83
|
+
margin-right: 15px;
|
84
|
+
background: transparent;
|
85
|
+
/* end fix for Scrollbars not clickable on overflow #552 */
|
86
|
+
}
|
87
|
+
|
88
|
+
.ngdialog-no-overlay {
|
89
|
+
pointer-events: none;
|
90
|
+
}
|
91
|
+
|
92
|
+
.ngdialog.ngdialog-closing .ngdialog-overlay {
|
93
|
+
-webkit-backface-visibility: hidden;
|
94
|
+
-webkit-animation: ngdialog-fadeout 0.5s;
|
95
|
+
animation: ngdialog-fadeout 0.5s;
|
96
|
+
}
|
97
|
+
|
98
|
+
.ngdialog-content {
|
99
|
+
background: white;
|
100
|
+
-webkit-backface-visibility: hidden;
|
101
|
+
-webkit-animation: ngdialog-fadein 0.5s;
|
102
|
+
animation: ngdialog-fadein 0.5s;
|
103
|
+
pointer-events: all;
|
104
|
+
}
|
105
|
+
|
106
|
+
.ngdialog.ngdialog-closing .ngdialog-content {
|
107
|
+
-webkit-backface-visibility: hidden;
|
108
|
+
-webkit-animation: ngdialog-fadeout 0.5s;
|
109
|
+
animation: ngdialog-fadeout 0.5s;
|
110
|
+
}
|
111
|
+
|
112
|
+
.ngdialog-close:before {
|
113
|
+
font-family: 'Helvetica', Arial, sans-serif;
|
114
|
+
content: '\00D7';
|
115
|
+
cursor: pointer;
|
116
|
+
}
|
117
|
+
|
118
|
+
html.ngdialog-open,
|
119
|
+
body.ngdialog-open {
|
120
|
+
overflow: hidden;
|
121
|
+
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oxymoron
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kononenko Paul
|
@@ -930,6 +930,7 @@ files:
|
|
930
930
|
- vendor/assets/javascripts/oxymoron/i18n/angular-locale_zu-za.js
|
931
931
|
- vendor/assets/javascripts/oxymoron/i18n/angular-locale_zu.js
|
932
932
|
- vendor/assets/javascripts/oxymoron/jquery.min.js
|
933
|
+
- vendor/assets/javascripts/oxymoron/ng-dialog.js
|
933
934
|
- vendor/assets/javascripts/oxymoron/ng-notify.js
|
934
935
|
- vendor/assets/javascripts/oxymoron/pace.js
|
935
936
|
- vendor/assets/javascripts/oxymoron/perfect-scrollbar.js
|
@@ -937,6 +938,8 @@ files:
|
|
937
938
|
- vendor/assets/javascripts/oxymoron/underscore.js
|
938
939
|
- vendor/assets/stylesheets/.DS_Store
|
939
940
|
- vendor/assets/stylesheets/oxymoron/md-data-table.css
|
941
|
+
- vendor/assets/stylesheets/oxymoron/ng-dialog-theme-default.css
|
942
|
+
- vendor/assets/stylesheets/oxymoron/ng-dialog.css
|
940
943
|
- vendor/assets/stylesheets/oxymoron/ng-notify.css
|
941
944
|
- vendor/assets/stylesheets/oxymoron/normalize.css
|
942
945
|
- vendor/assets/stylesheets/oxymoron/pace.css
|