angularjs-rails 1.5.0 → 1.5.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/angularjs-rails/version.rb +2 -2
- data/vendor/assets/javascripts/angular-animate.js +82 -56
- data/vendor/assets/javascripts/angular-aria.js +12 -5
- data/vendor/assets/javascripts/angular-cookies.js +2 -2
- data/vendor/assets/javascripts/angular-loader.js +5 -5
- data/vendor/assets/javascripts/angular-message-format.js +2 -2
- data/vendor/assets/javascripts/angular-messages.js +63 -28
- data/vendor/assets/javascripts/angular-mocks.js +280 -116
- data/vendor/assets/javascripts/angular-parse-ext.js +1271 -0
- data/vendor/assets/javascripts/angular-resource.js +3 -3
- data/vendor/assets/javascripts/angular-route.js +16 -7
- data/vendor/assets/javascripts/angular-sanitize.js +4 -4
- data/vendor/assets/javascripts/angular-scenario.js +882 -442
- data/vendor/assets/javascripts/angular-touch.js +2 -2
- data/vendor/assets/javascripts/angular.js +871 -431
- data/vendor/assets/javascripts/unstable/angular2-polyfills.js +1046 -1832
- data/vendor/assets/javascripts/unstable/angular2.js +22044 -18291
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 895ca6a972b4db80f33f25c4e63bb46a0b26432a
|
4
|
+
data.tar.gz: 3483320ceca41adcb1e22f2d1c3b9dcc47bc73aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8c023b142da5d9614c78886daffe753b5a0109ad9666ef7ab86cb3ffb14cfb5fc2918d0cd583eb1473fad8dcf9ca5c93d6cc4df350cae543386f625cc8157774
|
7
|
+
data.tar.gz: 53eb5be5f352da05f7fa7dad196d77546c19c1a878af64eb041d161a62ec81da9cae52c83c5258dd32d3716a61d988247b2b596a95b8d6130e891fbcb070b25e
|
@@ -1,9 +1,9 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.5.
|
2
|
+
* @license AngularJS v1.5.5
|
3
3
|
* (c) 2010-2016 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
6
|
-
(function(window, angular
|
6
|
+
(function(window, angular) {'use strict';
|
7
7
|
|
8
8
|
/* jshint ignore:start */
|
9
9
|
var noop = angular.noop;
|
@@ -2225,6 +2225,11 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
|
|
2225
2225
|
});
|
2226
2226
|
|
2227
2227
|
rules.cancel.push(function(element, newAnimation, currentAnimation) {
|
2228
|
+
// cancel the animation if classes added / removed in both animation cancel each other out,
|
2229
|
+
// but only if the current animation isn't structural
|
2230
|
+
|
2231
|
+
if (currentAnimation.structural) return false;
|
2232
|
+
|
2228
2233
|
var nA = newAnimation.addClass;
|
2229
2234
|
var nR = newAnimation.removeClass;
|
2230
2235
|
var cA = currentAnimation.addClass;
|
@@ -2312,7 +2317,7 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
|
|
2312
2317
|
}
|
2313
2318
|
|
2314
2319
|
// IE9-11 has no method "contains" in SVG element and in Node.prototype. Bug #10259.
|
2315
|
-
var contains = Node.prototype.contains || function(arg) {
|
2320
|
+
var contains = window.Node.prototype.contains || function(arg) {
|
2316
2321
|
// jshint bitwise: false
|
2317
2322
|
return this === arg || !!(this.compareDocumentPosition(arg) & 16);
|
2318
2323
|
// jshint bitwise: true
|
@@ -2337,7 +2342,24 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
|
|
2337
2342
|
return matches;
|
2338
2343
|
}
|
2339
2344
|
|
2340
|
-
|
2345
|
+
function filterFromRegistry(list, matchContainer, matchCallback) {
|
2346
|
+
var containerNode = extractElementNode(matchContainer);
|
2347
|
+
return list.filter(function(entry) {
|
2348
|
+
var isMatch = entry.node === containerNode &&
|
2349
|
+
(!matchCallback || entry.callback === matchCallback);
|
2350
|
+
return !isMatch;
|
2351
|
+
});
|
2352
|
+
}
|
2353
|
+
|
2354
|
+
function cleanupEventListeners(phase, element) {
|
2355
|
+
if (phase === 'close' && !element[0].parentNode) {
|
2356
|
+
// If the element is not attached to a parentNode, it has been removed by
|
2357
|
+
// the domOperation, and we can safely remove the event callbacks
|
2358
|
+
$animate.off(element);
|
2359
|
+
}
|
2360
|
+
}
|
2361
|
+
|
2362
|
+
var $animate = {
|
2341
2363
|
on: function(event, container, callback) {
|
2342
2364
|
var node = extractElementNode(container);
|
2343
2365
|
callbackRegistry[event] = callbackRegistry[event] || [];
|
@@ -2345,24 +2367,36 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
|
|
2345
2367
|
node: node,
|
2346
2368
|
callback: callback
|
2347
2369
|
});
|
2370
|
+
|
2371
|
+
// Remove the callback when the element is removed from the DOM
|
2372
|
+
jqLite(container).on('$destroy', function() {
|
2373
|
+
var animationDetails = activeAnimationsLookup.get(node);
|
2374
|
+
|
2375
|
+
if (!animationDetails) {
|
2376
|
+
// If there's an animation ongoing, the callback calling code will remove
|
2377
|
+
// the event listeners. If we'd remove here, the callbacks would be removed
|
2378
|
+
// before the animation ends
|
2379
|
+
$animate.off(event, container, callback);
|
2380
|
+
}
|
2381
|
+
});
|
2348
2382
|
},
|
2349
2383
|
|
2350
2384
|
off: function(event, container, callback) {
|
2385
|
+
if (arguments.length === 1 && !angular.isString(arguments[0])) {
|
2386
|
+
container = arguments[0];
|
2387
|
+
for (var eventType in callbackRegistry) {
|
2388
|
+
callbackRegistry[eventType] = filterFromRegistry(callbackRegistry[eventType], container);
|
2389
|
+
}
|
2390
|
+
|
2391
|
+
return;
|
2392
|
+
}
|
2393
|
+
|
2351
2394
|
var entries = callbackRegistry[event];
|
2352
2395
|
if (!entries) return;
|
2353
2396
|
|
2354
2397
|
callbackRegistry[event] = arguments.length === 1
|
2355
2398
|
? null
|
2356
2399
|
: filterFromRegistry(entries, container, callback);
|
2357
|
-
|
2358
|
-
function filterFromRegistry(list, matchContainer, matchCallback) {
|
2359
|
-
var containerNode = extractElementNode(matchContainer);
|
2360
|
-
return list.filter(function(entry) {
|
2361
|
-
var isMatch = entry.node === containerNode &&
|
2362
|
-
(!matchCallback || entry.callback === matchCallback);
|
2363
|
-
return !isMatch;
|
2364
|
-
});
|
2365
|
-
}
|
2366
2400
|
},
|
2367
2401
|
|
2368
2402
|
pin: function(element, parentElement) {
|
@@ -2412,6 +2446,8 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
|
|
2412
2446
|
}
|
2413
2447
|
};
|
2414
2448
|
|
2449
|
+
return $animate;
|
2450
|
+
|
2415
2451
|
function queueAnimation(element, event, initialOptions) {
|
2416
2452
|
// we always make a copy of the options since
|
2417
2453
|
// there should never be any side effects on
|
@@ -2474,12 +2510,14 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
|
|
2474
2510
|
|
2475
2511
|
var isStructural = ['enter', 'move', 'leave'].indexOf(event) >= 0;
|
2476
2512
|
|
2513
|
+
var documentHidden = $document[0].hidden;
|
2514
|
+
|
2477
2515
|
// this is a hard disable of all animations for the application or on
|
2478
2516
|
// the element itself, therefore there is no need to continue further
|
2479
2517
|
// past this point if not enabled
|
2480
2518
|
// Animations are also disabled if the document is currently hidden (page is not visible
|
2481
2519
|
// to the user), because browsers slow down or do not flush calls to requestAnimationFrame
|
2482
|
-
var skipAnimations = !animationsEnabled ||
|
2520
|
+
var skipAnimations = !animationsEnabled || documentHidden || disabledElementsLookup.get(node);
|
2483
2521
|
var existingAnimation = (!skipAnimations && activeAnimationsLookup.get(node)) || {};
|
2484
2522
|
var hasExistingAnimation = !!existingAnimation.state;
|
2485
2523
|
|
@@ -2490,7 +2528,10 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
|
|
2490
2528
|
}
|
2491
2529
|
|
2492
2530
|
if (skipAnimations) {
|
2531
|
+
// Callbacks should fire even if the document is hidden (regression fix for issue #14120)
|
2532
|
+
if (documentHidden) notifyProgress(runner, event, 'start');
|
2493
2533
|
close();
|
2534
|
+
if (documentHidden) notifyProgress(runner, event, 'close');
|
2494
2535
|
return runner;
|
2495
2536
|
}
|
2496
2537
|
|
@@ -2640,6 +2681,11 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
|
|
2640
2681
|
markElementAnimationState(element, RUNNING_STATE);
|
2641
2682
|
var realRunner = $$animation(element, event, animationDetails.options);
|
2642
2683
|
|
2684
|
+
// this will update the runner's flow-control events based on
|
2685
|
+
// the `realRunner` object.
|
2686
|
+
runner.setHost(realRunner);
|
2687
|
+
notifyProgress(runner, event, 'start', {});
|
2688
|
+
|
2643
2689
|
realRunner.done(function(status) {
|
2644
2690
|
close(!status);
|
2645
2691
|
var animationDetails = activeAnimationsLookup.get(node);
|
@@ -2648,11 +2694,6 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
|
|
2648
2694
|
}
|
2649
2695
|
notifyProgress(runner, event, 'close', {});
|
2650
2696
|
});
|
2651
|
-
|
2652
|
-
// this will update the runner's flow-control events based on
|
2653
|
-
// the `realRunner` object.
|
2654
|
-
runner.setHost(realRunner);
|
2655
|
-
notifyProgress(runner, event, 'start', {});
|
2656
2697
|
});
|
2657
2698
|
|
2658
2699
|
return runner;
|
@@ -2669,7 +2710,10 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
|
|
2669
2710
|
forEach(callbacks, function(callback) {
|
2670
2711
|
callback(element, phase, data);
|
2671
2712
|
});
|
2713
|
+
cleanupEventListeners(phase, element);
|
2672
2714
|
});
|
2715
|
+
} else {
|
2716
|
+
cleanupEventListeners(phase, element);
|
2673
2717
|
}
|
2674
2718
|
});
|
2675
2719
|
runner.progress(event, phase, data);
|
@@ -2728,30 +2772,31 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
|
|
2728
2772
|
var animateChildren;
|
2729
2773
|
var elementDisabled = disabledElementsLookup.get(getDomNode(element));
|
2730
2774
|
|
2731
|
-
var parentHost =
|
2775
|
+
var parentHost = jqLite.data(element[0], NG_ANIMATE_PIN_DATA);
|
2732
2776
|
if (parentHost) {
|
2733
2777
|
parentElement = parentHost;
|
2734
2778
|
}
|
2735
2779
|
|
2736
|
-
|
2780
|
+
parentElement = getDomNode(parentElement);
|
2781
|
+
|
2782
|
+
while (parentElement) {
|
2737
2783
|
if (!rootElementDetected) {
|
2738
2784
|
// angular doesn't want to attempt to animate elements outside of the application
|
2739
2785
|
// therefore we need to ensure that the rootElement is an ancestor of the current element
|
2740
2786
|
rootElementDetected = isMatchingElement(parentElement, $rootElement);
|
2741
2787
|
}
|
2742
2788
|
|
2743
|
-
|
2744
|
-
if (parentNode.nodeType !== ELEMENT_NODE) {
|
2789
|
+
if (parentElement.nodeType !== ELEMENT_NODE) {
|
2745
2790
|
// no point in inspecting the #document element
|
2746
2791
|
break;
|
2747
2792
|
}
|
2748
2793
|
|
2749
|
-
var details = activeAnimationsLookup.get(
|
2794
|
+
var details = activeAnimationsLookup.get(parentElement) || {};
|
2750
2795
|
// either an enter, leave or move animation will commence
|
2751
2796
|
// therefore we can't allow any animations to take place
|
2752
2797
|
// but if a parent animation is class-based then that's ok
|
2753
2798
|
if (!parentAnimationDetected) {
|
2754
|
-
var parentElementDisabled = disabledElementsLookup.get(
|
2799
|
+
var parentElementDisabled = disabledElementsLookup.get(parentElement);
|
2755
2800
|
|
2756
2801
|
if (parentElementDisabled === true && elementDisabled !== false) {
|
2757
2802
|
// disable animations if the user hasn't explicitly enabled animations on the
|
@@ -2766,7 +2811,7 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
|
|
2766
2811
|
}
|
2767
2812
|
|
2768
2813
|
if (isUndefined(animateChildren) || animateChildren === true) {
|
2769
|
-
var value =
|
2814
|
+
var value = jqLite.data(parentElement, NG_ANIMATE_CHILDREN_DATA);
|
2770
2815
|
if (isDefined(value)) {
|
2771
2816
|
animateChildren = value;
|
2772
2817
|
}
|
@@ -2789,15 +2834,15 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
|
|
2789
2834
|
|
2790
2835
|
if (!rootElementDetected) {
|
2791
2836
|
// If no rootElement is detected, check if the parentElement is pinned to another element
|
2792
|
-
parentHost =
|
2837
|
+
parentHost = jqLite.data(parentElement, NG_ANIMATE_PIN_DATA);
|
2793
2838
|
if (parentHost) {
|
2794
2839
|
// The pin target element becomes the next parent element
|
2795
|
-
parentElement = parentHost;
|
2840
|
+
parentElement = getDomNode(parentHost);
|
2796
2841
|
continue;
|
2797
2842
|
}
|
2798
2843
|
}
|
2799
2844
|
|
2800
|
-
parentElement = parentElement.
|
2845
|
+
parentElement = parentElement.parentNode;
|
2801
2846
|
}
|
2802
2847
|
|
2803
2848
|
var allowAnimation = (!parentAnimationDetected || animateChildren) && elementDisabled !== true;
|
@@ -3238,11 +3283,17 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
|
|
3238
3283
|
*
|
3239
3284
|
* ngAnimateSwap is a animation-oriented directive that allows for the container to
|
3240
3285
|
* be removed and entered in whenever the associated expression changes. A
|
3241
|
-
* common usecase for this directive is a rotating banner component which
|
3286
|
+
* common usecase for this directive is a rotating banner or slider component which
|
3242
3287
|
* contains one image being present at a time. When the active image changes
|
3243
3288
|
* then the old image will perform a `leave` animation and the new element
|
3244
3289
|
* will be inserted via an `enter` animation.
|
3245
3290
|
*
|
3291
|
+
* @animations
|
3292
|
+
* | Animation | Occurs |
|
3293
|
+
* |----------------------------------|--------------------------------------|
|
3294
|
+
* | {@link ng.$animate#enter enter} | when the new element is inserted to the DOM |
|
3295
|
+
* | {@link ng.$animate#leave leave} | when the old element is removed from the DOM |
|
3296
|
+
*
|
3246
3297
|
* @example
|
3247
3298
|
* <example name="ngAnimateSwap-directive" module="ngAnimateSwapExample"
|
3248
3299
|
* deps="angular-animate.js"
|
@@ -3467,7 +3518,7 @@ var ngAnimateSwapDirective = ['$animate', '$rootScope', function($animate, $root
|
|
3467
3518
|
* <div ng-show="bool" class="fade">
|
3468
3519
|
* Show and hide me
|
3469
3520
|
* </div>
|
3470
|
-
* <button ng-click="bool
|
3521
|
+
* <button ng-click="bool=!bool">Toggle</button>
|
3471
3522
|
*
|
3472
3523
|
* <style>
|
3473
3524
|
* .fade.ng-hide {
|
@@ -4036,31 +4087,6 @@ var ngAnimateSwapDirective = ['$animate', '$rootScope', function($animate, $root
|
|
4036
4087
|
* possible be sure to visit the {@link ng.$animate $animate service API page}.
|
4037
4088
|
*
|
4038
4089
|
*
|
4039
|
-
* ### Preventing Collisions With Third Party Libraries
|
4040
|
-
*
|
4041
|
-
* Some third-party frameworks place animation duration defaults across many element or className
|
4042
|
-
* selectors in order to make their code small and reuseable. This can lead to issues with ngAnimate, which
|
4043
|
-
* is expecting actual animations on these elements and has to wait for their completion.
|
4044
|
-
*
|
4045
|
-
* You can prevent this unwanted behavior by using a prefix on all your animation classes:
|
4046
|
-
*
|
4047
|
-
* ```css
|
4048
|
-
* /* prefixed with animate- */
|
4049
|
-
* .animate-fade-add.animate-fade-add-active {
|
4050
|
-
* transition:1s linear all;
|
4051
|
-
* opacity:0;
|
4052
|
-
* }
|
4053
|
-
* ```
|
4054
|
-
*
|
4055
|
-
* You then configure `$animate` to enforce this prefix:
|
4056
|
-
*
|
4057
|
-
* ```js
|
4058
|
-
* $animateProvider.classNameFilter(/animate-/);
|
4059
|
-
* ```
|
4060
|
-
*
|
4061
|
-
* This also may provide your application with a speed boost since only specific elements containing CSS class prefix
|
4062
|
-
* will be evaluated for animation when any DOM changes occur in the application.
|
4063
|
-
*
|
4064
4090
|
* ## Callbacks and Promises
|
4065
4091
|
*
|
4066
4092
|
* When `$animate` is called it returns a promise that can be used to capture when the animation has ended. Therefore if we were to trigger
|
@@ -1,9 +1,9 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.5.
|
2
|
+
* @license AngularJS v1.5.5
|
3
3
|
* (c) 2010-2016 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
6
|
-
(function(window, angular
|
6
|
+
(function(window, angular) {'use strict';
|
7
7
|
|
8
8
|
/**
|
9
9
|
* @ngdoc module
|
@@ -21,7 +21,7 @@
|
|
21
21
|
*
|
22
22
|
* For ngAria to do its magic, simply include the module `ngAria` as a dependency. The following
|
23
23
|
* directives are supported:
|
24
|
-
* `ngModel`, `ngChecked`, `ngRequired`, `ngValue`, `ngDisabled`, `ngShow`, `ngHide`, `ngClick`,
|
24
|
+
* `ngModel`, `ngChecked`, `ngReadonly`, `ngRequired`, `ngValue`, `ngDisabled`, `ngShow`, `ngHide`, `ngClick`,
|
25
25
|
* `ngDblClick`, and `ngMessages`.
|
26
26
|
*
|
27
27
|
* Below is a more detailed breakdown of the attributes handled by ngAria:
|
@@ -30,8 +30,9 @@
|
|
30
30
|
* |---------------------------------------------|----------------------------------------------------------------------------------------|
|
31
31
|
* | {@link ng.directive:ngModel ngModel} | aria-checked, aria-valuemin, aria-valuemax, aria-valuenow, aria-invalid, aria-required, input roles |
|
32
32
|
* | {@link ng.directive:ngDisabled ngDisabled} | aria-disabled |
|
33
|
-
* | {@link ng.directive:ngRequired ngRequired} | aria-required
|
34
|
-
* | {@link ng.directive:ngChecked ngChecked} | aria-checked
|
33
|
+
* | {@link ng.directive:ngRequired ngRequired} | aria-required
|
34
|
+
* | {@link ng.directive:ngChecked ngChecked} | aria-checked
|
35
|
+
* | {@link ng.directive:ngReadonly ngReadonly} | aria-readonly ||
|
35
36
|
* | {@link ng.directive:ngValue ngValue} | aria-checked |
|
36
37
|
* | {@link ng.directive:ngShow ngShow} | aria-hidden |
|
37
38
|
* | {@link ng.directive:ngHide ngHide} | aria-hidden |
|
@@ -96,6 +97,7 @@ function $AriaProvider() {
|
|
96
97
|
var config = {
|
97
98
|
ariaHidden: true,
|
98
99
|
ariaChecked: true,
|
100
|
+
ariaReadonly: true,
|
99
101
|
ariaDisabled: true,
|
100
102
|
ariaRequired: true,
|
101
103
|
ariaInvalid: true,
|
@@ -113,6 +115,7 @@ function $AriaProvider() {
|
|
113
115
|
*
|
114
116
|
* - **ariaHidden** – `{boolean}` – Enables/disables aria-hidden tags
|
115
117
|
* - **ariaChecked** – `{boolean}` – Enables/disables aria-checked tags
|
118
|
+
* - **ariaReadonly** – `{boolean}` – Enables/disables aria-readonly tags
|
116
119
|
* - **ariaDisabled** – `{boolean}` – Enables/disables aria-disabled tags
|
117
120
|
* - **ariaRequired** – `{boolean}` – Enables/disables aria-required tags
|
118
121
|
* - **ariaInvalid** – `{boolean}` – Enables/disables aria-invalid tags
|
@@ -175,6 +178,7 @@ function $AriaProvider() {
|
|
175
178
|
* The full list of directives that interface with ngAria:
|
176
179
|
* * **ngModel**
|
177
180
|
* * **ngChecked**
|
181
|
+
* * **ngReadonly**
|
178
182
|
* * **ngRequired**
|
179
183
|
* * **ngDisabled**
|
180
184
|
* * **ngValue**
|
@@ -214,6 +218,9 @@ ngAriaModule.directive('ngShow', ['$aria', function($aria) {
|
|
214
218
|
.directive('ngChecked', ['$aria', function($aria) {
|
215
219
|
return $aria.$$watchExpr('ngChecked', 'aria-checked', nodeBlackList, false);
|
216
220
|
}])
|
221
|
+
.directive('ngReadonly', ['$aria', function($aria) {
|
222
|
+
return $aria.$$watchExpr('ngReadonly', 'aria-readonly', nodeBlackList, false);
|
223
|
+
}])
|
217
224
|
.directive('ngRequired', ['$aria', function($aria) {
|
218
225
|
return $aria.$$watchExpr('ngRequired', 'aria-required', nodeBlackList, false);
|
219
226
|
}])
|
@@ -1,9 +1,9 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.5.
|
2
|
+
* @license AngularJS v1.5.5
|
3
3
|
* (c) 2010-2016 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
6
|
-
(function(window, angular
|
6
|
+
(function(window, angular) {'use strict';
|
7
7
|
|
8
8
|
/**
|
9
9
|
* @ngdoc module
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.5.
|
2
|
+
* @license AngularJS v1.5.5
|
3
3
|
* (c) 2010-2016 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -87,7 +87,7 @@ function minErr(module, ErrorConstructor) {
|
|
87
87
|
return match;
|
88
88
|
});
|
89
89
|
|
90
|
-
message += '\nhttp://errors.angularjs.org/1.5.
|
90
|
+
message += '\nhttp://errors.angularjs.org/1.5.5/' +
|
91
91
|
(module ? module + '/' : '') + code;
|
92
92
|
|
93
93
|
for (i = SKIP_INDEXES, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') {
|
@@ -296,9 +296,9 @@ function setupModuleLoader(window) {
|
|
296
296
|
* @ngdoc method
|
297
297
|
* @name angular.Module#decorator
|
298
298
|
* @module ng
|
299
|
-
* @param {string} The name of the service to decorate.
|
300
|
-
* @param {Function} This function will be invoked when the service needs to be
|
301
|
-
*
|
299
|
+
* @param {string} name The name of the service to decorate.
|
300
|
+
* @param {Function} decorFn This function will be invoked when the service needs to be
|
301
|
+
* instantiated and should return the decorated service instance.
|
302
302
|
* @description
|
303
303
|
* See {@link auto.$provide#decorator $provide.decorator()}.
|
304
304
|
*/
|
@@ -1,9 +1,9 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.5.
|
2
|
+
* @license AngularJS v1.5.5
|
3
3
|
* (c) 2010-2016 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
6
|
-
(function(window, angular
|
6
|
+
(function(window, angular) {'use strict';
|
7
7
|
|
8
8
|
// NOTE: ADVANCED_OPTIMIZATIONS mode.
|
9
9
|
//
|
@@ -1,9 +1,9 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.5.
|
2
|
+
* @license AngularJS v1.5.5
|
3
3
|
* (c) 2010-2016 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
6
|
-
(function(window, angular
|
6
|
+
(function(window, angular) {'use strict';
|
7
7
|
|
8
8
|
/* jshint ignore:start */
|
9
9
|
// this code is in the core, but not in angular-messages.js
|
@@ -29,45 +29,66 @@ var jqLite = angular.element;
|
|
29
29
|
* `ngMessage` and `ngMessageExp` directives.
|
30
30
|
*
|
31
31
|
* # Usage
|
32
|
-
* The `ngMessages` directive
|
33
|
-
*
|
34
|
-
*
|
35
|
-
*
|
32
|
+
* The `ngMessages` directive allows keys in a key/value collection to be associated with a child element
|
33
|
+
* (or 'message') that will show or hide based on the truthiness of that key's value in the collection. A common use
|
34
|
+
* case for `ngMessages` is to display error messages for inputs using the `$error` object exposed by the
|
35
|
+
* {@link ngModel ngModel} directive.
|
36
|
+
*
|
37
|
+
* The child elements of the `ngMessages` directive are matched to the collection keys by a `ngMessage` or
|
38
|
+
* `ngMessageExp` directive. The value of these attributes must match a key in the collection that is provided by
|
39
|
+
* the `ngMessages` directive.
|
40
|
+
*
|
41
|
+
* Consider the following example, which illustrates a typical use case of `ngMessages`. Within the form `myForm` we
|
42
|
+
* have a text input named `myField` which is bound to the scope variable `field` using the {@link ngModel ngModel}
|
43
|
+
* directive.
|
44
|
+
*
|
45
|
+
* The `myField` field is a required input of type `email` with a maximum length of 15 characters.
|
36
46
|
*
|
37
47
|
* ```html
|
38
48
|
* <form name="myForm">
|
39
49
|
* <label>
|
40
50
|
* Enter text:
|
41
|
-
* <input type="
|
51
|
+
* <input type="email" ng-model="field" name="myField" required maxlength="15" />
|
42
52
|
* </label>
|
43
53
|
* <div ng-messages="myForm.myField.$error" role="alert">
|
44
|
-
* <div ng-message="required">
|
45
|
-
* <div ng-message="
|
46
|
-
*
|
47
|
-
* </div>
|
54
|
+
* <div ng-message="required">Please enter a value for this field.</div>
|
55
|
+
* <div ng-message="email">This field must be a valid email address.</div>
|
56
|
+
* <div ng-message="maxlength">This field can be at most 15 characters long.</div>
|
48
57
|
* </div>
|
49
58
|
* </form>
|
50
59
|
* ```
|
51
60
|
*
|
52
|
-
*
|
53
|
-
* the
|
54
|
-
*
|
55
|
-
*
|
61
|
+
* In order to show error messages corresponding to `myField` we first create an element with an `ngMessages` attribute
|
62
|
+
* set to the `$error` object owned by the `myField` input in our `myForm` form.
|
63
|
+
*
|
64
|
+
* Within this element we then create separate elements for each of the possible errors that `myField` could have.
|
65
|
+
* The `ngMessage` attribute is used to declare which element(s) will appear for which error - for example,
|
66
|
+
* setting `ng-message="required"` specifies that this particular element should be displayed when there
|
67
|
+
* is no value present for the required field `myField` (because the key `required` will be `true` in the object
|
68
|
+
* `myForm.myField.$error`).
|
69
|
+
*
|
70
|
+
* ### Message order
|
71
|
+
*
|
72
|
+
* By default, `ngMessages` will only display one message for a particular key/value collection at any time. If more
|
73
|
+
* than one message (or error) key is currently true, then which message is shown is determined by the order of messages
|
74
|
+
* in the HTML template code (messages declared first are prioritised). This mechanism means the developer does not have
|
75
|
+
* to prioritise messages using custom JavaScript code.
|
76
|
+
*
|
77
|
+
* Given the following error object for our example (which informs us that the field `myField` currently has both the
|
78
|
+
* `required` and `email` errors):
|
56
79
|
*
|
57
80
|
* ```javascript
|
58
81
|
* <!-- keep in mind that ngModel automatically sets these error flags -->
|
59
|
-
* myField.$error = {
|
82
|
+
* myField.$error = { required : true, email: true, maxlength: false };
|
60
83
|
* ```
|
84
|
+
* The `required` message will be displayed to the user since it appears before the `email` message in the DOM.
|
85
|
+
* Once the user types a single character, the `required` message will disappear (since the field now has a value)
|
86
|
+
* but the `email` message will be visible because it is still applicable.
|
61
87
|
*
|
62
|
-
*
|
63
|
-
* will be displayed right after (since these messages are ordered this way in the template HTML code).
|
64
|
-
* The prioritization of each message is determined by what order they're present in the DOM.
|
65
|
-
* Therefore, instead of having custom JavaScript code determine the priority of what errors are
|
66
|
-
* present before others, the presentation of the errors are handled within the template.
|
88
|
+
* ### Displaying multiple messages at the same time
|
67
89
|
*
|
68
|
-
*
|
69
|
-
*
|
70
|
-
* ngMessages directive to make this happen.
|
90
|
+
* While `ngMessages` will by default only display one error element at a time, the `ng-messages-multiple` attribute can
|
91
|
+
* be applied to the `ngMessages` container element to cause it to display all applicable error messages at once:
|
71
92
|
*
|
72
93
|
* ```html
|
73
94
|
* <!-- attribute-style usage -->
|
@@ -394,6 +415,13 @@ angular.module('ngMessages', [])
|
|
394
415
|
|
395
416
|
$scope.$watchCollection($attrs.ngMessages || $attrs['for'], ctrl.render);
|
396
417
|
|
418
|
+
// If the element is destroyed, proactively destroy all the currently visible messages
|
419
|
+
$element.on('$destroy', function() {
|
420
|
+
forEach(messages, function(item) {
|
421
|
+
item.message.detach();
|
422
|
+
});
|
423
|
+
});
|
424
|
+
|
397
425
|
this.reRender = function() {
|
398
426
|
if (!renderLater) {
|
399
427
|
renderLater = true;
|
@@ -428,6 +456,7 @@ angular.module('ngMessages', [])
|
|
428
456
|
function findPreviousMessage(parent, comment) {
|
429
457
|
var prevNode = comment;
|
430
458
|
var parentLookup = [];
|
459
|
+
|
431
460
|
while (prevNode && prevNode !== parent) {
|
432
461
|
var prevKey = prevNode.$$ngMessageNode;
|
433
462
|
if (prevKey && prevKey.length) {
|
@@ -439,8 +468,11 @@ angular.module('ngMessages', [])
|
|
439
468
|
if (prevNode.childNodes.length && parentLookup.indexOf(prevNode) == -1) {
|
440
469
|
parentLookup.push(prevNode);
|
441
470
|
prevNode = prevNode.childNodes[prevNode.childNodes.length - 1];
|
471
|
+
} else if (prevNode.previousSibling) {
|
472
|
+
prevNode = prevNode.previousSibling;
|
442
473
|
} else {
|
443
|
-
prevNode = prevNode.
|
474
|
+
prevNode = prevNode.parentNode;
|
475
|
+
parentLookup.push(prevNode);
|
444
476
|
}
|
445
477
|
}
|
446
478
|
}
|
@@ -527,7 +559,10 @@ angular.module('ngMessages', [])
|
|
527
559
|
element.after(contents);
|
528
560
|
|
529
561
|
// the anchor is placed for debugging purposes
|
530
|
-
var
|
562
|
+
var comment = $compile.$$createComment ?
|
563
|
+
$compile.$$createComment('ngMessagesInclude', src) :
|
564
|
+
$document[0].createComment(' ngMessagesInclude: ' + src + ' ');
|
565
|
+
var anchor = jqLite(comment);
|
531
566
|
element.after(anchor);
|
532
567
|
|
533
568
|
// we don't want to pollute the DOM anymore by keeping an empty directive element
|
@@ -650,8 +685,8 @@ function ngMessageDirectiveFactory() {
|
|
650
685
|
// when we are destroying the node later.
|
651
686
|
var $$attachId = currentElement.$$attachId = ngMessagesCtrl.getAttachId();
|
652
687
|
|
653
|
-
// in the event that the parent element is destroyed
|
654
|
-
// by
|
688
|
+
// in the event that the element or a parent element is destroyed
|
689
|
+
// by another structural directive then it's time
|
655
690
|
// to deregister the message from the controller
|
656
691
|
currentElement.on('$destroy', function() {
|
657
692
|
if (currentElement && currentElement.$$attachId === $$attachId) {
|