angularjs-rails 1.3.3 → 1.3.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (27) hide show
  1. checksums.yaml +4 -4
  2. data/lib/angularjs-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/angular-animate.js +14 -14
  4. data/vendor/assets/javascripts/angular-aria.js +1 -1
  5. data/vendor/assets/javascripts/angular-cookies.js +1 -1
  6. data/vendor/assets/javascripts/angular-loader.js +2 -2
  7. data/vendor/assets/javascripts/angular-messages.js +1 -1
  8. data/vendor/assets/javascripts/angular-mocks.js +1 -1
  9. data/vendor/assets/javascripts/angular-resource.js +1 -1
  10. data/vendor/assets/javascripts/angular-route.js +3 -3
  11. data/vendor/assets/javascripts/angular-sanitize.js +7 -7
  12. data/vendor/assets/javascripts/angular-scenario.js +354 -190
  13. data/vendor/assets/javascripts/angular-touch.js +1 -1
  14. data/vendor/assets/javascripts/angular.js +354 -190
  15. data/vendor/assets/javascripts/unstable/angular-animate.js +14 -14
  16. data/vendor/assets/javascripts/unstable/angular-aria.js +1 -1
  17. data/vendor/assets/javascripts/unstable/angular-cookies.js +1 -1
  18. data/vendor/assets/javascripts/unstable/angular-loader.js +2 -2
  19. data/vendor/assets/javascripts/unstable/angular-messages.js +1 -1
  20. data/vendor/assets/javascripts/unstable/angular-mocks.js +1 -1
  21. data/vendor/assets/javascripts/unstable/angular-resource.js +1 -1
  22. data/vendor/assets/javascripts/unstable/angular-route.js +3 -3
  23. data/vendor/assets/javascripts/unstable/angular-sanitize.js +7 -7
  24. data/vendor/assets/javascripts/unstable/angular-scenario.js +354 -190
  25. data/vendor/assets/javascripts/unstable/angular-touch.js +1 -1
  26. data/vendor/assets/javascripts/unstable/angular.js +354 -190
  27. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 692800e1f539e50a1abdf5c8e9f185fcfd2a27e9
4
- data.tar.gz: 143518fca83eb56c30f56338a3063ae2c17a8e84
3
+ metadata.gz: 3ae72b7e0305c5b2d4aca7f98928e84b2428a48f
4
+ data.tar.gz: 972db5f45dd94d99a1ccffefdc8b21a0d3425851
5
5
  SHA512:
6
- metadata.gz: 7dd28987a3e83aa9d49189a75581e47bf38a204576a300ae2c2849d21174f9875c956b126a074572655635c1d5f6f96211fd51d1aaefebd42f3afa43c86753cc
7
- data.tar.gz: e33e1c60ae11ffd8f881e352b8d180a32201426929eccc36308dcb2c62bc7b7cbd98fb6eb30c6f2773e60f7469c54e5d3331be1ed397ef291ed1f0286792271d
6
+ metadata.gz: fa30a3bd8db4909c1c4dc467fca901fa0ab4f64b0d8c107fa9b3bda52b2130bc1469122318b2d27b7ccbff5a6f55018f63b2fe251216c8a0a137e266c4cca198
7
+ data.tar.gz: a5c45b492c9aa9dc0edd783e128c639b484e09542e73c17a2b8d715e225c65ea6129b71c2ed505c41c13c6d2f16925ad62afe9805212192a1b2db25f8111ea3b
@@ -1,6 +1,6 @@
1
1
  module AngularJS
2
2
  module Rails
3
- VERSION = "1.3.3"
4
- UNSTABLE_VERSION = "1.3.3"
3
+ VERSION = "1.3.4"
4
+ UNSTABLE_VERSION = "1.3.4"
5
5
  end
6
6
  end
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.3
2
+ * @license AngularJS v1.3.4
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -245,7 +245,7 @@
245
245
  * You then configure `$animate` to enforce this prefix:
246
246
  *
247
247
  * ```js
248
- * $animateProvider.classNamePrefix(/animate-/);
248
+ * $animateProvider.classNameFilter(/animate-/);
249
249
  * ```
250
250
  * </div>
251
251
  *
@@ -976,9 +976,9 @@ angular.module('ngAnimate', ['ng'])
976
976
  * | 3. $animate waits for the next digest to start the animation | class="my-animation ng-animate" |
977
977
  * | 4. the .ng-leave class is added to the element | class="my-animation ng-animate ng-leave" |
978
978
  * | 5. $animate scans the element styles to get the CSS transition/animation duration and delay | class="my-animation ng-animate ng-leave" |
979
- * | 6. $animate blocks all CSS transitions on the element to ensure the .ng-leave class styling is applied right away | class="my-animation ng-animate ng-leave |
979
+ * | 6. $animate blocks all CSS transitions on the element to ensure the .ng-leave class styling is applied right away | class="my-animation ng-animate ng-leave" |
980
980
  * | 7. $animate waits for a single animation frame (this performs a reflow) | class="my-animation ng-animate ng-leave" |
981
- * | 8. $animate removes the CSS transition block placed on the element | class="my-animation ng-animate ng-leave |
981
+ * | 8. $animate removes the CSS transition block placed on the element | class="my-animation ng-animate ng-leave" |
982
982
  * | 9. the .ng-leave-active class is added (this triggers the CSS transition/animation) | class="my-animation ng-animate ng-leave ng-leave-active" |
983
983
  * | 10. $animate waits for the animation to complete (via events and timeout) | class="my-animation ng-animate ng-leave ng-leave-active" |
984
984
  * | 11. The animation ends and all generated CSS classes are removed from the element | class="my-animation" |
@@ -1022,9 +1022,9 @@ angular.module('ngAnimate', ['ng'])
1022
1022
  * | 4. $animate runs the JavaScript-defined animations detected on the element | class="my-animation ng-animate" |
1023
1023
  * | 5. the .ng-move class is added to the element | class="my-animation ng-animate ng-move" |
1024
1024
  * | 6. $animate scans the element styles to get the CSS transition/animation duration and delay | class="my-animation ng-animate ng-move" |
1025
- * | 7. $animate blocks all CSS transitions on the element to ensure the .ng-move class styling is applied right away | class="my-animation ng-animate ng-move |
1025
+ * | 7. $animate blocks all CSS transitions on the element to ensure the .ng-move class styling is applied right away | class="my-animation ng-animate ng-move" |
1026
1026
  * | 8. $animate waits for a single animation frame (this performs a reflow) | class="my-animation ng-animate ng-move" |
1027
- * | 9. $animate removes the CSS transition block placed on the element | class="my-animation ng-animate ng-move |
1027
+ * | 9. $animate removes the CSS transition block placed on the element | class="my-animation ng-animate ng-move" |
1028
1028
  * | 10. the .ng-move-active class is added (this triggers the CSS transition/animation) | class="my-animation ng-animate ng-move ng-move-active" |
1029
1029
  * | 11. $animate waits for the animation to complete (via events and timeout) | class="my-animation ng-animate ng-move ng-move-active" |
1030
1030
  * | 12. The animation ends and all generated CSS classes are removed from the element | class="my-animation" |
@@ -1069,8 +1069,8 @@ angular.module('ngAnimate', ['ng'])
1069
1069
  * | 3. the .super-add class is added to the element | class="my-animation ng-animate super-add" |
1070
1070
  * | 4. $animate waits for a single animation frame (this performs a reflow) | class="my-animation ng-animate super-add" |
1071
1071
  * | 5. the .super and .super-add-active classes are added (this triggers the CSS transition/animation) | class="my-animation ng-animate super super-add super-add-active" |
1072
- * | 6. $animate scans the element styles to get the CSS transition/animation duration and delay | class="my-animation ng-animate super-add" |
1073
- * | 7. $animate waits for the animation to complete (via events and timeout) | class="my-animation super super-add super-add-active" |
1072
+ * | 6. $animate scans the element styles to get the CSS transition/animation duration and delay | class="my-animation ng-animate super super-add super-add-active" |
1073
+ * | 7. $animate waits for the animation to complete (via events and timeout) | class="my-animation ng-animate super super-add super-add-active" |
1074
1074
  * | 8. The animation ends and all generated CSS classes are removed from the element | class="my-animation super" |
1075
1075
  * | 9. The super class is kept on the element | class="my-animation super" |
1076
1076
  * | 10. The returned promise is resolved. | class="my-animation super" |
@@ -1103,7 +1103,7 @@ angular.module('ngAnimate', ['ng'])
1103
1103
  * | 3. the .super-remove class is added to the element | class="my-animation super ng-animate super-remove" |
1104
1104
  * | 4. $animate waits for a single animation frame (this performs a reflow) | class="my-animation super ng-animate super-remove" |
1105
1105
  * | 5. the .super-remove-active classes are added and .super is removed (this triggers the CSS transition/animation) | class="my-animation ng-animate super-remove super-remove-active" |
1106
- * | 6. $animate scans the element styles to get the CSS transition/animation duration and delay | class="my-animation super ng-animate super-remove" |
1106
+ * | 6. $animate scans the element styles to get the CSS transition/animation duration and delay | class="my-animation ng-animate super-remove super-remove-active" |
1107
1107
  * | 7. $animate waits for the animation to complete (via events and timeout) | class="my-animation ng-animate super-remove super-remove-active" |
1108
1108
  * | 8. The animation ends and all generated CSS classes are removed from the element | class="my-animation" |
1109
1109
  * | 9. The returned promise is resolved. | class="my-animation" |
@@ -1128,11 +1128,11 @@ angular.module('ngAnimate', ['ng'])
1128
1128
  *
1129
1129
  * | Animation Step | What the element class attribute looks like |
1130
1130
  * |--------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------|
1131
- * | 1. $animate.removeClass(element, on’, off) is called | class="my-animation super off|
1132
- * | 2. $animate runs the JavaScript-defined animations detected on the element | class="my-animation super ng-animate off|
1133
- * | 3. the .on-add and .off-remove classes are added to the element | class="my-animation ng-animate on-add off-remove off |
1134
- * | 4. $animate waits for a single animation frame (this performs a reflow) | class="my-animation ng-animate on-add off-remove off |
1135
- * | 5. the .on, .on-add-active and .off-remove-active classes are added and .off is removed (this triggers the CSS transition/animation) | class="my-animation ng-animate on on-add on-add-active off-remove off-remove-active |
1131
+ * | 1. $animate.setClass(element, 'on', 'off') is called | class="my-animation off" |
1132
+ * | 2. $animate runs the JavaScript-defined animations detected on the element | class="my-animation ng-animate off" |
1133
+ * | 3. the .on-add and .off-remove classes are added to the element | class="my-animation ng-animate on-add off-remove off" |
1134
+ * | 4. $animate waits for a single animation frame (this performs a reflow) | class="my-animation ng-animate on-add off-remove off" |
1135
+ * | 5. the .on, .on-add-active and .off-remove-active classes are added and .off is removed (this triggers the CSS transition/animation) | class="my-animation ng-animate on on-add on-add-active off-remove off-remove-active" |
1136
1136
  * | 6. $animate scans the element styles to get the CSS transition/animation duration and delay | class="my-animation ng-animate on on-add on-add-active off-remove off-remove-active" |
1137
1137
  * | 7. $animate waits for the animation to complete (via events and timeout) | class="my-animation ng-animate on on-add on-add-active off-remove off-remove-active" |
1138
1138
  * | 8. The animation ends and all generated CSS classes are removed from the element | class="my-animation on" |
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.3
2
+ * @license AngularJS v1.3.4
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.3
2
+ * @license AngularJS v1.3.4
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.3
2
+ * @license AngularJS v1.3.4
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -55,7 +55,7 @@ function minErr(module, ErrorConstructor) {
55
55
  return match;
56
56
  });
57
57
 
58
- message = message + '\nhttp://errors.angularjs.org/1.3.3/' +
58
+ message = message + '\nhttp://errors.angularjs.org/1.3.4/' +
59
59
  (module ? module + '/' : '') + code;
60
60
  for (i = 2; i < arguments.length; i++) {
61
61
  message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.3
2
+ * @license AngularJS v1.3.4
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.3
2
+ * @license AngularJS v1.3.4
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.3
2
+ * @license AngularJS v1.3.4
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.3
2
+ * @license AngularJS v1.3.4
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -41,7 +41,7 @@ var ngRouteModule = angular.module('ngRoute', ['ng']).
41
41
  */
42
42
  function $RouteProvider() {
43
43
  function inherit(parent, extra) {
44
- return angular.extend(new (angular.extend(function() {}, {prototype:parent}))(), extra);
44
+ return angular.extend(Object.create(parent), extra);
45
45
  }
46
46
 
47
47
  var routes = {};
@@ -657,7 +657,7 @@ function $RouteProvider() {
657
657
  if (i === 0) {
658
658
  result.push(segment);
659
659
  } else {
660
- var segmentMatch = segment.match(/(\w+)(.*)/);
660
+ var segmentMatch = segment.match(/(\w+)(?:[?*])?(.*)/);
661
661
  var key = segmentMatch[1];
662
662
  result.push(params[key]);
663
663
  result.push(segmentMatch[2] || '');
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.3
2
+ * @license AngularJS v1.3.4
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -661,13 +661,13 @@ angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {
661
661
  function addLink(url, text) {
662
662
  html.push('<a ');
663
663
  if (angular.isDefined(target)) {
664
- html.push('target="');
665
- html.push(target);
666
- html.push('" ');
664
+ html.push('target="',
665
+ target,
666
+ '" ');
667
667
  }
668
- html.push('href="');
669
- html.push(url);
670
- html.push('">');
668
+ html.push('href="',
669
+ url.replace('"', '&quot;'),
670
+ '">');
671
671
  addText(text);
672
672
  html.push('</a>');
673
673
  }
@@ -9190,7 +9190,7 @@ return jQuery;
9190
9190
  }));
9191
9191
 
9192
9192
  /**
9193
- * @license AngularJS v1.3.3
9193
+ * @license AngularJS v1.3.4
9194
9194
  * (c) 2010-2014 Google, Inc. http://angularjs.org
9195
9195
  * License: MIT
9196
9196
  */
@@ -9246,7 +9246,7 @@ function minErr(module, ErrorConstructor) {
9246
9246
  return match;
9247
9247
  });
9248
9248
 
9249
- message = message + '\nhttp://errors.angularjs.org/1.3.3/' +
9249
+ message = message + '\nhttp://errors.angularjs.org/1.3.4/' +
9250
9250
  (module ? module + '/' : '') + code;
9251
9251
  for (i = 2; i < arguments.length; i++) {
9252
9252
  message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
@@ -9618,7 +9618,7 @@ function int(str) {
9618
9618
 
9619
9619
 
9620
9620
  function inherit(parent, extra) {
9621
- return extend(new (extend(function() {}, {prototype:parent}))(), extra);
9621
+ return extend(Object.create(parent), extra);
9622
9622
  }
9623
9623
 
9624
9624
  /**
@@ -9881,7 +9881,7 @@ function makeMap(str) {
9881
9881
 
9882
9882
 
9883
9883
  function nodeName_(element) {
9884
- return lowercase(element.nodeName || element[0].nodeName);
9884
+ return lowercase(element.nodeName || (element[0] && element[0].nodeName));
9885
9885
  }
9886
9886
 
9887
9887
  function includes(array, obj) {
@@ -10587,8 +10587,8 @@ function angularInit(element, bootstrap) {
10587
10587
  * @param {Object=} config an object for defining configuration options for the application. The
10588
10588
  * following keys are supported:
10589
10589
  *
10590
- * - `strictDi`: disable automatic function annotation for the application. This is meant to
10591
- * assist in finding bugs which break minified code.
10590
+ * * `strictDi` - disable automatic function annotation for the application. This is meant to
10591
+ * assist in finding bugs which break minified code. Defaults to `false`.
10592
10592
  *
10593
10593
  * @returns {auto.$injector} Returns the newly created injector for this app.
10594
10594
  */
@@ -11292,11 +11292,11 @@ function toDebugString(obj) {
11292
11292
  * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
11293
11293
  */
11294
11294
  var version = {
11295
- full: '1.3.3', // all of these placeholder strings will be replaced by grunt's
11295
+ full: '1.3.4', // all of these placeholder strings will be replaced by grunt's
11296
11296
  major: 1, // package task
11297
11297
  minor: 3,
11298
- dot: 3,
11299
- codeName: 'undersea-arithmetic'
11298
+ dot: 4,
11299
+ codeName: 'highfalutin-petroglyph'
11300
11300
  };
11301
11301
 
11302
11302
 
@@ -11519,10 +11519,12 @@ function publishExternalAPI(angular) {
11519
11519
  * `'ngModel'`).
11520
11520
  * - `injector()` - retrieves the injector of the current element or its parent.
11521
11521
  * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current
11522
- * element or its parent.
11522
+ * element or its parent. Requires {@link guide/production#disabling-debug-data Debug Data} to
11523
+ * be enabled.
11523
11524
  * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the
11524
11525
  * current element. This getter should be used only on elements that contain a directive which starts a new isolate
11525
11526
  * scope. Calling `scope()` on this element always returns the original non-isolate scope.
11527
+ * Requires {@link guide/production#disabling-debug-data Debug Data} to be enabled.
11526
11528
  * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top
11527
11529
  * parent element is reached.
11528
11530
  *
@@ -12517,9 +12519,10 @@ HashMap.prototype = {
12517
12519
  * Creates an injector object that can be used for retrieving services as well as for
12518
12520
  * dependency injection (see {@link guide/di dependency injection}).
12519
12521
  *
12520
-
12521
12522
  * @param {Array.<string|Function>} modules A list of module functions or their aliases. See
12522
- * {@link angular.module}. The `ng` module must be explicitly added.
12523
+ * {@link angular.module}. The `ng` module must be explicitly added.
12524
+ * @param {boolean=} [strictDi=false] Whether the injector should be in strict mode, which
12525
+ * disallows argument name annotation inference.
12523
12526
  * @returns {injector} Injector object. See {@link auto.$injector $injector}.
12524
12527
  *
12525
12528
  * @example
@@ -12665,8 +12668,10 @@ function annotate(fn, strictDi, name) {
12665
12668
  * ## Inference
12666
12669
  *
12667
12670
  * In JavaScript calling `toString()` on a function returns the function definition. The definition
12668
- * can then be parsed and the function arguments can be extracted. *NOTE:* This does not work with
12669
- * minification, and obfuscation tools since these tools change the argument names.
12671
+ * can then be parsed and the function arguments can be extracted. This method of discovering
12672
+ * annotations is disallowed when the injector is in strict mode.
12673
+ * *NOTE:* This does not work with minification, and obfuscation tools since these tools change the
12674
+ * argument names.
12670
12675
  *
12671
12676
  * ## `$inject` Annotation
12672
12677
  * By adding an `$inject` property onto a function the injection parameters can be specified.
@@ -12751,6 +12756,8 @@ function annotate(fn, strictDi, name) {
12751
12756
  * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
12752
12757
  * ```
12753
12758
  *
12759
+ * You can disallow this method by using strict injection mode.
12760
+ *
12754
12761
  * This method does not work with code minification / obfuscation. For this reason the following
12755
12762
  * annotation strategies are supported.
12756
12763
  *
@@ -12803,6 +12810,8 @@ function annotate(fn, strictDi, name) {
12803
12810
  * @param {Function|Array.<string|Function>} fn Function for which dependent service names need to
12804
12811
  * be retrieved as described above.
12805
12812
  *
12813
+ * @param {boolean=} [strictDi=false] Disallow argument name annotation inference.
12814
+ *
12806
12815
  * @returns {Array.<string>} The names of the services which the function requires.
12807
12816
  */
12808
12817
 
@@ -13322,14 +13331,11 @@ function createInjector(modulesToLoad, strictDi) {
13322
13331
  }
13323
13332
 
13324
13333
  function instantiate(Type, locals, serviceName) {
13325
- var Constructor = function() {},
13326
- instance, returnedValue;
13327
-
13328
13334
  // Check if Type is annotated and use just the given function at n-1 as parameter
13329
13335
  // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]);
13330
- Constructor.prototype = (isArray(Type) ? Type[Type.length - 1] : Type).prototype;
13331
- instance = new Constructor();
13332
- returnedValue = invoke(Type, instance, locals, serviceName);
13336
+ // Object creation: http://jsperf.com/create-constructor/2
13337
+ var instance = Object.create((isArray(Type) ? Type[Type.length - 1] : Type).prototype);
13338
+ var returnedValue = invoke(Type, instance, locals, serviceName);
13333
13339
 
13334
13340
  return isObject(returnedValue) || isFunction(returnedValue) ? returnedValue : instance;
13335
13341
  }
@@ -14165,7 +14171,7 @@ function Browser(window, document, $log, $sniffer) {
14165
14171
  // IE<10 from getting into redirect loop when in LocationHashbangInHtml5Url mode.
14166
14172
  // See https://github.com/angular/angular.js/commit/ffb2701
14167
14173
  if (lastBrowserUrl === url && (!$sniffer.history || sameState)) {
14168
- return;
14174
+ return self;
14169
14175
  }
14170
14176
  var sameBase = lastBrowserUrl && stripHash(lastBrowserUrl) === stripHash(url);
14171
14177
  lastBrowserUrl = url;
@@ -17077,10 +17083,10 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
17077
17083
  var childBoundTranscludeFn = boundTranscludeFn;
17078
17084
  if (scope.$$destroyed) return;
17079
17085
  if (linkQueue) {
17080
- linkQueue.push(scope);
17081
- linkQueue.push(node);
17082
- linkQueue.push(rootElement);
17083
- linkQueue.push(childBoundTranscludeFn);
17086
+ linkQueue.push(scope,
17087
+ node,
17088
+ rootElement,
17089
+ childBoundTranscludeFn);
17084
17090
  } else {
17085
17091
  if (afterTemplateNodeLinkFn.transcludeOnThisElement) {
17086
17092
  childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn);
@@ -17549,10 +17555,10 @@ function $ControllerProvider() {
17549
17555
  //
17550
17556
  // This feature is not intended for use by applications, and is thus not documented
17551
17557
  // publicly.
17552
- var Constructor = function() {};
17553
- Constructor.prototype = (isArray(expression) ?
17558
+ // Object creation: http://jsperf.com/create-constructor/2
17559
+ var controllerPrototype = (isArray(expression) ?
17554
17560
  expression[expression.length - 1] : expression).prototype;
17555
- instance = new Constructor();
17561
+ instance = Object.create(controllerPrototype);
17556
17562
 
17557
17563
  if (identifier) {
17558
17564
  addIdentifier(locals, identifier, instance, constructor || expression.name);
@@ -17693,7 +17699,7 @@ function defaultHttpResponseTransform(data, headers) {
17693
17699
  * @returns {Object} Parsed headers as key value object
17694
17700
  */
17695
17701
  function parseHeaders(headers) {
17696
- var parsed = {}, key, val, i;
17702
+ var parsed = createMap(), key, val, i;
17697
17703
 
17698
17704
  if (!headers) return parsed;
17699
17705
 
@@ -17730,7 +17736,11 @@ function headersGetter(headers) {
17730
17736
  if (!headersObj) headersObj = parseHeaders(headers);
17731
17737
 
17732
17738
  if (name) {
17733
- return headersObj[lowercase(name)] || null;
17739
+ var value = headersObj[lowercase(name)];
17740
+ if (value === void 0) {
17741
+ value = null;
17742
+ }
17743
+ return value;
17734
17744
  }
17735
17745
 
17736
17746
  return headersObj;
@@ -17779,6 +17789,11 @@ function $HttpProvider() {
17779
17789
  *
17780
17790
  * Object containing default values for all {@link ng.$http $http} requests.
17781
17791
  *
17792
+ * - **`defaults.cache`** - {Object} - an object built with {@link ng.$cacheFactory `$cacheFactory`}
17793
+ * that will provide the cache for all requests who set their `cache` property to `true`.
17794
+ * If you set the `default.cache = false` then only requests that specify their own custom
17795
+ * cache object will be cached. See {@link $http#caching $http Caching} for more information.
17796
+ *
17782
17797
  * - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token.
17783
17798
  * Defaults value is `'XSRF-TOKEN'`.
17784
17799
  *
@@ -17792,6 +17807,7 @@ function $HttpProvider() {
17792
17807
  * - **`defaults.headers.post`**
17793
17808
  * - **`defaults.headers.put`**
17794
17809
  * - **`defaults.headers.patch`**
17810
+ *
17795
17811
  **/
17796
17812
  var defaults = this.defaults = {
17797
17813
  // transform incoming response data
@@ -18006,6 +18022,21 @@ function $HttpProvider() {
18006
18022
  * In addition, you can supply a `headers` property in the config object passed when
18007
18023
  * calling `$http(config)`, which overrides the defaults without changing them globally.
18008
18024
  *
18025
+ * To explicitly remove a header automatically added via $httpProvider.defaults.headers on a per request basis,
18026
+ * Use the `headers` property, setting the desired header to `undefined`. For example:
18027
+ *
18028
+ * ```js
18029
+ * var req = {
18030
+ * method: 'POST',
18031
+ * url: 'http://example.com',
18032
+ * headers: {
18033
+ * 'Content-Type': undefined
18034
+ * },
18035
+ * data: { test: 'test' },
18036
+ * }
18037
+ *
18038
+ * $http(req).success(function(){...}).error(function(){...});
18039
+ * ```
18009
18040
  *
18010
18041
  * ## Transforming Requests and Responses
18011
18042
  *
@@ -18385,6 +18416,10 @@ function $HttpProvider() {
18385
18416
  };
18386
18417
  var headers = mergeHeaders(requestConfig);
18387
18418
 
18419
+ if (!angular.isObject(requestConfig)) {
18420
+ throw minErr('$http')('badreq', 'Http request configuration must be an object. Received: {0}', requestConfig);
18421
+ }
18422
+
18388
18423
  extend(config, requestConfig);
18389
18424
  config.headers = headers;
18390
18425
  config.method = uppercase(config.method);
@@ -19879,6 +19914,13 @@ var locationPrototype = {
19879
19914
  * Return full url representation with all segments encoded according to rules specified in
19880
19915
  * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt).
19881
19916
  *
19917
+ *
19918
+ * ```js
19919
+ * // given url http://example.com/#/some/path?foo=bar&baz=xoxo
19920
+ * var absUrl = $location.absUrl();
19921
+ * // => "http://example.com/#/some/path?foo=bar&baz=xoxo"
19922
+ * ```
19923
+ *
19882
19924
  * @return {string} full url
19883
19925
  */
19884
19926
  absUrl: locationGetter('$$absUrl'),
@@ -19894,6 +19936,13 @@ var locationPrototype = {
19894
19936
  *
19895
19937
  * Change path, search and hash, when called with parameter and return `$location`.
19896
19938
  *
19939
+ *
19940
+ * ```js
19941
+ * // given url http://example.com/#/some/path?foo=bar&baz=xoxo
19942
+ * var url = $location.url();
19943
+ * // => "/some/path?foo=bar&baz=xoxo"
19944
+ * ```
19945
+ *
19897
19946
  * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`)
19898
19947
  * @return {string} url
19899
19948
  */
@@ -19902,8 +19951,8 @@ var locationPrototype = {
19902
19951
  return this.$$url;
19903
19952
 
19904
19953
  var match = PATH_MATCH.exec(url);
19905
- if (match[1]) this.path(decodeURIComponent(match[1]));
19906
- if (match[2] || match[1]) this.search(match[3] || '');
19954
+ if (match[1] || url === '') this.path(decodeURIComponent(match[1]));
19955
+ if (match[2] || match[1] || url === '') this.search(match[3] || '');
19907
19956
  this.hash(match[5] || '');
19908
19957
 
19909
19958
  return this;
@@ -19918,6 +19967,13 @@ var locationPrototype = {
19918
19967
  *
19919
19968
  * Return protocol of current url.
19920
19969
  *
19970
+ *
19971
+ * ```js
19972
+ * // given url http://example.com/#/some/path?foo=bar&baz=xoxo
19973
+ * var protocol = $location.protocol();
19974
+ * // => "http"
19975
+ * ```
19976
+ *
19921
19977
  * @return {string} protocol of current url
19922
19978
  */
19923
19979
  protocol: locationGetter('$$protocol'),
@@ -19931,6 +19987,13 @@ var locationPrototype = {
19931
19987
  *
19932
19988
  * Return host of current url.
19933
19989
  *
19990
+ *
19991
+ * ```js
19992
+ * // given url http://example.com/#/some/path?foo=bar&baz=xoxo
19993
+ * var host = $location.host();
19994
+ * // => "example.com"
19995
+ * ```
19996
+ *
19934
19997
  * @return {string} host of current url.
19935
19998
  */
19936
19999
  host: locationGetter('$$host'),
@@ -19944,6 +20007,13 @@ var locationPrototype = {
19944
20007
  *
19945
20008
  * Return port of current url.
19946
20009
  *
20010
+ *
20011
+ * ```js
20012
+ * // given url http://example.com/#/some/path?foo=bar&baz=xoxo
20013
+ * var port = $location.port();
20014
+ * // => 80
20015
+ * ```
20016
+ *
19947
20017
  * @return {Number} port
19948
20018
  */
19949
20019
  port: locationGetter('$$port'),
@@ -19962,6 +20032,13 @@ var locationPrototype = {
19962
20032
  * Note: Path should always begin with forward slash (/), this method will add the forward slash
19963
20033
  * if it is missing.
19964
20034
  *
20035
+ *
20036
+ * ```js
20037
+ * // given url http://example.com/#/some/path?foo=bar&baz=xoxo
20038
+ * var path = $location.path();
20039
+ * // => "/some/path"
20040
+ * ```
20041
+ *
19965
20042
  * @param {(string|number)=} path New path
19966
20043
  * @return {string} path
19967
20044
  */
@@ -19987,10 +20064,9 @@ var locationPrototype = {
19987
20064
  * var searchObject = $location.search();
19988
20065
  * // => {foo: 'bar', baz: 'xoxo'}
19989
20066
  *
19990
- *
19991
20067
  * // set foo to 'yipee'
19992
20068
  * $location.search('foo', 'yipee');
19993
- * // => $location
20069
+ * // $location.search() => {foo: 'yipee', baz: 'xoxo'}
19994
20070
  * ```
19995
20071
  *
19996
20072
  * @param {string|Object.<string>|Object.<Array.<string>>} search New search params - string or
@@ -20060,6 +20136,13 @@ var locationPrototype = {
20060
20136
  *
20061
20137
  * Change hash fragment when called with parameter and return `$location`.
20062
20138
  *
20139
+ *
20140
+ * ```js
20141
+ * // given url http://example.com/some/path?foo=bar&baz=xoxo#hashValue
20142
+ * var hash = $location.hash();
20143
+ * // => "hashValue"
20144
+ * ```
20145
+ *
20063
20146
  * @param {(string|number)=} hash New hash fragment
20064
20147
  * @return {string} hash
20065
20148
  */
@@ -25791,7 +25874,7 @@ function filterFilter() {
25791
25874
  *
25792
25875
  * @param {number} amount Input to filter.
25793
25876
  * @param {string=} symbol Currency symbol or identifier to be displayed.
25794
- * @param {number=} fractionSize Number of decimal places to round the amount to.
25877
+ * @param {number=} fractionSize Number of decimal places to round the amount to, defaults to default max fraction size for current locale
25795
25878
  * @returns {string} Formatted number.
25796
25879
  *
25797
25880
  *
@@ -25841,8 +25924,7 @@ function currencyFilter($locale) {
25841
25924
  }
25842
25925
 
25843
25926
  if (isUndefined(fractionSize)) {
25844
- // TODO: read the default value from the locale file
25845
- fractionSize = 2;
25927
+ fractionSize = formats.PATTERNS[1].maxFrac;
25846
25928
  }
25847
25929
 
25848
25930
  // if null or undefined pass it through
@@ -25994,9 +26076,9 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
25994
26076
  }
25995
26077
  }
25996
26078
 
25997
- parts.push(isNegative ? pattern.negPre : pattern.posPre);
25998
- parts.push(formatedText);
25999
- parts.push(isNegative ? pattern.negSuf : pattern.posSuf);
26079
+ parts.push(isNegative ? pattern.negPre : pattern.posPre,
26080
+ formatedText,
26081
+ isNegative ? pattern.negSuf : pattern.posSuf);
26000
26082
  return parts.join('');
26001
26083
  }
26002
26084
 
@@ -27576,9 +27658,7 @@ var formDirectiveFactory = function(isNgForm) {
27576
27658
  controller.$setSubmitted();
27577
27659
  });
27578
27660
 
27579
- event.preventDefault
27580
- ? event.preventDefault()
27581
- : event.returnValue = false; // IE
27661
+ event.preventDefault();
27582
27662
  };
27583
27663
 
27584
27664
  addEventListenerFn(formElement[0], 'submit', handleFormSubmission);
@@ -27665,7 +27745,8 @@ var inputType = {
27665
27745
  * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
27666
27746
  * minlength.
27667
27747
  * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
27668
- * maxlength.
27748
+ * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of
27749
+ * any length.
27669
27750
  * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string
27670
27751
  * that contains the regular expression body that will be converted to a regular expression
27671
27752
  * as in the ngPattern directive.
@@ -28213,7 +28294,8 @@ var inputType = {
28213
28294
  * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
28214
28295
  * minlength.
28215
28296
  * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
28216
- * maxlength.
28297
+ * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of
28298
+ * any length.
28217
28299
  * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string
28218
28300
  * that contains the regular expression body that will be converted to a regular expression
28219
28301
  * as in the ngPattern directive.
@@ -28300,7 +28382,8 @@ var inputType = {
28300
28382
  * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
28301
28383
  * minlength.
28302
28384
  * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
28303
- * maxlength.
28385
+ * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of
28386
+ * any length.
28304
28387
  * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string
28305
28388
  * that contains the regular expression body that will be converted to a regular expression
28306
28389
  * as in the ngPattern directive.
@@ -28388,7 +28471,8 @@ var inputType = {
28388
28471
  * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
28389
28472
  * minlength.
28390
28473
  * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
28391
- * maxlength.
28474
+ * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of
28475
+ * any length.
28392
28476
  * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string
28393
28477
  * that contains the regular expression body that will be converted to a regular expression
28394
28478
  * as in the ngPattern directive.
@@ -28659,7 +28743,7 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
28659
28743
  element.on('change', listener);
28660
28744
 
28661
28745
  ctrl.$render = function() {
28662
- element.val(ctrl.$isEmpty(ctrl.$modelValue) ? '' : ctrl.$viewValue);
28746
+ element.val(ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue);
28663
28747
  };
28664
28748
  }
28665
28749
 
@@ -28769,10 +28853,10 @@ function createDateInputType(type, regexp, parseDate, format) {
28769
28853
  });
28770
28854
 
28771
28855
  ctrl.$formatters.push(function(value) {
28772
- if (!ctrl.$isEmpty(value)) {
28773
- if (!isDate(value)) {
28774
- throw $ngModelMinErr('datefmt', 'Expected `{0}` to be a date', value);
28775
- }
28856
+ if (value && !isDate(value)) {
28857
+ throw $ngModelMinErr('datefmt', 'Expected `{0}` to be a date', value);
28858
+ }
28859
+ if (isValidDate(value)) {
28776
28860
  previousDate = value;
28777
28861
  if (previousDate && timezone === 'UTC') {
28778
28862
  var timezoneOffset = 60000 * previousDate.getTimezoneOffset();
@@ -28781,14 +28865,14 @@ function createDateInputType(type, regexp, parseDate, format) {
28781
28865
  return $filter('date')(value, format, timezone);
28782
28866
  } else {
28783
28867
  previousDate = null;
28868
+ return '';
28784
28869
  }
28785
- return '';
28786
28870
  });
28787
28871
 
28788
28872
  if (isDefined(attr.min) || attr.ngMin) {
28789
28873
  var minVal;
28790
28874
  ctrl.$validators.min = function(value) {
28791
- return ctrl.$isEmpty(value) || isUndefined(minVal) || parseDate(value) >= minVal;
28875
+ return !isValidDate(value) || isUndefined(minVal) || parseDate(value) >= minVal;
28792
28876
  };
28793
28877
  attr.$observe('min', function(val) {
28794
28878
  minVal = parseObservedDateValue(val);
@@ -28799,18 +28883,18 @@ function createDateInputType(type, regexp, parseDate, format) {
28799
28883
  if (isDefined(attr.max) || attr.ngMax) {
28800
28884
  var maxVal;
28801
28885
  ctrl.$validators.max = function(value) {
28802
- return ctrl.$isEmpty(value) || isUndefined(maxVal) || parseDate(value) <= maxVal;
28886
+ return !isValidDate(value) || isUndefined(maxVal) || parseDate(value) <= maxVal;
28803
28887
  };
28804
28888
  attr.$observe('max', function(val) {
28805
28889
  maxVal = parseObservedDateValue(val);
28806
28890
  ctrl.$validate();
28807
28891
  });
28808
28892
  }
28809
- // Override the standard $isEmpty to detect invalid dates as well
28810
- ctrl.$isEmpty = function(value) {
28893
+
28894
+ function isValidDate(value) {
28811
28895
  // Invalid Date: getTime() returns NaN
28812
- return !value || (value.getTime && value.getTime() !== value.getTime());
28813
- };
28896
+ return value && !(value.getTime && value.getTime() !== value.getTime());
28897
+ }
28814
28898
 
28815
28899
  function parseObservedDateValue(val) {
28816
28900
  return isDefined(val) ? (isDate(val) ? val : parseDate(val)) : undefined;
@@ -28894,7 +28978,8 @@ function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
28894
28978
  stringBasedInputType(ctrl);
28895
28979
 
28896
28980
  ctrl.$$parserName = 'url';
28897
- ctrl.$validators.url = function(value) {
28981
+ ctrl.$validators.url = function(modelValue, viewValue) {
28982
+ var value = modelValue || viewValue;
28898
28983
  return ctrl.$isEmpty(value) || URL_REGEXP.test(value);
28899
28984
  };
28900
28985
  }
@@ -28906,7 +28991,8 @@ function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
28906
28991
  stringBasedInputType(ctrl);
28907
28992
 
28908
28993
  ctrl.$$parserName = 'email';
28909
- ctrl.$validators.email = function(value) {
28994
+ ctrl.$validators.email = function(modelValue, viewValue) {
28995
+ var value = modelValue || viewValue;
28910
28996
  return ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value);
28911
28997
  };
28912
28998
  }
@@ -28960,9 +29046,11 @@ function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filt
28960
29046
  element[0].checked = ctrl.$viewValue;
28961
29047
  };
28962
29048
 
28963
- // Override the standard `$isEmpty` because an empty checkbox is never equal to the trueValue
29049
+ // Override the standard `$isEmpty` because the $viewValue of an empty checkbox is always set to `false`
29050
+ // This is because of the parser below, which compares the `$modelValue` with `trueValue` to convert
29051
+ // it to a boolean.
28964
29052
  ctrl.$isEmpty = function(value) {
28965
- return value !== trueValue;
29053
+ return value === false;
28966
29054
  };
28967
29055
 
28968
29056
  ctrl.$formatters.push(function(value) {
@@ -28994,7 +29082,8 @@ function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filt
28994
29082
  * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
28995
29083
  * minlength.
28996
29084
  * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
28997
- * maxlength.
29085
+ * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any
29086
+ * length.
28998
29087
  * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
28999
29088
  * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
29000
29089
  * patterns defined as scope expressions.
@@ -29026,7 +29115,8 @@ function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filt
29026
29115
  * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
29027
29116
  * minlength.
29028
29117
  * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
29029
- * maxlength.
29118
+ * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any
29119
+ * length.
29030
29120
  * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
29031
29121
  * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
29032
29122
  * patterns defined as scope expressions.
@@ -29242,13 +29332,18 @@ is set to `true`. The parse error is stored in `ngModel.$error.parse`.
29242
29332
  *
29243
29333
  * @description
29244
29334
  *
29245
- * `NgModelController` provides API for the `ng-model` directive. The controller contains
29246
- * services for data-binding, validation, CSS updates, and value formatting and parsing. It
29247
- * purposefully does not contain any logic which deals with DOM rendering or listening to
29248
- * DOM events. Such DOM related logic should be provided by other directives which make use of
29249
- * `NgModelController` for data-binding.
29335
+ * `NgModelController` provides API for the {@link ngModel `ngModel`} directive.
29336
+ * The controller contains services for data-binding, validation, CSS updates, and value formatting
29337
+ * and parsing. It purposefully does not contain any logic which deals with DOM rendering or
29338
+ * listening to DOM events.
29339
+ * Such DOM related logic should be provided by other directives which make use of
29340
+ * `NgModelController` for data-binding to control elements.
29341
+ * Angular provides this DOM logic for most {@link input `input`} elements.
29342
+ * At the end of this page you can find a {@link ngModel.NgModelController#custom-control-example
29343
+ * custom control example} that uses `ngModelController` to bind to `contenteditable` elements.
29250
29344
  *
29251
- * ## Custom Control Example
29345
+ * @example
29346
+ * ### Custom Control Example
29252
29347
  * This example shows how to use `NgModelController` with a custom control to achieve
29253
29348
  * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`)
29254
29349
  * collaborate together to achieve the desired result.
@@ -29345,6 +29440,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
29345
29440
  function($scope, $exceptionHandler, $attr, $element, $parse, $animate, $timeout, $rootScope, $q, $interpolate) {
29346
29441
  this.$viewValue = Number.NaN;
29347
29442
  this.$modelValue = Number.NaN;
29443
+ this.$$rawModelValue = undefined; // stores the parsed modelValue / model set from scope regardless of validity.
29348
29444
  this.$validators = {};
29349
29445
  this.$asyncValidators = {};
29350
29446
  this.$parsers = [];
@@ -29363,32 +29459,33 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
29363
29459
 
29364
29460
 
29365
29461
  var parsedNgModel = $parse($attr.ngModel),
29462
+ parsedNgModelAssign = parsedNgModel.assign,
29463
+ ngModelGet = parsedNgModel,
29464
+ ngModelSet = parsedNgModelAssign,
29366
29465
  pendingDebounce = null,
29367
29466
  ctrl = this;
29368
29467
 
29369
- var ngModelGet = function ngModelGet() {
29370
- var modelValue = parsedNgModel($scope);
29371
- if (ctrl.$options && ctrl.$options.getterSetter && isFunction(modelValue)) {
29372
- modelValue = modelValue();
29373
- }
29374
- return modelValue;
29375
- };
29376
-
29377
- var ngModelSet = function ngModelSet(newValue) {
29378
- var getterSetter;
29379
- if (ctrl.$options && ctrl.$options.getterSetter &&
29380
- isFunction(getterSetter = parsedNgModel($scope))) {
29381
-
29382
- getterSetter(ctrl.$modelValue);
29383
- } else {
29384
- parsedNgModel.assign($scope, ctrl.$modelValue);
29385
- }
29386
- };
29387
-
29388
29468
  this.$$setOptions = function(options) {
29389
29469
  ctrl.$options = options;
29390
-
29391
- if (!parsedNgModel.assign && (!options || !options.getterSetter)) {
29470
+ if (options && options.getterSetter) {
29471
+ var invokeModelGetter = $parse($attr.ngModel + '()'),
29472
+ invokeModelSetter = $parse($attr.ngModel + '($$$p)');
29473
+
29474
+ ngModelGet = function($scope) {
29475
+ var modelValue = parsedNgModel($scope);
29476
+ if (isFunction(modelValue)) {
29477
+ modelValue = invokeModelGetter($scope);
29478
+ }
29479
+ return modelValue;
29480
+ };
29481
+ ngModelSet = function($scope, newValue) {
29482
+ if (isFunction(parsedNgModel($scope))) {
29483
+ invokeModelSetter($scope, {$$$p: ctrl.$modelValue});
29484
+ } else {
29485
+ parsedNgModelAssign($scope, ctrl.$modelValue);
29486
+ }
29487
+ };
29488
+ } else if (!parsedNgModel.assign) {
29392
29489
  throw $ngModelMinErr('nonassign', "Expression '{0}' is non-assignable. Element: {1}",
29393
29490
  $attr.ngModel, startingTag($element));
29394
29491
  }
@@ -29421,17 +29518,18 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
29421
29518
  * @name ngModel.NgModelController#$isEmpty
29422
29519
  *
29423
29520
  * @description
29424
- * This is called when we need to determine if the value of the input is empty.
29521
+ * This is called when we need to determine if the value of an input is empty.
29425
29522
  *
29426
29523
  * For instance, the required directive does this to work out if the input has data or not.
29524
+ *
29427
29525
  * The default `$isEmpty` function checks whether the value is `undefined`, `''`, `null` or `NaN`.
29428
29526
  *
29429
29527
  * You can override this for input directives whose concept of being empty is different to the
29430
29528
  * default. The `checkboxInputType` directive does this because in its case a value of `false`
29431
29529
  * implies empty.
29432
29530
  *
29433
- * @param {*} value Model value to check.
29434
- * @returns {boolean} True if `value` is empty.
29531
+ * @param {*} value The value of the input to check for emptiness.
29532
+ * @returns {boolean} True if `value` is "empty".
29435
29533
  */
29436
29534
  this.$isEmpty = function(value) {
29437
29535
  return isUndefined(value) || value === '' || value === null || value !== value;
@@ -29482,9 +29580,9 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
29482
29580
  * @description
29483
29581
  * Sets the control to its pristine state.
29484
29582
  *
29485
- * This method can be called to remove the 'ng-dirty' class and set the control to its pristine
29486
- * state (ng-pristine class). A model is considered to be pristine when the model has not been changed
29487
- * from when first compiled within then form.
29583
+ * This method can be called to remove the `ng-dirty` class and set the control to its pristine
29584
+ * state (`ng-pristine` class). A model is considered to be pristine when the control
29585
+ * has not been changed from when first compiled.
29488
29586
  */
29489
29587
  this.$setPristine = function() {
29490
29588
  ctrl.$dirty = false;
@@ -29493,6 +29591,25 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
29493
29591
  $animate.addClass($element, PRISTINE_CLASS);
29494
29592
  };
29495
29593
 
29594
+ /**
29595
+ * @ngdoc method
29596
+ * @name ngModel.NgModelController#$setDirty
29597
+ *
29598
+ * @description
29599
+ * Sets the control to its dirty state.
29600
+ *
29601
+ * This method can be called to remove the `ng-pristine` class and set the control to its dirty
29602
+ * state (`ng-dirty` class). A model is considered to be dirty when the control has been changed
29603
+ * from when first compiled.
29604
+ */
29605
+ this.$setDirty = function() {
29606
+ ctrl.$dirty = true;
29607
+ ctrl.$pristine = false;
29608
+ $animate.removeClass($element, PRISTINE_CLASS);
29609
+ $animate.addClass($element, DIRTY_CLASS);
29610
+ parentForm.$setDirty();
29611
+ };
29612
+
29496
29613
  /**
29497
29614
  * @ngdoc method
29498
29615
  * @name ngModel.NgModelController#$setUntouched
@@ -29500,8 +29617,8 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
29500
29617
  * @description
29501
29618
  * Sets the control to its untouched state.
29502
29619
  *
29503
- * This method can be called to remove the 'ng-touched' class and set the control to its
29504
- * untouched state (ng-untouched class). Upon compilation, a model is set as untouched
29620
+ * This method can be called to remove the `ng-touched` class and set the control to its
29621
+ * untouched state (`ng-untouched` class). Upon compilation, a model is set as untouched
29505
29622
  * by default, however this function can be used to restore that state if the model has
29506
29623
  * already been touched by the user.
29507
29624
  */
@@ -29518,10 +29635,9 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
29518
29635
  * @description
29519
29636
  * Sets the control to its touched state.
29520
29637
  *
29521
- * This method can be called to remove the 'ng-untouched' class and set the control to its
29522
- * touched state (ng-touched class). A model is considered to be touched when the user has
29523
- * first interacted (focussed) on the model input element and then shifted focus away (blurred)
29524
- * from the input element.
29638
+ * This method can be called to remove the `ng-untouched` class and set the control to its
29639
+ * touched state (`ng-touched` class). A model is considered to be touched when the user has
29640
+ * first focused the control element and then shifted focus away from the control (blur event).
29525
29641
  */
29526
29642
  this.$setTouched = function() {
29527
29643
  ctrl.$touched = true;
@@ -29599,14 +29715,51 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
29599
29715
  * @name ngModel.NgModelController#$validate
29600
29716
  *
29601
29717
  * @description
29602
- * Runs each of the registered validators (first synchronous validators and then asynchronous validators).
29718
+ * Runs each of the registered validators (first synchronous validators and then
29719
+ * asynchronous validators).
29720
+ * If the validity changes to invalid, the model will be set to `undefined`,
29721
+ * unless {@link ngModelOptions `ngModelOptions.allowInvalid`} is `true`.
29722
+ * If the validity changes to valid, it will set the model to the last available valid
29723
+ * modelValue, i.e. either the last parsed value or the last value set from the scope.
29603
29724
  */
29604
29725
  this.$validate = function() {
29605
29726
  // ignore $validate before model is initialized
29606
29727
  if (isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue)) {
29607
29728
  return;
29608
29729
  }
29609
- this.$$parseAndValidate();
29730
+
29731
+ var viewValue = ctrl.$$lastCommittedViewValue;
29732
+ // Note: we use the $$rawModelValue as $modelValue might have been
29733
+ // set to undefined during a view -> model update that found validation
29734
+ // errors. We can't parse the view here, since that could change
29735
+ // the model although neither viewValue nor the model on the scope changed
29736
+ var modelValue = ctrl.$$rawModelValue;
29737
+
29738
+ // Check if the there's a parse error, so we don't unset it accidentially
29739
+ var parserName = ctrl.$$parserName || 'parse';
29740
+ var parserValid = ctrl.$error[parserName] ? false : undefined;
29741
+
29742
+ var prevValid = ctrl.$valid;
29743
+ var prevModelValue = ctrl.$modelValue;
29744
+
29745
+ var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid;
29746
+
29747
+ ctrl.$$runValidators(parserValid, modelValue, viewValue, function(allValid) {
29748
+ // If there was no change in validity, don't update the model
29749
+ // This prevents changing an invalid modelValue to undefined
29750
+ if (!allowInvalid && prevValid !== allValid) {
29751
+ // Note: Don't check ctrl.$valid here, as we could have
29752
+ // external validators (e.g. calculated on the server),
29753
+ // that just call $setValidity and need the model value
29754
+ // to calculate their validity.
29755
+ ctrl.$modelValue = allValid ? modelValue : undefined;
29756
+
29757
+ if (ctrl.$modelValue !== prevModelValue) {
29758
+ ctrl.$$writeModelToScope();
29759
+ }
29760
+ }
29761
+ });
29762
+
29610
29763
  };
29611
29764
 
29612
29765
  this.$$runValidators = function(parseValid, modelValue, viewValue, doneCallback) {
@@ -29725,11 +29878,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
29725
29878
 
29726
29879
  // change to dirty
29727
29880
  if (ctrl.$pristine) {
29728
- ctrl.$dirty = true;
29729
- ctrl.$pristine = false;
29730
- $animate.removeClass($element, PRISTINE_CLASS);
29731
- $animate.addClass($element, DIRTY_CLASS);
29732
- parentForm.$setDirty();
29881
+ this.$setDirty();
29733
29882
  }
29734
29883
  this.$$parseAndValidate();
29735
29884
  };
@@ -29750,10 +29899,11 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
29750
29899
  }
29751
29900
  if (isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue)) {
29752
29901
  // ctrl.$modelValue has not been touched yet...
29753
- ctrl.$modelValue = ngModelGet();
29902
+ ctrl.$modelValue = ngModelGet($scope);
29754
29903
  }
29755
29904
  var prevModelValue = ctrl.$modelValue;
29756
29905
  var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid;
29906
+ ctrl.$$rawModelValue = modelValue;
29757
29907
  if (allowInvalid) {
29758
29908
  ctrl.$modelValue = modelValue;
29759
29909
  writeToModelIfNeeded();
@@ -29777,7 +29927,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
29777
29927
  };
29778
29928
 
29779
29929
  this.$$writeModelToScope = function() {
29780
- ngModelSet(ctrl.$modelValue);
29930
+ ngModelSet($scope, ctrl.$modelValue);
29781
29931
  forEach(ctrl.$viewChangeListeners, function(listener) {
29782
29932
  try {
29783
29933
  listener();
@@ -29873,12 +30023,12 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
29873
30023
  // ng-change executes in apply phase
29874
30024
  // 4. view should be changed back to 'a'
29875
30025
  $scope.$watch(function ngModelWatch() {
29876
- var modelValue = ngModelGet();
30026
+ var modelValue = ngModelGet($scope);
29877
30027
 
29878
30028
  // if scope model value and ngModel value are out of sync
29879
30029
  // TODO(perf): why not move this to the action fn?
29880
30030
  if (modelValue !== ctrl.$modelValue) {
29881
- ctrl.$modelValue = modelValue;
30031
+ ctrl.$modelValue = ctrl.$$rawModelValue = modelValue;
29882
30032
 
29883
30033
  var formatters = ctrl.$formatters,
29884
30034
  idx = formatters.length;
@@ -30063,7 +30213,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
30063
30213
  </file>
30064
30214
  * </example>
30065
30215
  */
30066
- var ngModelDirective = function() {
30216
+ var ngModelDirective = ['$rootScope', function($rootScope) {
30067
30217
  return {
30068
30218
  restrict: 'A',
30069
30219
  require: ['ngModel', '^?form', '^?ngModelOptions'],
@@ -30107,15 +30257,17 @@ var ngModelDirective = function() {
30107
30257
  element.on('blur', function(ev) {
30108
30258
  if (modelCtrl.$touched) return;
30109
30259
 
30110
- scope.$apply(function() {
30111
- modelCtrl.$setTouched();
30112
- });
30260
+ if ($rootScope.$$phase) {
30261
+ scope.$evalAsync(modelCtrl.$setTouched);
30262
+ } else {
30263
+ scope.$apply(modelCtrl.$setTouched);
30264
+ }
30113
30265
  });
30114
30266
  }
30115
30267
  };
30116
30268
  }
30117
30269
  };
30118
- };
30270
+ }];
30119
30271
 
30120
30272
 
30121
30273
  /**
@@ -30204,8 +30356,8 @@ var requiredDirective = function() {
30204
30356
  if (!ctrl) return;
30205
30357
  attr.required = true; // force truthy in case we are on non input element
30206
30358
 
30207
- ctrl.$validators.required = function(value) {
30208
- return !attr.required || !ctrl.$isEmpty(value);
30359
+ ctrl.$validators.required = function(modelValue, viewValue) {
30360
+ return !attr.required || !ctrl.$isEmpty(viewValue);
30209
30361
  };
30210
30362
 
30211
30363
  attr.$observe('required', function() {
@@ -30254,13 +30406,14 @@ var maxlengthDirective = function() {
30254
30406
  link: function(scope, elm, attr, ctrl) {
30255
30407
  if (!ctrl) return;
30256
30408
 
30257
- var maxlength = 0;
30409
+ var maxlength = -1;
30258
30410
  attr.$observe('maxlength', function(value) {
30259
- maxlength = int(value) || 0;
30411
+ var intVal = int(value);
30412
+ maxlength = isNaN(intVal) ? -1 : intVal;
30260
30413
  ctrl.$validate();
30261
30414
  });
30262
30415
  ctrl.$validators.maxlength = function(modelValue, viewValue) {
30263
- return ctrl.$isEmpty(modelValue) || viewValue.length <= maxlength;
30416
+ return (maxlength < 0) || ctrl.$isEmpty(modelValue) || (viewValue.length <= maxlength);
30264
30417
  };
30265
30418
  }
30266
30419
  };
@@ -30279,7 +30432,7 @@ var minlengthDirective = function() {
30279
30432
  ctrl.$validate();
30280
30433
  });
30281
30434
  ctrl.$validators.minlength = function(modelValue, viewValue) {
30282
- return ctrl.$isEmpty(modelValue) || viewValue.length >= minlength;
30435
+ return ctrl.$isEmpty(viewValue) || viewValue.length >= minlength;
30283
30436
  };
30284
30437
  }
30285
30438
  };
@@ -30907,12 +31060,11 @@ var ngBindTemplateDirective = ['$interpolate', '$compile', function($interpolate
30907
31060
  * @name ngBindHtml
30908
31061
  *
30909
31062
  * @description
30910
- * Creates a binding that will innerHTML the result of evaluating the `expression` into the current
30911
- * element in a secure way. By default, the innerHTML-ed content will be sanitized using the {@link
30912
- * ngSanitize.$sanitize $sanitize} service. To utilize this functionality, ensure that `$sanitize`
30913
- * is available, for example, by including {@link ngSanitize} in your module's dependencies (not in
30914
- * core Angular). In order to use {@link ngSanitize} in your module's dependencies, you need to
30915
- * include "angular-sanitize.js" in your application.
31063
+ * Evaluates the expression and inserts the resulting HTML into the element in a secure way. By default,
31064
+ * the resulting HTML content will be sanitized using the {@link ngSanitize.$sanitize $sanitize} service.
31065
+ * To utilize this functionality, ensure that `$sanitize` is available, for example, by including {@link
31066
+ * ngSanitize} in your module's dependencies (not in core Angular). In order to use {@link ngSanitize}
31067
+ * in your module's dependencies, you need to include "angular-sanitize.js" in your application.
30916
31068
  *
30917
31069
  * You may also bypass sanitization for values you know are safe. To do so, bind to
30918
31070
  * an explicitly trusted value via {@link ng.$sce#trustAsHtml $sce.trustAsHtml}. See the example
@@ -32976,7 +33128,9 @@ var ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });
32976
33128
  </example>
32977
33129
  */
32978
33130
  var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interpolate) {
32979
- var BRACE = /{}/g;
33131
+ var BRACE = /{}/g,
33132
+ IS_WHEN = /^when(Minus)?(.+)$/;
33133
+
32980
33134
  return {
32981
33135
  restrict: 'EA',
32982
33136
  link: function(scope, element, attr) {
@@ -32987,34 +33141,44 @@ var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interp
32987
33141
  whensExpFns = {},
32988
33142
  startSymbol = $interpolate.startSymbol(),
32989
33143
  endSymbol = $interpolate.endSymbol(),
32990
- isWhen = /^when(Minus)?(.+)$/;
33144
+ braceReplacement = startSymbol + numberExp + '-' + offset + endSymbol,
33145
+ watchRemover = angular.noop,
33146
+ lastCount;
32991
33147
 
32992
33148
  forEach(attr, function(expression, attributeName) {
32993
- if (isWhen.test(attributeName)) {
32994
- whens[lowercase(attributeName.replace('when', '').replace('Minus', '-'))] =
32995
- element.attr(attr.$attr[attributeName]);
33149
+ var tmpMatch = IS_WHEN.exec(attributeName);
33150
+ if (tmpMatch) {
33151
+ var whenKey = (tmpMatch[1] ? '-' : '') + lowercase(tmpMatch[2]);
33152
+ whens[whenKey] = element.attr(attr.$attr[attributeName]);
32996
33153
  }
32997
33154
  });
32998
33155
  forEach(whens, function(expression, key) {
32999
- whensExpFns[key] =
33000
- $interpolate(expression.replace(BRACE, startSymbol + numberExp + '-' +
33001
- offset + endSymbol));
33156
+ whensExpFns[key] = $interpolate(expression.replace(BRACE, braceReplacement));
33157
+
33002
33158
  });
33003
33159
 
33004
- scope.$watch(function ngPluralizeWatch() {
33005
- var value = parseFloat(scope.$eval(numberExp));
33160
+ scope.$watch(numberExp, function ngPluralizeWatchAction(newVal) {
33161
+ var count = parseFloat(newVal);
33162
+ var countIsNaN = isNaN(count);
33006
33163
 
33007
- if (!isNaN(value)) {
33008
- //if explicit number rule such as 1, 2, 3... is defined, just use it. Otherwise,
33009
- //check it against pluralization rules in $locale service
33010
- if (!(value in whens)) value = $locale.pluralCat(value - offset);
33011
- return whensExpFns[value](scope);
33012
- } else {
33013
- return '';
33164
+ if (!countIsNaN && !(count in whens)) {
33165
+ // If an explicit number rule such as 1, 2, 3... is defined, just use it.
33166
+ // Otherwise, check it against pluralization rules in $locale service.
33167
+ count = $locale.pluralCat(count - offset);
33168
+ }
33169
+
33170
+ // If both `count` and `lastCount` are NaN, we don't need to re-register a watch.
33171
+ // In JS `NaN !== NaN`, so we have to exlicitly check.
33172
+ if ((count !== lastCount) && !(countIsNaN && isNaN(lastCount))) {
33173
+ watchRemover();
33174
+ watchRemover = scope.$watch(whensExpFns[count], updateElementText);
33175
+ lastCount = count;
33014
33176
  }
33015
- }, function ngPluralizeWatchAction(newVal) {
33016
- element.text(newVal);
33017
33177
  });
33178
+
33179
+ function updateElementText(newText) {
33180
+ element.text(newText || '');
33181
+ }
33018
33182
  }
33019
33183
  };
33020
33184
  }];
@@ -33496,17 +33660,17 @@ var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';
33496
33660
  *
33497
33661
  * ### Overriding `.ng-hide`
33498
33662
  *
33499
- * By default, the `.ng-hide` class will style the element with `display:none!important`. If you wish to change
33663
+ * By default, the `.ng-hide` class will style the element with `display: none!important`. If you wish to change
33500
33664
  * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide`
33501
33665
  * class in CSS:
33502
33666
  *
33503
33667
  * ```css
33504
33668
  * .ng-hide {
33505
33669
  * /&#42; this is just another form of hiding an element &#42;/
33506
- * display:block!important;
33507
- * position:absolute;
33508
- * top:-9999px;
33509
- * left:-9999px;
33670
+ * display: block!important;
33671
+ * position: absolute;
33672
+ * top: -9999px;
33673
+ * left: -9999px;
33510
33674
  * }
33511
33675
  * ```
33512
33676
  *
@@ -33526,13 +33690,13 @@ var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';
33526
33690
  * .my-element.ng-hide-add, .my-element.ng-hide-remove {
33527
33691
  * /&#42; this is required as of 1.3x to properly
33528
33692
  * apply all styling in a show/hide animation &#42;/
33529
- * transition:0s linear all;
33693
+ * transition: 0s linear all;
33530
33694
  * }
33531
33695
  *
33532
33696
  * .my-element.ng-hide-add-active,
33533
33697
  * .my-element.ng-hide-remove-active {
33534
33698
  * /&#42; the transition is defined in the active class &#42;/
33535
- * transition:1s linear all;
33699
+ * transition: 1s linear all;
33536
33700
  * }
33537
33701
  *
33538
33702
  * .my-element.ng-hide-add { ... }
@@ -33574,29 +33738,29 @@ var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';
33574
33738
  </file>
33575
33739
  <file name="animations.css">
33576
33740
  .animate-show {
33577
- line-height:20px;
33578
- opacity:1;
33579
- padding:10px;
33580
- border:1px solid black;
33581
- background:white;
33741
+ line-height: 20px;
33742
+ opacity: 1;
33743
+ padding: 10px;
33744
+ border: 1px solid black;
33745
+ background: white;
33582
33746
  }
33583
33747
 
33584
33748
  .animate-show.ng-hide-add.ng-hide-add-active,
33585
33749
  .animate-show.ng-hide-remove.ng-hide-remove-active {
33586
- -webkit-transition:all linear 0.5s;
33587
- transition:all linear 0.5s;
33750
+ -webkit-transition: all linear 0.5s;
33751
+ transition: all linear 0.5s;
33588
33752
  }
33589
33753
 
33590
33754
  .animate-show.ng-hide {
33591
- line-height:0;
33592
- opacity:0;
33593
- padding:0 10px;
33755
+ line-height: 0;
33756
+ opacity: 0;
33757
+ padding: 0 10px;
33594
33758
  }
33595
33759
 
33596
33760
  .check-element {
33597
- padding:10px;
33598
- border:1px solid black;
33599
- background:white;
33761
+ padding: 10px;
33762
+ border: 1px solid black;
33763
+ background: white;
33600
33764
  }
33601
33765
  </file>
33602
33766
  <file name="protractor.js" type="protractor">
@@ -33670,17 +33834,17 @@ var ngShowDirective = ['$animate', function($animate) {
33670
33834
  *
33671
33835
  * ### Overriding `.ng-hide`
33672
33836
  *
33673
- * By default, the `.ng-hide` class will style the element with `display:none!important`. If you wish to change
33837
+ * By default, the `.ng-hide` class will style the element with `display: none!important`. If you wish to change
33674
33838
  * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide`
33675
33839
  * class in CSS:
33676
33840
  *
33677
33841
  * ```css
33678
33842
  * .ng-hide {
33679
33843
  * /&#42; this is just another form of hiding an element &#42;/
33680
- * display:block!important;
33681
- * position:absolute;
33682
- * top:-9999px;
33683
- * left:-9999px;
33844
+ * display: block!important;
33845
+ * position: absolute;
33846
+ * top: -9999px;
33847
+ * left: -9999px;
33684
33848
  * }
33685
33849
  * ```
33686
33850
  *
@@ -33697,7 +33861,7 @@ var ngShowDirective = ['$animate', function($animate) {
33697
33861
  * //a working example can be found at the bottom of this page
33698
33862
  * //
33699
33863
  * .my-element.ng-hide-add, .my-element.ng-hide-remove {
33700
- * transition:0.5s linear all;
33864
+ * transition: 0.5s linear all;
33701
33865
  * }
33702
33866
  *
33703
33867
  * .my-element.ng-hide-add { ... }
@@ -33739,25 +33903,25 @@ var ngShowDirective = ['$animate', function($animate) {
33739
33903
  </file>
33740
33904
  <file name="animations.css">
33741
33905
  .animate-hide {
33742
- -webkit-transition:all linear 0.5s;
33743
- transition:all linear 0.5s;
33744
- line-height:20px;
33745
- opacity:1;
33746
- padding:10px;
33747
- border:1px solid black;
33748
- background:white;
33906
+ -webkit-transition: all linear 0.5s;
33907
+ transition: all linear 0.5s;
33908
+ line-height: 20px;
33909
+ opacity: 1;
33910
+ padding: 10px;
33911
+ border: 1px solid black;
33912
+ background: white;
33749
33913
  }
33750
33914
 
33751
33915
  .animate-hide.ng-hide {
33752
- line-height:0;
33753
- opacity:0;
33754
- padding:0 10px;
33916
+ line-height: 0;
33917
+ opacity: 0;
33918
+ padding: 0 10px;
33755
33919
  }
33756
33920
 
33757
33921
  .check-element {
33758
- padding:10px;
33759
- border:1px solid black;
33760
- background:white;
33922
+ padding: 10px;
33923
+ border: 1px solid black;
33924
+ background: white;
33761
33925
  }
33762
33926
  </file>
33763
33927
  <file name="protractor.js" type="protractor">