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.
Files changed (148) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +89 -0
  3. data/Rakefile +2 -0
  4. data/lib/rails/angularstrap.rb +8 -0
  5. data/lib/rails/angularstrap/version.rb +5 -0
  6. data/vendor/assets/javascripts/angular-strap/LICENSE.md +21 -0
  7. data/vendor/assets/javascripts/angular-strap/README.md +112 -0
  8. data/vendor/assets/javascripts/angular-strap/angular-strap.nuspec +23 -0
  9. data/vendor/assets/javascripts/angular-strap/bower.json +53 -0
  10. data/vendor/assets/javascripts/angular-strap/dist/angular-strap.js +5014 -0
  11. data/vendor/assets/javascripts/angular-strap/dist/angular-strap.min.js +11 -0
  12. data/vendor/assets/javascripts/angular-strap/dist/angular-strap.min.js.map +1 -0
  13. data/vendor/assets/javascripts/angular-strap/dist/angular-strap.tpl.js +89 -0
  14. data/vendor/assets/javascripts/angular-strap/dist/angular-strap.tpl.min.js +8 -0
  15. data/vendor/assets/javascripts/angular-strap/dist/modules/affix.js +249 -0
  16. data/vendor/assets/javascripts/angular-strap/dist/modules/affix.min.js +9 -0
  17. data/vendor/assets/javascripts/angular-strap/dist/modules/affix.min.js.map +1 -0
  18. data/vendor/assets/javascripts/angular-strap/dist/modules/alert.js +120 -0
  19. data/vendor/assets/javascripts/angular-strap/dist/modules/alert.min.js +9 -0
  20. data/vendor/assets/javascripts/angular-strap/dist/modules/alert.min.js.map +1 -0
  21. data/vendor/assets/javascripts/angular-strap/dist/modules/alert.tpl.js +14 -0
  22. data/vendor/assets/javascripts/angular-strap/dist/modules/alert.tpl.min.js +8 -0
  23. data/vendor/assets/javascripts/angular-strap/dist/modules/aside.js +96 -0
  24. data/vendor/assets/javascripts/angular-strap/dist/modules/aside.min.js +9 -0
  25. data/vendor/assets/javascripts/angular-strap/dist/modules/aside.min.js.map +1 -0
  26. data/vendor/assets/javascripts/angular-strap/dist/modules/aside.tpl.js +14 -0
  27. data/vendor/assets/javascripts/angular-strap/dist/modules/aside.tpl.min.js +8 -0
  28. data/vendor/assets/javascripts/angular-strap/dist/modules/button.js +177 -0
  29. data/vendor/assets/javascripts/angular-strap/dist/modules/button.min.js +9 -0
  30. data/vendor/assets/javascripts/angular-strap/dist/modules/button.min.js.map +1 -0
  31. data/vendor/assets/javascripts/angular-strap/dist/modules/collapse.js +273 -0
  32. data/vendor/assets/javascripts/angular-strap/dist/modules/collapse.min.js +9 -0
  33. data/vendor/assets/javascripts/angular-strap/dist/modules/collapse.min.js.map +1 -0
  34. data/vendor/assets/javascripts/angular-strap/dist/modules/date-formatter.js +61 -0
  35. data/vendor/assets/javascripts/angular-strap/dist/modules/date-formatter.min.js +9 -0
  36. data/vendor/assets/javascripts/angular-strap/dist/modules/date-formatter.min.js.map +1 -0
  37. data/vendor/assets/javascripts/angular-strap/dist/modules/date-parser.js +273 -0
  38. data/vendor/assets/javascripts/angular-strap/dist/modules/date-parser.min.js +9 -0
  39. data/vendor/assets/javascripts/angular-strap/dist/modules/date-parser.min.js.map +1 -0
  40. data/vendor/assets/javascripts/angular-strap/dist/modules/datepicker.js +640 -0
  41. data/vendor/assets/javascripts/angular-strap/dist/modules/datepicker.min.js +9 -0
  42. data/vendor/assets/javascripts/angular-strap/dist/modules/datepicker.min.js.map +1 -0
  43. data/vendor/assets/javascripts/angular-strap/dist/modules/datepicker.tpl.js +14 -0
  44. data/vendor/assets/javascripts/angular-strap/dist/modules/datepicker.tpl.min.js +8 -0
  45. data/vendor/assets/javascripts/angular-strap/dist/modules/debounce.js +62 -0
  46. data/vendor/assets/javascripts/angular-strap/dist/modules/debounce.min.js +9 -0
  47. data/vendor/assets/javascripts/angular-strap/dist/modules/debounce.min.js.map +1 -0
  48. data/vendor/assets/javascripts/angular-strap/dist/modules/dimensions.js +156 -0
  49. data/vendor/assets/javascripts/angular-strap/dist/modules/dimensions.min.js +9 -0
  50. data/vendor/assets/javascripts/angular-strap/dist/modules/dimensions.min.js.map +1 -0
  51. data/vendor/assets/javascripts/angular-strap/dist/modules/dropdown.js +149 -0
  52. data/vendor/assets/javascripts/angular-strap/dist/modules/dropdown.min.js +9 -0
  53. data/vendor/assets/javascripts/angular-strap/dist/modules/dropdown.min.js.map +1 -0
  54. data/vendor/assets/javascripts/angular-strap/dist/modules/dropdown.tpl.js +14 -0
  55. data/vendor/assets/javascripts/angular-strap/dist/modules/dropdown.tpl.min.js +8 -0
  56. data/vendor/assets/javascripts/angular-strap/dist/modules/modal.js +349 -0
  57. data/vendor/assets/javascripts/angular-strap/dist/modules/modal.min.js +9 -0
  58. data/vendor/assets/javascripts/angular-strap/dist/modules/modal.min.js.map +1 -0
  59. data/vendor/assets/javascripts/angular-strap/dist/modules/modal.tpl.js +14 -0
  60. data/vendor/assets/javascripts/angular-strap/dist/modules/modal.tpl.min.js +8 -0
  61. data/vendor/assets/javascripts/angular-strap/dist/modules/navbar.js +72 -0
  62. data/vendor/assets/javascripts/angular-strap/dist/modules/navbar.min.js +9 -0
  63. data/vendor/assets/javascripts/angular-strap/dist/modules/navbar.min.js.map +1 -0
  64. data/vendor/assets/javascripts/angular-strap/dist/modules/parse-options.js +76 -0
  65. data/vendor/assets/javascripts/angular-strap/dist/modules/parse-options.min.js +9 -0
  66. data/vendor/assets/javascripts/angular-strap/dist/modules/parse-options.min.js.map +1 -0
  67. data/vendor/assets/javascripts/angular-strap/dist/modules/popover.js +112 -0
  68. data/vendor/assets/javascripts/angular-strap/dist/modules/popover.min.js +9 -0
  69. data/vendor/assets/javascripts/angular-strap/dist/modules/popover.min.js.map +1 -0
  70. data/vendor/assets/javascripts/angular-strap/dist/modules/popover.tpl.js +14 -0
  71. data/vendor/assets/javascripts/angular-strap/dist/modules/popover.tpl.min.js +8 -0
  72. data/vendor/assets/javascripts/angular-strap/dist/modules/raf.js +61 -0
  73. data/vendor/assets/javascripts/angular-strap/dist/modules/raf.min.js +9 -0
  74. data/vendor/assets/javascripts/angular-strap/dist/modules/raf.min.js.map +1 -0
  75. data/vendor/assets/javascripts/angular-strap/dist/modules/scrollspy.js +261 -0
  76. data/vendor/assets/javascripts/angular-strap/dist/modules/scrollspy.min.js +9 -0
  77. data/vendor/assets/javascripts/angular-strap/dist/modules/scrollspy.min.js.map +1 -0
  78. data/vendor/assets/javascripts/angular-strap/dist/modules/select.js +325 -0
  79. data/vendor/assets/javascripts/angular-strap/dist/modules/select.min.js +9 -0
  80. data/vendor/assets/javascripts/angular-strap/dist/modules/select.min.js.map +1 -0
  81. data/vendor/assets/javascripts/angular-strap/dist/modules/select.tpl.js +14 -0
  82. data/vendor/assets/javascripts/angular-strap/dist/modules/select.tpl.min.js +8 -0
  83. data/vendor/assets/javascripts/angular-strap/dist/modules/tab.js +186 -0
  84. data/vendor/assets/javascripts/angular-strap/dist/modules/tab.min.js +9 -0
  85. data/vendor/assets/javascripts/angular-strap/dist/modules/tab.min.js.map +1 -0
  86. data/vendor/assets/javascripts/angular-strap/dist/modules/tab.tpl.js +14 -0
  87. data/vendor/assets/javascripts/angular-strap/dist/modules/tab.tpl.min.js +8 -0
  88. data/vendor/assets/javascripts/angular-strap/dist/modules/timepicker.js +485 -0
  89. data/vendor/assets/javascripts/angular-strap/dist/modules/timepicker.min.js +9 -0
  90. data/vendor/assets/javascripts/angular-strap/dist/modules/timepicker.min.js.map +1 -0
  91. data/vendor/assets/javascripts/angular-strap/dist/modules/timepicker.tpl.js +14 -0
  92. data/vendor/assets/javascripts/angular-strap/dist/modules/timepicker.tpl.min.js +8 -0
  93. data/vendor/assets/javascripts/angular-strap/dist/modules/tooltip.js +690 -0
  94. data/vendor/assets/javascripts/angular-strap/dist/modules/tooltip.min.js +9 -0
  95. data/vendor/assets/javascripts/angular-strap/dist/modules/tooltip.min.js.map +1 -0
  96. data/vendor/assets/javascripts/angular-strap/dist/modules/tooltip.tpl.js +14 -0
  97. data/vendor/assets/javascripts/angular-strap/dist/modules/tooltip.tpl.min.js +8 -0
  98. data/vendor/assets/javascripts/angular-strap/dist/modules/typeahead.js +266 -0
  99. data/vendor/assets/javascripts/angular-strap/dist/modules/typeahead.min.js +9 -0
  100. data/vendor/assets/javascripts/angular-strap/dist/modules/typeahead.min.js.map +1 -0
  101. data/vendor/assets/javascripts/angular-strap/dist/modules/typeahead.tpl.js +14 -0
  102. data/vendor/assets/javascripts/angular-strap/dist/modules/typeahead.tpl.min.js +8 -0
  103. data/vendor/assets/javascripts/angular-strap/gulpfile.js +489 -0
  104. data/vendor/assets/javascripts/angular-strap/package.json +73 -0
  105. data/vendor/assets/javascripts/angular-strap/src/affix/affix.js +258 -0
  106. data/vendor/assets/javascripts/angular-strap/src/alert/alert.js +113 -0
  107. data/vendor/assets/javascripts/angular-strap/src/alert/alert.tpl.html +4 -0
  108. data/vendor/assets/javascripts/angular-strap/src/aside/aside.js +89 -0
  109. data/vendor/assets/javascripts/angular-strap/src/aside/aside.tpl.html +14 -0
  110. data/vendor/assets/javascripts/angular-strap/src/button/button.js +174 -0
  111. data/vendor/assets/javascripts/angular-strap/src/collapse/collapse.js +266 -0
  112. data/vendor/assets/javascripts/angular-strap/src/datepicker/datepicker.js +633 -0
  113. data/vendor/assets/javascripts/angular-strap/src/datepicker/datepicker.tpl.html +33 -0
  114. data/vendor/assets/javascripts/angular-strap/src/dropdown/dropdown.js +143 -0
  115. data/vendor/assets/javascripts/angular-strap/src/dropdown/dropdown.tpl.html +6 -0
  116. data/vendor/assets/javascripts/angular-strap/src/helpers/date-formatter.js +54 -0
  117. data/vendor/assets/javascripts/angular-strap/src/helpers/date-parser.js +266 -0
  118. data/vendor/assets/javascripts/angular-strap/src/helpers/debounce.js +55 -0
  119. data/vendor/assets/javascripts/angular-strap/src/helpers/dimensions.js +212 -0
  120. data/vendor/assets/javascripts/angular-strap/src/helpers/parse-options.js +69 -0
  121. data/vendor/assets/javascripts/angular-strap/src/helpers/raf.js +54 -0
  122. data/vendor/assets/javascripts/angular-strap/src/modal/modal.js +348 -0
  123. data/vendor/assets/javascripts/angular-strap/src/modal/modal.tpl.html +14 -0
  124. data/vendor/assets/javascripts/angular-strap/src/module.js +19 -0
  125. data/vendor/assets/javascripts/angular-strap/src/navbar/navbar.js +65 -0
  126. data/vendor/assets/javascripts/angular-strap/src/popover/popover.js +111 -0
  127. data/vendor/assets/javascripts/angular-strap/src/popover/popover.tpl.html +5 -0
  128. data/vendor/assets/javascripts/angular-strap/src/scrollspy/scrollspy.js +254 -0
  129. data/vendor/assets/javascripts/angular-strap/src/select/select.js +321 -0
  130. data/vendor/assets/javascripts/angular-strap/src/select/select.tpl.html +14 -0
  131. data/vendor/assets/javascripts/angular-strap/src/tab/tab.js +183 -0
  132. data/vendor/assets/javascripts/angular-strap/src/tab/tab.tpl.html +7 -0
  133. data/vendor/assets/javascripts/angular-strap/src/timepicker/timepicker.js +493 -0
  134. data/vendor/assets/javascripts/angular-strap/src/timepicker/timepicker.tpl.html +62 -0
  135. data/vendor/assets/javascripts/angular-strap/src/tooltip/tooltip.js +806 -0
  136. data/vendor/assets/javascripts/angular-strap/src/tooltip/tooltip.tpl.html +4 -0
  137. data/vendor/assets/javascripts/angular-strap/src/typeahead/typeahead.js +262 -0
  138. data/vendor/assets/javascripts/angular-strap/src/typeahead/typeahead.tpl.html +5 -0
  139. data/vendor/assets/javascripts/angular/README.md +64 -0
  140. data/vendor/assets/javascripts/angular/angular-csp.css +13 -0
  141. data/vendor/assets/javascripts/angular/angular.js +26181 -0
  142. data/vendor/assets/javascripts/angular/angular.min.js +250 -0
  143. data/vendor/assets/javascripts/angular/angular.min.js.gzip +0 -0
  144. data/vendor/assets/javascripts/angular/angular.min.js.map +8 -0
  145. data/vendor/assets/javascripts/angular/bower.json +8 -0
  146. data/vendor/assets/javascripts/angular/index.js +2 -0
  147. data/vendor/assets/javascripts/angular/package.json +25 -0
  148. 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
+ });