rails-angularstrap 2.2.0
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 +7 -0
- data/README.md +89 -0
- data/Rakefile +2 -0
- data/lib/rails/angularstrap.rb +8 -0
- data/lib/rails/angularstrap/version.rb +5 -0
- data/vendor/assets/javascripts/angular-strap/LICENSE.md +21 -0
- data/vendor/assets/javascripts/angular-strap/README.md +112 -0
- data/vendor/assets/javascripts/angular-strap/angular-strap.nuspec +23 -0
- data/vendor/assets/javascripts/angular-strap/bower.json +53 -0
- data/vendor/assets/javascripts/angular-strap/dist/angular-strap.js +5014 -0
- data/vendor/assets/javascripts/angular-strap/dist/angular-strap.min.js +11 -0
- data/vendor/assets/javascripts/angular-strap/dist/angular-strap.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/angular-strap.tpl.js +89 -0
- data/vendor/assets/javascripts/angular-strap/dist/angular-strap.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/affix.js +249 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/affix.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/affix.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/alert.js +120 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/alert.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/alert.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/alert.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/alert.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/aside.js +96 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/aside.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/aside.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/aside.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/aside.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/button.js +177 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/button.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/button.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/collapse.js +273 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/collapse.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/collapse.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/date-formatter.js +61 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/date-formatter.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/date-formatter.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/date-parser.js +273 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/date-parser.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/date-parser.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/datepicker.js +640 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/datepicker.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/datepicker.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/datepicker.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/datepicker.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/debounce.js +62 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/debounce.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/debounce.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/dimensions.js +156 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/dimensions.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/dimensions.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/dropdown.js +149 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/dropdown.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/dropdown.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/dropdown.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/dropdown.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/modal.js +349 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/modal.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/modal.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/modal.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/modal.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/navbar.js +72 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/navbar.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/navbar.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/parse-options.js +76 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/parse-options.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/parse-options.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/popover.js +112 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/popover.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/popover.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/popover.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/popover.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/raf.js +61 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/raf.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/raf.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/scrollspy.js +261 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/scrollspy.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/scrollspy.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/select.js +325 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/select.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/select.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/select.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/select.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/tab.js +186 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/tab.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/tab.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/tab.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/tab.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/timepicker.js +485 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/timepicker.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/timepicker.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/timepicker.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/timepicker.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/tooltip.js +690 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/tooltip.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/tooltip.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/tooltip.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/tooltip.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/typeahead.js +266 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/typeahead.min.js +9 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/typeahead.min.js.map +1 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/typeahead.tpl.js +14 -0
- data/vendor/assets/javascripts/angular-strap/dist/modules/typeahead.tpl.min.js +8 -0
- data/vendor/assets/javascripts/angular-strap/gulpfile.js +489 -0
- data/vendor/assets/javascripts/angular-strap/package.json +73 -0
- data/vendor/assets/javascripts/angular-strap/src/affix/affix.js +258 -0
- data/vendor/assets/javascripts/angular-strap/src/alert/alert.js +113 -0
- data/vendor/assets/javascripts/angular-strap/src/alert/alert.tpl.html +4 -0
- data/vendor/assets/javascripts/angular-strap/src/aside/aside.js +89 -0
- data/vendor/assets/javascripts/angular-strap/src/aside/aside.tpl.html +14 -0
- data/vendor/assets/javascripts/angular-strap/src/button/button.js +174 -0
- data/vendor/assets/javascripts/angular-strap/src/collapse/collapse.js +266 -0
- data/vendor/assets/javascripts/angular-strap/src/datepicker/datepicker.js +633 -0
- data/vendor/assets/javascripts/angular-strap/src/datepicker/datepicker.tpl.html +33 -0
- data/vendor/assets/javascripts/angular-strap/src/dropdown/dropdown.js +143 -0
- data/vendor/assets/javascripts/angular-strap/src/dropdown/dropdown.tpl.html +6 -0
- data/vendor/assets/javascripts/angular-strap/src/helpers/date-formatter.js +54 -0
- data/vendor/assets/javascripts/angular-strap/src/helpers/date-parser.js +266 -0
- data/vendor/assets/javascripts/angular-strap/src/helpers/debounce.js +55 -0
- data/vendor/assets/javascripts/angular-strap/src/helpers/dimensions.js +212 -0
- data/vendor/assets/javascripts/angular-strap/src/helpers/parse-options.js +69 -0
- data/vendor/assets/javascripts/angular-strap/src/helpers/raf.js +54 -0
- data/vendor/assets/javascripts/angular-strap/src/modal/modal.js +348 -0
- data/vendor/assets/javascripts/angular-strap/src/modal/modal.tpl.html +14 -0
- data/vendor/assets/javascripts/angular-strap/src/module.js +19 -0
- data/vendor/assets/javascripts/angular-strap/src/navbar/navbar.js +65 -0
- data/vendor/assets/javascripts/angular-strap/src/popover/popover.js +111 -0
- data/vendor/assets/javascripts/angular-strap/src/popover/popover.tpl.html +5 -0
- data/vendor/assets/javascripts/angular-strap/src/scrollspy/scrollspy.js +254 -0
- data/vendor/assets/javascripts/angular-strap/src/select/select.js +321 -0
- data/vendor/assets/javascripts/angular-strap/src/select/select.tpl.html +14 -0
- data/vendor/assets/javascripts/angular-strap/src/tab/tab.js +183 -0
- data/vendor/assets/javascripts/angular-strap/src/tab/tab.tpl.html +7 -0
- data/vendor/assets/javascripts/angular-strap/src/timepicker/timepicker.js +493 -0
- data/vendor/assets/javascripts/angular-strap/src/timepicker/timepicker.tpl.html +62 -0
- data/vendor/assets/javascripts/angular-strap/src/tooltip/tooltip.js +806 -0
- data/vendor/assets/javascripts/angular-strap/src/tooltip/tooltip.tpl.html +4 -0
- data/vendor/assets/javascripts/angular-strap/src/typeahead/typeahead.js +262 -0
- data/vendor/assets/javascripts/angular-strap/src/typeahead/typeahead.tpl.html +5 -0
- data/vendor/assets/javascripts/angular/README.md +64 -0
- data/vendor/assets/javascripts/angular/angular-csp.css +13 -0
- data/vendor/assets/javascripts/angular/angular.js +26181 -0
- data/vendor/assets/javascripts/angular/angular.min.js +250 -0
- data/vendor/assets/javascripts/angular/angular.min.js.gzip +0 -0
- data/vendor/assets/javascripts/angular/angular.min.js.map +8 -0
- data/vendor/assets/javascripts/angular/bower.json +8 -0
- data/vendor/assets/javascripts/angular/index.js +2 -0
- data/vendor/assets/javascripts/angular/package.json +25 -0
- metadata +237 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
angular.module('mgcrea.ngStrap.helpers.debounce', [])
|
|
4
|
+
|
|
5
|
+
// @source jashkenas/underscore
|
|
6
|
+
// @url https://github.com/jashkenas/underscore/blob/1.5.2/underscore.js#L693
|
|
7
|
+
.factory('debounce', function($timeout) {
|
|
8
|
+
return function(func, wait, immediate) {
|
|
9
|
+
var timeout = null;
|
|
10
|
+
return function() {
|
|
11
|
+
var context = this,
|
|
12
|
+
args = arguments,
|
|
13
|
+
callNow = immediate && !timeout;
|
|
14
|
+
if(timeout) {
|
|
15
|
+
$timeout.cancel(timeout);
|
|
16
|
+
}
|
|
17
|
+
timeout = $timeout(function later() {
|
|
18
|
+
timeout = null;
|
|
19
|
+
if(!immediate) {
|
|
20
|
+
func.apply(context, args);
|
|
21
|
+
}
|
|
22
|
+
}, wait, false);
|
|
23
|
+
if(callNow) {
|
|
24
|
+
func.apply(context, args);
|
|
25
|
+
}
|
|
26
|
+
return timeout;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
// @source jashkenas/underscore
|
|
33
|
+
// @url https://github.com/jashkenas/underscore/blob/1.5.2/underscore.js#L661
|
|
34
|
+
.factory('throttle', function($timeout) {
|
|
35
|
+
return function(func, wait, options) {
|
|
36
|
+
var timeout = null;
|
|
37
|
+
options || (options = {});
|
|
38
|
+
return function() {
|
|
39
|
+
var context = this,
|
|
40
|
+
args = arguments;
|
|
41
|
+
if(!timeout) {
|
|
42
|
+
if(options.leading !== false) {
|
|
43
|
+
func.apply(context, args);
|
|
44
|
+
}
|
|
45
|
+
timeout = $timeout(function later() {
|
|
46
|
+
timeout = null;
|
|
47
|
+
if(options.trailing !== false) {
|
|
48
|
+
func.apply(context, args);
|
|
49
|
+
}
|
|
50
|
+
}, wait, false);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
angular.module('mgcrea.ngStrap.helpers.dimensions', [])
|
|
4
|
+
|
|
5
|
+
.factory('dimensions', function($document, $window) {
|
|
6
|
+
|
|
7
|
+
var jqLite = angular.element;
|
|
8
|
+
var fn = {};
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Test the element nodeName
|
|
12
|
+
* @param element
|
|
13
|
+
* @param name
|
|
14
|
+
*/
|
|
15
|
+
var nodeName = fn.nodeName = function(element, name) {
|
|
16
|
+
return element.nodeName && element.nodeName.toLowerCase() === name.toLowerCase();
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Returns the element computed style
|
|
21
|
+
* @param element
|
|
22
|
+
* @param prop
|
|
23
|
+
* @param extra
|
|
24
|
+
*/
|
|
25
|
+
fn.css = function(element, prop, extra) {
|
|
26
|
+
var value;
|
|
27
|
+
if (element.currentStyle) { //IE
|
|
28
|
+
value = element.currentStyle[prop];
|
|
29
|
+
} else if (window.getComputedStyle) {
|
|
30
|
+
value = window.getComputedStyle(element)[prop];
|
|
31
|
+
} else {
|
|
32
|
+
value = element.style[prop];
|
|
33
|
+
}
|
|
34
|
+
return extra === true ? parseFloat(value) || 0 : value;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Provides read-only equivalent of jQuery's offset function:
|
|
39
|
+
* @required-by bootstrap-tooltip, bootstrap-affix
|
|
40
|
+
* @url http://api.jquery.com/offset/
|
|
41
|
+
* @param element
|
|
42
|
+
*/
|
|
43
|
+
fn.offset = function(element) {
|
|
44
|
+
var boxRect = element.getBoundingClientRect();
|
|
45
|
+
var docElement = element.ownerDocument;
|
|
46
|
+
return {
|
|
47
|
+
width: boxRect.width || element.offsetWidth,
|
|
48
|
+
height: boxRect.height || element.offsetHeight,
|
|
49
|
+
top: boxRect.top + (window.pageYOffset || docElement.documentElement.scrollTop) - (docElement.documentElement.clientTop || 0),
|
|
50
|
+
left: boxRect.left + (window.pageXOffset || docElement.documentElement.scrollLeft) - (docElement.documentElement.clientLeft || 0)
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Provides set equivalent of jQuery's offset function:
|
|
56
|
+
* @required-by bootstrap-tooltip
|
|
57
|
+
* @url http://api.jquery.com/offset/
|
|
58
|
+
* @param element
|
|
59
|
+
* @param options
|
|
60
|
+
* @param i
|
|
61
|
+
*/
|
|
62
|
+
fn.setOffset = function (element, options, i) {
|
|
63
|
+
var curPosition,
|
|
64
|
+
curLeft,
|
|
65
|
+
curCSSTop,
|
|
66
|
+
curTop,
|
|
67
|
+
curOffset,
|
|
68
|
+
curCSSLeft,
|
|
69
|
+
calculatePosition,
|
|
70
|
+
position = fn.css(element, 'position'),
|
|
71
|
+
curElem = angular.element(element),
|
|
72
|
+
props = {};
|
|
73
|
+
|
|
74
|
+
// Set position first, in-case top/left are set even on static elem
|
|
75
|
+
if (position === 'static') {
|
|
76
|
+
element.style.position = 'relative';
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
curOffset = fn.offset(element);
|
|
80
|
+
curCSSTop = fn.css(element, 'top');
|
|
81
|
+
curCSSLeft = fn.css(element, 'left');
|
|
82
|
+
calculatePosition = (position === 'absolute' || position === 'fixed') &&
|
|
83
|
+
(curCSSTop + curCSSLeft).indexOf('auto') > -1;
|
|
84
|
+
|
|
85
|
+
// Need to be able to calculate position if either
|
|
86
|
+
// top or left is auto and position is either absolute or fixed
|
|
87
|
+
if (calculatePosition) {
|
|
88
|
+
curPosition = fn.position(element);
|
|
89
|
+
curTop = curPosition.top;
|
|
90
|
+
curLeft = curPosition.left;
|
|
91
|
+
} else {
|
|
92
|
+
curTop = parseFloat(curCSSTop) || 0;
|
|
93
|
+
curLeft = parseFloat(curCSSLeft) || 0;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (angular.isFunction(options)) {
|
|
97
|
+
options = options.call(element, i, curOffset);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (options.top !== null ) {
|
|
101
|
+
props.top = (options.top - curOffset.top) + curTop;
|
|
102
|
+
}
|
|
103
|
+
if ( options.left !== null ) {
|
|
104
|
+
props.left = (options.left - curOffset.left) + curLeft;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if ('using' in options) {
|
|
108
|
+
options.using.call(curElem, props);
|
|
109
|
+
} else {
|
|
110
|
+
curElem.css({
|
|
111
|
+
top: props.top + 'px',
|
|
112
|
+
left: props.left + 'px'
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Provides read-only equivalent of jQuery's position function
|
|
119
|
+
* @required-by bootstrap-tooltip, bootstrap-affix
|
|
120
|
+
* @url http://api.jquery.com/offset/
|
|
121
|
+
* @param element
|
|
122
|
+
*/
|
|
123
|
+
fn.position = function(element) {
|
|
124
|
+
|
|
125
|
+
var offsetParentRect = {top: 0, left: 0},
|
|
126
|
+
offsetParentElement,
|
|
127
|
+
offset;
|
|
128
|
+
|
|
129
|
+
// Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
|
|
130
|
+
if (fn.css(element, 'position') === 'fixed') {
|
|
131
|
+
|
|
132
|
+
// We assume that getBoundingClientRect is available when computed position is fixed
|
|
133
|
+
offset = element.getBoundingClientRect();
|
|
134
|
+
|
|
135
|
+
} else {
|
|
136
|
+
|
|
137
|
+
// Get *real* offsetParentElement
|
|
138
|
+
offsetParentElement = offsetParent(element);
|
|
139
|
+
|
|
140
|
+
// Get correct offsets
|
|
141
|
+
offset = fn.offset(element);
|
|
142
|
+
if (!nodeName(offsetParentElement, 'html')) {
|
|
143
|
+
offsetParentRect = fn.offset(offsetParentElement);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Add offsetParent borders
|
|
147
|
+
offsetParentRect.top += fn.css(offsetParentElement, 'borderTopWidth', true);
|
|
148
|
+
offsetParentRect.left += fn.css(offsetParentElement, 'borderLeftWidth', true);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Subtract parent offsets and element margins
|
|
152
|
+
return {
|
|
153
|
+
width: element.offsetWidth,
|
|
154
|
+
height: element.offsetHeight,
|
|
155
|
+
top: offset.top - offsetParentRect.top - fn.css(element, 'marginTop', true),
|
|
156
|
+
left: offset.left - offsetParentRect.left - fn.css(element, 'marginLeft', true)
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Returns the closest, non-statically positioned offsetParent of a given element
|
|
163
|
+
* @required-by fn.position
|
|
164
|
+
* @param element
|
|
165
|
+
*/
|
|
166
|
+
var offsetParent = function offsetParentElement(element) {
|
|
167
|
+
var docElement = element.ownerDocument;
|
|
168
|
+
var offsetParent = element.offsetParent || docElement;
|
|
169
|
+
if(nodeName(offsetParent, '#document')) return docElement.documentElement;
|
|
170
|
+
while(offsetParent && !nodeName(offsetParent, 'html') && fn.css(offsetParent, 'position') === 'static') {
|
|
171
|
+
offsetParent = offsetParent.offsetParent;
|
|
172
|
+
}
|
|
173
|
+
return offsetParent || docElement.documentElement;
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Provides equivalent of jQuery's height function
|
|
178
|
+
* @required-by bootstrap-affix
|
|
179
|
+
* @url http://api.jquery.com/height/
|
|
180
|
+
* @param element
|
|
181
|
+
* @param outer
|
|
182
|
+
*/
|
|
183
|
+
fn.height = function(element, outer) {
|
|
184
|
+
var value = element.offsetHeight;
|
|
185
|
+
if(outer) {
|
|
186
|
+
value += fn.css(element, 'marginTop', true) + fn.css(element, 'marginBottom', true);
|
|
187
|
+
} else {
|
|
188
|
+
value -= fn.css(element, 'paddingTop', true) + fn.css(element, 'paddingBottom', true) + fn.css(element, 'borderTopWidth', true) + fn.css(element, 'borderBottomWidth', true);
|
|
189
|
+
}
|
|
190
|
+
return value;
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Provides equivalent of jQuery's width function
|
|
195
|
+
* @required-by bootstrap-affix
|
|
196
|
+
* @url http://api.jquery.com/width/
|
|
197
|
+
* @param element
|
|
198
|
+
* @param outer
|
|
199
|
+
*/
|
|
200
|
+
fn.width = function(element, outer) {
|
|
201
|
+
var value = element.offsetWidth;
|
|
202
|
+
if(outer) {
|
|
203
|
+
value += fn.css(element, 'marginLeft', true) + fn.css(element, 'marginRight', true);
|
|
204
|
+
} else {
|
|
205
|
+
value -= fn.css(element, 'paddingLeft', true) + fn.css(element, 'paddingRight', true) + fn.css(element, 'borderLeftWidth', true) + fn.css(element, 'borderRightWidth', true);
|
|
206
|
+
}
|
|
207
|
+
return value;
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
return fn;
|
|
211
|
+
|
|
212
|
+
});
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
angular.module('mgcrea.ngStrap.helpers.parseOptions', [])
|
|
4
|
+
|
|
5
|
+
.provider('$parseOptions', function() {
|
|
6
|
+
|
|
7
|
+
var defaults = this.defaults = {
|
|
8
|
+
regexp: /^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
this.$get = function($parse, $q) {
|
|
12
|
+
|
|
13
|
+
function ParseOptionsFactory(attr, config) {
|
|
14
|
+
|
|
15
|
+
var $parseOptions = {};
|
|
16
|
+
|
|
17
|
+
// Common vars
|
|
18
|
+
var options = angular.extend({}, defaults, config);
|
|
19
|
+
$parseOptions.$values = [];
|
|
20
|
+
|
|
21
|
+
// Private vars
|
|
22
|
+
var match, displayFn, valueName, keyName, groupByFn, valueFn, valuesFn;
|
|
23
|
+
|
|
24
|
+
$parseOptions.init = function() {
|
|
25
|
+
$parseOptions.$match = match = attr.match(options.regexp);
|
|
26
|
+
displayFn = $parse(match[2] || match[1]),
|
|
27
|
+
valueName = match[4] || match[6],
|
|
28
|
+
keyName = match[5],
|
|
29
|
+
groupByFn = $parse(match[3] || ''),
|
|
30
|
+
valueFn = $parse(match[2] ? match[1] : valueName),
|
|
31
|
+
valuesFn = $parse(match[7]);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
$parseOptions.valuesFn = function(scope, controller) {
|
|
35
|
+
return $q.when(valuesFn(scope, controller))
|
|
36
|
+
.then(function(values) {
|
|
37
|
+
$parseOptions.$values = values ? parseValues(values, scope) : {};
|
|
38
|
+
return $parseOptions.$values;
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
$parseOptions.displayValue = function(modelValue) {
|
|
43
|
+
var scope = {};
|
|
44
|
+
scope[valueName] = modelValue;
|
|
45
|
+
return displayFn(scope);
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// Private functions
|
|
49
|
+
|
|
50
|
+
function parseValues(values, scope) {
|
|
51
|
+
return values.map(function(match, index) {
|
|
52
|
+
var locals = {}, label, value;
|
|
53
|
+
locals[valueName] = match;
|
|
54
|
+
label = displayFn(scope, locals);
|
|
55
|
+
value = valueFn(scope, locals);
|
|
56
|
+
return {label: label, value: value, index: index};
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
$parseOptions.init();
|
|
61
|
+
return $parseOptions;
|
|
62
|
+
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return ParseOptionsFactory;
|
|
66
|
+
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
(angular.version.minor < 3 && angular.version.dot < 14) && angular.module('ng')
|
|
4
|
+
|
|
5
|
+
.factory('$$rAF', function($window, $timeout) {
|
|
6
|
+
|
|
7
|
+
var requestAnimationFrame = $window.requestAnimationFrame ||
|
|
8
|
+
$window.webkitRequestAnimationFrame ||
|
|
9
|
+
$window.mozRequestAnimationFrame;
|
|
10
|
+
|
|
11
|
+
var cancelAnimationFrame = $window.cancelAnimationFrame ||
|
|
12
|
+
$window.webkitCancelAnimationFrame ||
|
|
13
|
+
$window.mozCancelAnimationFrame ||
|
|
14
|
+
$window.webkitCancelRequestAnimationFrame;
|
|
15
|
+
|
|
16
|
+
var rafSupported = !!requestAnimationFrame;
|
|
17
|
+
var raf = rafSupported ?
|
|
18
|
+
function(fn) {
|
|
19
|
+
var id = requestAnimationFrame(fn);
|
|
20
|
+
return function() {
|
|
21
|
+
cancelAnimationFrame(id);
|
|
22
|
+
};
|
|
23
|
+
} :
|
|
24
|
+
function(fn) {
|
|
25
|
+
var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666
|
|
26
|
+
return function() {
|
|
27
|
+
$timeout.cancel(timer);
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
raf.supported = rafSupported;
|
|
32
|
+
|
|
33
|
+
return raf;
|
|
34
|
+
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// .factory('$$animateReflow', function($$rAF, $document) {
|
|
38
|
+
|
|
39
|
+
// var bodyEl = $document[0].body;
|
|
40
|
+
|
|
41
|
+
// return function(fn) {
|
|
42
|
+
// //the returned function acts as the cancellation function
|
|
43
|
+
// return $$rAF(function() {
|
|
44
|
+
// //the line below will force the browser to perform a repaint
|
|
45
|
+
// //so that all the animated elements within the animation frame
|
|
46
|
+
// //will be properly updated and drawn on screen. This is
|
|
47
|
+
// //required to perform multi-class CSS based animations with
|
|
48
|
+
// //Firefox. DO NOT REMOVE THIS LINE.
|
|
49
|
+
// var a = bodyEl.offsetWidth + 1;
|
|
50
|
+
// fn();
|
|
51
|
+
// });
|
|
52
|
+
// };
|
|
53
|
+
|
|
54
|
+
// });
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
angular.module('mgcrea.ngStrap.modal', ['mgcrea.ngStrap.helpers.dimensions'])
|
|
4
|
+
|
|
5
|
+
.provider('$modal', function() {
|
|
6
|
+
|
|
7
|
+
var defaults = this.defaults = {
|
|
8
|
+
animation: 'am-fade',
|
|
9
|
+
backdropAnimation: 'am-fade',
|
|
10
|
+
prefixClass: 'modal',
|
|
11
|
+
prefixEvent: 'modal',
|
|
12
|
+
placement: 'top',
|
|
13
|
+
template: 'modal/modal.tpl.html',
|
|
14
|
+
contentTemplate: false,
|
|
15
|
+
container: false,
|
|
16
|
+
element: null,
|
|
17
|
+
backdrop: true,
|
|
18
|
+
keyboard: true,
|
|
19
|
+
html: false,
|
|
20
|
+
show: true
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
this.$get = function($window, $rootScope, $compile, $q, $templateCache, $http, $animate, $timeout, $sce, dimensions) {
|
|
24
|
+
|
|
25
|
+
var forEach = angular.forEach;
|
|
26
|
+
var trim = String.prototype.trim;
|
|
27
|
+
var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;
|
|
28
|
+
var bodyElement = angular.element($window.document.body);
|
|
29
|
+
var htmlReplaceRegExp = /ng-bind="/ig;
|
|
30
|
+
|
|
31
|
+
function ModalFactory(config) {
|
|
32
|
+
|
|
33
|
+
var $modal = {};
|
|
34
|
+
|
|
35
|
+
// Common vars
|
|
36
|
+
var options = $modal.$options = angular.extend({}, defaults, config);
|
|
37
|
+
$modal.$promise = fetchTemplate(options.template);
|
|
38
|
+
var scope = $modal.$scope = options.scope && options.scope.$new() || $rootScope.$new();
|
|
39
|
+
if(!options.element && !options.container) {
|
|
40
|
+
options.container = 'body';
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// store $id to identify the triggering element in events
|
|
44
|
+
// give priority to options.id, otherwise, try to use
|
|
45
|
+
// element id if defined
|
|
46
|
+
$modal.$id = options.id || options.element && options.element.attr('id') || '';
|
|
47
|
+
|
|
48
|
+
// Support scope as string options
|
|
49
|
+
forEach(['title', 'content'], function(key) {
|
|
50
|
+
if(options[key]) scope[key] = $sce.trustAsHtml(options[key]);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// Provide scope helpers
|
|
54
|
+
scope.$hide = function() {
|
|
55
|
+
scope.$$postDigest(function() {
|
|
56
|
+
$modal.hide();
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
scope.$show = function() {
|
|
60
|
+
scope.$$postDigest(function() {
|
|
61
|
+
$modal.show();
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
scope.$toggle = function() {
|
|
65
|
+
scope.$$postDigest(function() {
|
|
66
|
+
$modal.toggle();
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
// Publish isShown as a protected var on scope
|
|
70
|
+
$modal.$isShown = scope.$isShown = false;
|
|
71
|
+
|
|
72
|
+
// Support contentTemplate option
|
|
73
|
+
if(options.contentTemplate) {
|
|
74
|
+
$modal.$promise = $modal.$promise.then(function(template) {
|
|
75
|
+
var templateEl = angular.element(template);
|
|
76
|
+
return fetchTemplate(options.contentTemplate)
|
|
77
|
+
.then(function(contentTemplate) {
|
|
78
|
+
var contentEl = findElement('[ng-bind="content"]', templateEl[0]).removeAttr('ng-bind').html(contentTemplate);
|
|
79
|
+
// Drop the default footer as you probably don't want it if you use a custom contentTemplate
|
|
80
|
+
if(!config.template) contentEl.next().remove();
|
|
81
|
+
return templateEl[0].outerHTML;
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Fetch, compile then initialize modal
|
|
87
|
+
var modalLinker, modalElement;
|
|
88
|
+
var backdropElement = angular.element('<div class="' + options.prefixClass + '-backdrop"/>');
|
|
89
|
+
$modal.$promise.then(function(template) {
|
|
90
|
+
if(angular.isObject(template)) template = template.data;
|
|
91
|
+
if(options.html) template = template.replace(htmlReplaceRegExp, 'ng-bind-html="');
|
|
92
|
+
template = trim.apply(template);
|
|
93
|
+
modalLinker = $compile(template);
|
|
94
|
+
$modal.init();
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
$modal.init = function() {
|
|
98
|
+
|
|
99
|
+
// Options: show
|
|
100
|
+
if(options.show) {
|
|
101
|
+
scope.$$postDigest(function() {
|
|
102
|
+
$modal.show();
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
$modal.destroy = function() {
|
|
109
|
+
|
|
110
|
+
// Remove element
|
|
111
|
+
if(modalElement) {
|
|
112
|
+
modalElement.remove();
|
|
113
|
+
modalElement = null;
|
|
114
|
+
}
|
|
115
|
+
if(backdropElement) {
|
|
116
|
+
backdropElement.remove();
|
|
117
|
+
backdropElement = null;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Destroy scope
|
|
121
|
+
scope.$destroy();
|
|
122
|
+
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
$modal.show = function() {
|
|
126
|
+
if($modal.$isShown) return;
|
|
127
|
+
|
|
128
|
+
var parent, after;
|
|
129
|
+
if(angular.isElement(options.container)) {
|
|
130
|
+
parent = options.container;
|
|
131
|
+
after = options.container[0].lastChild ? angular.element(options.container[0].lastChild) : null;
|
|
132
|
+
} else {
|
|
133
|
+
if (options.container) {
|
|
134
|
+
parent = findElement(options.container);
|
|
135
|
+
after = parent[0].lastChild ? angular.element(parent[0].lastChild) : null;
|
|
136
|
+
} else {
|
|
137
|
+
parent = null;
|
|
138
|
+
after = options.element;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Fetch a cloned element linked from template
|
|
143
|
+
modalElement = $modal.$element = modalLinker(scope, function(clonedElement, scope) {});
|
|
144
|
+
|
|
145
|
+
if(scope.$emit(options.prefixEvent + '.show.before', $modal).defaultPrevented) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Set the initial positioning.
|
|
150
|
+
modalElement.css({display: 'block'}).addClass(options.placement);
|
|
151
|
+
|
|
152
|
+
// Options: animation
|
|
153
|
+
if(options.animation) {
|
|
154
|
+
if(options.backdrop) {
|
|
155
|
+
backdropElement.addClass(options.backdropAnimation);
|
|
156
|
+
}
|
|
157
|
+
modalElement.addClass(options.animation);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if(options.backdrop) {
|
|
161
|
+
$animate.enter(backdropElement, bodyElement, null);
|
|
162
|
+
}
|
|
163
|
+
// Support v1.3+ $animate
|
|
164
|
+
// https://github.com/angular/angular.js/commit/bf0f5502b1bbfddc5cdd2f138efd9188b8c652a9
|
|
165
|
+
var promise = $animate.enter(modalElement, parent, after, enterAnimateCallback);
|
|
166
|
+
if(promise && promise.then) promise.then(enterAnimateCallback);
|
|
167
|
+
|
|
168
|
+
$modal.$isShown = scope.$isShown = true;
|
|
169
|
+
safeDigest(scope);
|
|
170
|
+
// Focus once the enter-animation has started
|
|
171
|
+
// Weird PhantomJS bug hack
|
|
172
|
+
var el = modalElement[0];
|
|
173
|
+
requestAnimationFrame(function() {
|
|
174
|
+
el.focus();
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
bodyElement.addClass(options.prefixClass + '-open');
|
|
178
|
+
if(options.animation) {
|
|
179
|
+
bodyElement.addClass(options.prefixClass + '-with-' + options.animation);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Bind events
|
|
183
|
+
if(options.backdrop) {
|
|
184
|
+
modalElement.on('click', hideOnBackdropClick);
|
|
185
|
+
backdropElement.on('click', hideOnBackdropClick);
|
|
186
|
+
backdropElement.on('wheel', preventEventDefault);
|
|
187
|
+
}
|
|
188
|
+
if(options.keyboard) {
|
|
189
|
+
modalElement.on('keyup', $modal.$onKeyUp);
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
function enterAnimateCallback() {
|
|
194
|
+
scope.$emit(options.prefixEvent + '.show', $modal);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
$modal.hide = function() {
|
|
198
|
+
if(!$modal.$isShown) return;
|
|
199
|
+
|
|
200
|
+
if(scope.$emit(options.prefixEvent + '.hide.before', $modal).defaultPrevented) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
var promise = $animate.leave(modalElement, leaveAnimateCallback);
|
|
204
|
+
// Support v1.3+ $animate
|
|
205
|
+
// https://github.com/angular/angular.js/commit/bf0f5502b1bbfddc5cdd2f138efd9188b8c652a9
|
|
206
|
+
if(promise && promise.then) promise.then(leaveAnimateCallback);
|
|
207
|
+
|
|
208
|
+
if(options.backdrop) {
|
|
209
|
+
$animate.leave(backdropElement);
|
|
210
|
+
}
|
|
211
|
+
$modal.$isShown = scope.$isShown = false;
|
|
212
|
+
safeDigest(scope);
|
|
213
|
+
|
|
214
|
+
// Unbind events
|
|
215
|
+
if(options.backdrop) {
|
|
216
|
+
modalElement.off('click', hideOnBackdropClick);
|
|
217
|
+
backdropElement.off('click', hideOnBackdropClick);
|
|
218
|
+
backdropElement.off('wheel', preventEventDefault);
|
|
219
|
+
}
|
|
220
|
+
if(options.keyboard) {
|
|
221
|
+
modalElement.off('keyup', $modal.$onKeyUp);
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
function leaveAnimateCallback() {
|
|
226
|
+
scope.$emit(options.prefixEvent + '.hide', $modal);
|
|
227
|
+
bodyElement.removeClass(options.prefixClass + '-open');
|
|
228
|
+
if(options.animation) {
|
|
229
|
+
bodyElement.removeClass(options.prefixClass + '-with-' + options.animation);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
$modal.toggle = function() {
|
|
234
|
+
|
|
235
|
+
$modal.$isShown ? $modal.hide() : $modal.show();
|
|
236
|
+
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
$modal.focus = function() {
|
|
240
|
+
modalElement[0].focus();
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
// Protected methods
|
|
244
|
+
|
|
245
|
+
$modal.$onKeyUp = function(evt) {
|
|
246
|
+
|
|
247
|
+
if (evt.which === 27 && $modal.$isShown) {
|
|
248
|
+
$modal.hide();
|
|
249
|
+
evt.stopPropagation();
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
// Private methods
|
|
255
|
+
|
|
256
|
+
function hideOnBackdropClick(evt) {
|
|
257
|
+
if(evt.target !== evt.currentTarget) return;
|
|
258
|
+
options.backdrop === 'static' ? $modal.focus() : $modal.hide();
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function preventEventDefault(evt) {
|
|
262
|
+
evt.preventDefault();
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
return $modal;
|
|
266
|
+
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Helper functions
|
|
270
|
+
|
|
271
|
+
function safeDigest(scope) {
|
|
272
|
+
scope.$$phase || (scope.$root && scope.$root.$$phase) || scope.$digest();
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
function findElement(query, element) {
|
|
276
|
+
return angular.element((element || document).querySelectorAll(query));
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
var fetchPromises = {};
|
|
280
|
+
function fetchTemplate(template) {
|
|
281
|
+
if(fetchPromises[template]) return fetchPromises[template];
|
|
282
|
+
return (fetchPromises[template] = $http.get(template, {cache: $templateCache}).then(function(res) {
|
|
283
|
+
return res.data;
|
|
284
|
+
}));
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
return ModalFactory;
|
|
288
|
+
|
|
289
|
+
};
|
|
290
|
+
|
|
291
|
+
})
|
|
292
|
+
|
|
293
|
+
.directive('bsModal', function($window, $sce, $modal) {
|
|
294
|
+
|
|
295
|
+
return {
|
|
296
|
+
restrict: 'EAC',
|
|
297
|
+
scope: true,
|
|
298
|
+
link: function postLink(scope, element, attr, transclusion) {
|
|
299
|
+
|
|
300
|
+
// Directive options
|
|
301
|
+
var options = {scope: scope, element: element, show: false};
|
|
302
|
+
angular.forEach(['template', 'contentTemplate', 'placement', 'container', 'animation', 'id'], function(key) {
|
|
303
|
+
if(angular.isDefined(attr[key])) options[key] = attr[key];
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
// use string regex match for boolean values
|
|
307
|
+
var falseValueRegExp = /^(false|0|)$/;
|
|
308
|
+
angular.forEach(['keyboard', 'html'], function(key) {
|
|
309
|
+
if(angular.isDefined(attr[key])) options[key] = !falseValueRegExp.test(attr[key]);
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
if(angular.isDefined(attr.backdrop)) {
|
|
313
|
+
options.backdrop = falseValueRegExp.test(attr.backdrop) ? false : attr.backdrop;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Support scope as data-attrs
|
|
317
|
+
angular.forEach(['title', 'content'], function(key) {
|
|
318
|
+
attr[key] && attr.$observe(key, function(newValue, oldValue) {
|
|
319
|
+
scope[key] = $sce.trustAsHtml(newValue);
|
|
320
|
+
});
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
// Support scope as an object
|
|
324
|
+
attr.bsModal && scope.$watch(attr.bsModal, function(newValue, oldValue) {
|
|
325
|
+
if(angular.isObject(newValue)) {
|
|
326
|
+
angular.extend(scope, newValue);
|
|
327
|
+
} else {
|
|
328
|
+
scope.content = newValue;
|
|
329
|
+
}
|
|
330
|
+
}, true);
|
|
331
|
+
|
|
332
|
+
// Initialize modal
|
|
333
|
+
var modal = $modal(options);
|
|
334
|
+
|
|
335
|
+
// Trigger
|
|
336
|
+
element.on(attr.trigger || 'click', modal.toggle);
|
|
337
|
+
|
|
338
|
+
// Garbage collection
|
|
339
|
+
scope.$on('$destroy', function() {
|
|
340
|
+
if (modal) modal.destroy();
|
|
341
|
+
options = null;
|
|
342
|
+
modal = null;
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
|
|
348
|
+
});
|