angularjs-rails 1.2.13 → 1.2.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/angularjs-rails/version.rb +1 -1
- data/vendor/assets/javascripts/angular-animate.js +286 -261
- data/vendor/assets/javascripts/angular-cookies.js +14 -19
- data/vendor/assets/javascripts/angular-loader.js +33 -29
- data/vendor/assets/javascripts/angular-mocks.js +163 -139
- data/vendor/assets/javascripts/angular-resource.js +34 -33
- data/vendor/assets/javascripts/angular-route.js +55 -54
- data/vendor/assets/javascripts/angular-sanitize.js +17 -18
- data/vendor/assets/javascripts/angular-scenario.js +1647 -1468
- data/vendor/assets/javascripts/angular-touch.js +21 -23
- data/vendor/assets/javascripts/angular.js +1646 -1467
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4b6ecf5eea62ec6e6a1bf705921fe554bb40f748
|
4
|
+
data.tar.gz: 9d5fbe9e03c5671e105153b0a89102e109ef8465
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e4192934a9c7d3f16635428efd4ad0e8594cb1565fc8a75de53efa7699f2e1468c4b3fa07934772e8321522638cfbf7dd8fbf1124647e0976df5ccd2a7600fbe
|
7
|
+
data.tar.gz: e906b90edff483cd3576bb7313a0d45c4aeaad8e2ce75b4cd3c892a6c8956632197ba62470656550e5f4445e2ff77d97b1be3d0df30f5f478354b9fc8e3c4e79
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
2
|
+
* @license AngularJS v1.2.14
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -8,7 +8,7 @@
|
|
8
8
|
/* jshint maxlen: false */
|
9
9
|
|
10
10
|
/**
|
11
|
-
* @ngdoc
|
11
|
+
* @ngdoc module
|
12
12
|
* @name ngAnimate
|
13
13
|
* @description
|
14
14
|
*
|
@@ -16,7 +16,6 @@
|
|
16
16
|
*
|
17
17
|
* The `ngAnimate` module provides support for JavaScript, CSS3 transition and CSS3 keyframe animation hooks within existing core and custom directives.
|
18
18
|
*
|
19
|
-
* {@installModule animate}
|
20
19
|
*
|
21
20
|
* <div doc-module-components="ngAnimate"></div>
|
22
21
|
*
|
@@ -38,12 +37,14 @@
|
|
38
37
|
* | {@link ng.directive:ngIf#usage_animations ngIf} | enter and leave |
|
39
38
|
* | {@link ng.directive:ngClass#usage_animations ngClass} | add and remove |
|
40
39
|
* | {@link ng.directive:ngShow#usage_animations ngShow & ngHide} | add and remove (the ng-hide class value) |
|
40
|
+
* | {@link ng.directive:form#usage_animations form} | add and remove (dirty, pristine, valid, invalid & all other validations) |
|
41
|
+
* | {@link ng.directive:ngModel#usage_animations ngModel} | add and remove (dirty, pristine, valid, invalid & all other validations) |
|
41
42
|
*
|
42
43
|
* You can find out more information about animations upon visiting each directive page.
|
43
44
|
*
|
44
45
|
* Below is an example of how to apply animations to a directive that supports animation hooks:
|
45
46
|
*
|
46
|
-
*
|
47
|
+
* ```html
|
47
48
|
* <style type="text/css">
|
48
49
|
* .slide.ng-enter, .slide.ng-leave {
|
49
50
|
* -webkit-transition:0.5s linear all;
|
@@ -61,7 +62,7 @@
|
|
61
62
|
* to trigger the CSS transition/animations
|
62
63
|
* -->
|
63
64
|
* <ANY class="slide" ng-include="..."></ANY>
|
64
|
-
*
|
65
|
+
* ```
|
65
66
|
*
|
66
67
|
* Keep in mind that if an animation is running, any child elements cannot be animated until the parent element's
|
67
68
|
* animation has completed.
|
@@ -73,7 +74,7 @@
|
|
73
74
|
*
|
74
75
|
* The following code below demonstrates how to perform animations using **CSS transitions** with Angular:
|
75
76
|
*
|
76
|
-
*
|
77
|
+
* ```html
|
77
78
|
* <style type="text/css">
|
78
79
|
* /*
|
79
80
|
* The animate class is apart of the element and the ng-enter class
|
@@ -101,11 +102,11 @@
|
|
101
102
|
* <div class="view-container">
|
102
103
|
* <div ng-view class="reveal-animation"></div>
|
103
104
|
* </div>
|
104
|
-
*
|
105
|
+
* ```
|
105
106
|
*
|
106
107
|
* The following code below demonstrates how to perform animations using **CSS animations** with Angular:
|
107
108
|
*
|
108
|
-
*
|
109
|
+
* ```html
|
109
110
|
* <style type="text/css">
|
110
111
|
* .reveal-animation.ng-enter {
|
111
112
|
* -webkit-animation: enter_sequence 1s linear; /* Safari/Chrome */
|
@@ -124,7 +125,7 @@
|
|
124
125
|
* <div class="view-container">
|
125
126
|
* <div ng-view class="reveal-animation"></div>
|
126
127
|
* </div>
|
127
|
-
*
|
128
|
+
* ```
|
128
129
|
*
|
129
130
|
* Both CSS3 animations and transitions can be used together and the animate service will figure out the correct duration and delay timing.
|
130
131
|
*
|
@@ -142,7 +143,7 @@
|
|
142
143
|
* the animation. The style property expected within the stagger class can either be a **transition-delay** or an
|
143
144
|
* **animation-delay** property (or both if your animation contains both transitions and keyframe animations).
|
144
145
|
*
|
145
|
-
*
|
146
|
+
* ```css
|
146
147
|
* .my-animation.ng-enter {
|
147
148
|
* /* standard transition code */
|
148
149
|
* -webkit-transition: 1s linear all;
|
@@ -163,7 +164,7 @@
|
|
163
164
|
* /* standard transition styles */
|
164
165
|
* opacity:1;
|
165
166
|
* }
|
166
|
-
*
|
167
|
+
* ```
|
167
168
|
*
|
168
169
|
* Staggering animations work by default in ngRepeat (so long as the CSS class is defined). Outside of ngRepeat, to use staggering animations
|
169
170
|
* on your own, they can be triggered by firing multiple calls to the same event on $animate. However, the restrictions surrounding this
|
@@ -172,7 +173,7 @@
|
|
172
173
|
*
|
173
174
|
* The following code will issue the **ng-leave-stagger** event on the element provided:
|
174
175
|
*
|
175
|
-
*
|
176
|
+
* ```js
|
176
177
|
* var kids = parent.children();
|
177
178
|
*
|
178
179
|
* $animate.leave(kids[0]); //stagger index=0
|
@@ -186,7 +187,7 @@
|
|
186
187
|
* $animate.leave(kids[5]); //stagger index=0
|
187
188
|
* $animate.leave(kids[6]); //stagger index=1
|
188
189
|
* }, 100, false);
|
189
|
-
*
|
190
|
+
* ```
|
190
191
|
*
|
191
192
|
* Stagger animations are currently only supported within CSS-defined animations.
|
192
193
|
*
|
@@ -194,7 +195,7 @@
|
|
194
195
|
* In the event that you do not want to use CSS3 transitions or CSS3 animations or if you wish to offer animations on browsers that do not
|
195
196
|
* yet support CSS transitions/animations, then you can make use of JavaScript animations defined inside of your AngularJS module.
|
196
197
|
*
|
197
|
-
*
|
198
|
+
* ```js
|
198
199
|
* //!annotate="YourApp" Your AngularJS Module|Replace this or ngModule with the module that you used to define your application.
|
199
200
|
* var ngModule = angular.module('YourApp', ['ngAnimate']);
|
200
201
|
* ngModule.animation('.my-crazy-animation', function() {
|
@@ -223,7 +224,7 @@
|
|
223
224
|
* removeClass: function(element, className, done) { }
|
224
225
|
* };
|
225
226
|
* });
|
226
|
-
*
|
227
|
+
* ```
|
227
228
|
*
|
228
229
|
* JavaScript-defined animations are created with a CSS-like class selector and a collection of events which are set to run
|
229
230
|
* a javascript callback function. When an animation is triggered, $animate will look for a matching animation which fits
|
@@ -241,8 +242,8 @@
|
|
241
242
|
angular.module('ngAnimate', ['ng'])
|
242
243
|
|
243
244
|
/**
|
244
|
-
* @ngdoc
|
245
|
-
* @name
|
245
|
+
* @ngdoc provider
|
246
|
+
* @name $animateProvider
|
246
247
|
* @description
|
247
248
|
*
|
248
249
|
* The `$animateProvider` allows developers to register JavaScript animation event handlers directly inside of a module.
|
@@ -254,42 +255,24 @@ angular.module('ngAnimate', ['ng'])
|
|
254
255
|
* Please visit the {@link ngAnimate `ngAnimate`} module overview page learn more about how to use animations in your application.
|
255
256
|
*
|
256
257
|
*/
|
257
|
-
|
258
|
-
|
258
|
+
|
259
|
+
//this private service is only used within CSS-enabled animations
|
260
|
+
//IE8 + IE9 do not support rAF natively, but that is fine since they
|
261
|
+
//also don't support transitions and keyframes which means that the code
|
262
|
+
//below will never be used by the two browsers.
|
263
|
+
.factory('$$animateReflow', ['$$rAF', '$document', function($$rAF, $document) {
|
259
264
|
var bod = $document[0].body;
|
260
|
-
var requestAnimationFrame = $window.requestAnimationFrame ||
|
261
|
-
$window.webkitRequestAnimationFrame ||
|
262
|
-
function(fn) {
|
263
|
-
return $timeout(fn, 10, false);
|
264
|
-
};
|
265
|
-
|
266
|
-
var cancelAnimationFrame = $window.cancelAnimationFrame ||
|
267
|
-
$window.webkitCancelAnimationFrame ||
|
268
|
-
function(timer) {
|
269
|
-
return $timeout.cancel(timer);
|
270
|
-
};
|
271
265
|
return function(fn) {
|
272
|
-
|
266
|
+
//the returned function acts as the cancellation function
|
267
|
+
return $$rAF(function() {
|
268
|
+
//the line below will force the browser to perform a repaint
|
269
|
+
//so that all the animated elements within the animation frame
|
270
|
+
//will be properly updated and drawn on screen. This is
|
271
|
+
//required to perform multi-class CSS based animations with
|
272
|
+
//Firefox. DO NOT REMOVE THIS LINE.
|
273
273
|
var a = bod.offsetWidth + 1;
|
274
274
|
fn();
|
275
275
|
});
|
276
|
-
return function() {
|
277
|
-
cancelAnimationFrame(id);
|
278
|
-
};
|
279
|
-
};
|
280
|
-
}])
|
281
|
-
|
282
|
-
.factory('$$asyncQueueBuffer', ['$timeout', function($timeout) {
|
283
|
-
var timer, queue = [];
|
284
|
-
return function(fn) {
|
285
|
-
$timeout.cancel(timer);
|
286
|
-
queue.push(fn);
|
287
|
-
timer = $timeout(function() {
|
288
|
-
for(var i = 0; i < queue.length; i++) {
|
289
|
-
queue[i]();
|
290
|
-
}
|
291
|
-
queue = [];
|
292
|
-
}, 0, false);
|
293
276
|
};
|
294
277
|
}])
|
295
278
|
|
@@ -320,8 +303,8 @@ angular.module('ngAnimate', ['ng'])
|
|
320
303
|
return extractElementNode(elm1) == extractElementNode(elm2);
|
321
304
|
}
|
322
305
|
|
323
|
-
$provide.decorator('$animate', ['$delegate', '$injector', '$sniffer', '$rootElement', '$$
|
324
|
-
function($delegate, $injector, $sniffer, $rootElement, $$
|
306
|
+
$provide.decorator('$animate', ['$delegate', '$injector', '$sniffer', '$rootElement', '$$asyncCallback', '$rootScope', '$document',
|
307
|
+
function($delegate, $injector, $sniffer, $rootElement, $$asyncCallback, $rootScope, $document) {
|
325
308
|
|
326
309
|
var globalAnimationCounter = 0;
|
327
310
|
$rootElement.data(NG_ANIMATE_STATE, rootAnimateState);
|
@@ -372,9 +355,151 @@ angular.module('ngAnimate', ['ng'])
|
|
372
355
|
}
|
373
356
|
}
|
374
357
|
|
358
|
+
function animationRunner(element, animationEvent, className) {
|
359
|
+
//transcluded directives may sometimes fire an animation using only comment nodes
|
360
|
+
//best to catch this early on to prevent any animation operations from occurring
|
361
|
+
var node = element[0];
|
362
|
+
if(!node) {
|
363
|
+
return;
|
364
|
+
}
|
365
|
+
|
366
|
+
var isSetClassOperation = animationEvent == 'setClass';
|
367
|
+
var isClassBased = isSetClassOperation ||
|
368
|
+
animationEvent == 'addClass' ||
|
369
|
+
animationEvent == 'removeClass';
|
370
|
+
|
371
|
+
var classNameAdd, classNameRemove;
|
372
|
+
if(angular.isArray(className)) {
|
373
|
+
classNameAdd = className[0];
|
374
|
+
classNameRemove = className[1];
|
375
|
+
className = classNameAdd + ' ' + classNameRemove;
|
376
|
+
}
|
377
|
+
|
378
|
+
var currentClassName = element.attr('class');
|
379
|
+
var classes = currentClassName + ' ' + className;
|
380
|
+
if(!isAnimatableClassName(classes)) {
|
381
|
+
return;
|
382
|
+
}
|
383
|
+
|
384
|
+
var beforeComplete = noop,
|
385
|
+
beforeCancel = [],
|
386
|
+
before = [],
|
387
|
+
afterComplete = noop,
|
388
|
+
afterCancel = [],
|
389
|
+
after = [];
|
390
|
+
|
391
|
+
var animationLookup = (' ' + classes).replace(/\s+/g,'.');
|
392
|
+
forEach(lookup(animationLookup), function(animationFactory) {
|
393
|
+
var created = registerAnimation(animationFactory, animationEvent);
|
394
|
+
if(!created && isSetClassOperation) {
|
395
|
+
registerAnimation(animationFactory, 'addClass');
|
396
|
+
registerAnimation(animationFactory, 'removeClass');
|
397
|
+
}
|
398
|
+
});
|
399
|
+
|
400
|
+
function registerAnimation(animationFactory, event) {
|
401
|
+
var afterFn = animationFactory[event];
|
402
|
+
var beforeFn = animationFactory['before' + event.charAt(0).toUpperCase() + event.substr(1)];
|
403
|
+
if(afterFn || beforeFn) {
|
404
|
+
if(event == 'leave') {
|
405
|
+
beforeFn = afterFn;
|
406
|
+
//when set as null then animation knows to skip this phase
|
407
|
+
afterFn = null;
|
408
|
+
}
|
409
|
+
after.push({
|
410
|
+
event : event, fn : afterFn
|
411
|
+
});
|
412
|
+
before.push({
|
413
|
+
event : event, fn : beforeFn
|
414
|
+
});
|
415
|
+
return true;
|
416
|
+
}
|
417
|
+
}
|
418
|
+
|
419
|
+
function run(fns, cancellations, allCompleteFn) {
|
420
|
+
var animations = [];
|
421
|
+
forEach(fns, function(animation) {
|
422
|
+
animation.fn && animations.push(animation);
|
423
|
+
});
|
424
|
+
|
425
|
+
var count = 0;
|
426
|
+
function afterAnimationComplete(index) {
|
427
|
+
if(cancellations) {
|
428
|
+
(cancellations[index] || noop)();
|
429
|
+
if(++count < animations.length) return;
|
430
|
+
cancellations = null;
|
431
|
+
}
|
432
|
+
allCompleteFn();
|
433
|
+
}
|
434
|
+
|
435
|
+
//The code below adds directly to the array in order to work with
|
436
|
+
//both sync and async animations. Sync animations are when the done()
|
437
|
+
//operation is called right away. DO NOT REFACTOR!
|
438
|
+
forEach(animations, function(animation, index) {
|
439
|
+
var progress = function() {
|
440
|
+
afterAnimationComplete(index);
|
441
|
+
};
|
442
|
+
switch(animation.event) {
|
443
|
+
case 'setClass':
|
444
|
+
cancellations.push(animation.fn(element, classNameAdd, classNameRemove, progress));
|
445
|
+
break;
|
446
|
+
case 'addClass':
|
447
|
+
cancellations.push(animation.fn(element, classNameAdd || className, progress));
|
448
|
+
break;
|
449
|
+
case 'removeClass':
|
450
|
+
cancellations.push(animation.fn(element, classNameRemove || className, progress));
|
451
|
+
break;
|
452
|
+
default:
|
453
|
+
cancellations.push(animation.fn(element, progress));
|
454
|
+
break;
|
455
|
+
}
|
456
|
+
});
|
457
|
+
|
458
|
+
if(cancellations && cancellations.length === 0) {
|
459
|
+
allCompleteFn();
|
460
|
+
}
|
461
|
+
}
|
462
|
+
|
463
|
+
return {
|
464
|
+
node : node,
|
465
|
+
event : animationEvent,
|
466
|
+
className : className,
|
467
|
+
isClassBased : isClassBased,
|
468
|
+
isSetClassOperation : isSetClassOperation,
|
469
|
+
before : function(allCompleteFn) {
|
470
|
+
beforeComplete = allCompleteFn;
|
471
|
+
run(before, beforeCancel, function() {
|
472
|
+
beforeComplete = noop;
|
473
|
+
allCompleteFn();
|
474
|
+
});
|
475
|
+
},
|
476
|
+
after : function(allCompleteFn) {
|
477
|
+
afterComplete = allCompleteFn;
|
478
|
+
run(after, afterCancel, function() {
|
479
|
+
afterComplete = noop;
|
480
|
+
allCompleteFn();
|
481
|
+
});
|
482
|
+
},
|
483
|
+
cancel : function() {
|
484
|
+
if(beforeCancel) {
|
485
|
+
forEach(beforeCancel, function(cancelFn) {
|
486
|
+
(cancelFn || noop)(true);
|
487
|
+
});
|
488
|
+
beforeComplete(true);
|
489
|
+
}
|
490
|
+
if(afterCancel) {
|
491
|
+
forEach(afterCancel, function(cancelFn) {
|
492
|
+
(cancelFn || noop)(true);
|
493
|
+
});
|
494
|
+
afterComplete(true);
|
495
|
+
}
|
496
|
+
}
|
497
|
+
};
|
498
|
+
}
|
499
|
+
|
375
500
|
/**
|
376
|
-
* @ngdoc
|
377
|
-
* @name
|
501
|
+
* @ngdoc service
|
502
|
+
* @name $animate
|
378
503
|
* @function
|
379
504
|
*
|
380
505
|
* @description
|
@@ -393,9 +518,8 @@ angular.module('ngAnimate', ['ng'])
|
|
393
518
|
*/
|
394
519
|
return {
|
395
520
|
/**
|
396
|
-
* @ngdoc
|
397
|
-
* @name
|
398
|
-
* @methodOf ngAnimate.$animate
|
521
|
+
* @ngdoc method
|
522
|
+
* @name $animate#enter
|
399
523
|
* @function
|
400
524
|
*
|
401
525
|
* @description
|
@@ -417,9 +541,9 @@ angular.module('ngAnimate', ['ng'])
|
|
417
541
|
* | 9. The animation ends and all generated CSS classes are removed from the element | class="my-animation" |
|
418
542
|
* | 10. The doneCallback() callback is fired (if provided) | class="my-animation" |
|
419
543
|
*
|
420
|
-
* @param {
|
421
|
-
* @param {
|
422
|
-
* @param {
|
544
|
+
* @param {DOMElement} element the element that will be the focus of the enter animation
|
545
|
+
* @param {DOMElement} parentElement the parent element of the element that will be the focus of the enter animation
|
546
|
+
* @param {DOMElement} afterElement the sibling element (which is the previous element) of the element that will be the focus of the enter animation
|
423
547
|
* @param {function()=} doneCallback the callback function that will be called once the animation is complete
|
424
548
|
*/
|
425
549
|
enter : function(element, parentElement, afterElement, doneCallback) {
|
@@ -432,9 +556,8 @@ angular.module('ngAnimate', ['ng'])
|
|
432
556
|
},
|
433
557
|
|
434
558
|
/**
|
435
|
-
* @ngdoc
|
436
|
-
* @name
|
437
|
-
* @methodOf ngAnimate.$animate
|
559
|
+
* @ngdoc method
|
560
|
+
* @name $animate#leave
|
438
561
|
* @function
|
439
562
|
*
|
440
563
|
* @description
|
@@ -456,24 +579,22 @@ angular.module('ngAnimate', ['ng'])
|
|
456
579
|
* | 9. The element is removed from the DOM | ... |
|
457
580
|
* | 10. The doneCallback() callback is fired (if provided) | ... |
|
458
581
|
*
|
459
|
-
* @param {
|
582
|
+
* @param {DOMElement} element the element that will be the focus of the leave animation
|
460
583
|
* @param {function()=} doneCallback the callback function that will be called once the animation is complete
|
461
584
|
*/
|
462
585
|
leave : function(element, doneCallback) {
|
463
586
|
cancelChildAnimations(element);
|
464
587
|
this.enabled(false, element);
|
465
588
|
$rootScope.$$postDigest(function() {
|
466
|
-
|
467
|
-
performAnimation('leave', 'ng-leave', element, null, null, function() {
|
589
|
+
performAnimation('leave', 'ng-leave', stripCommentsFromElement(element), null, null, function() {
|
468
590
|
$delegate.leave(element);
|
469
591
|
}, doneCallback);
|
470
592
|
});
|
471
593
|
},
|
472
594
|
|
473
595
|
/**
|
474
|
-
* @ngdoc
|
475
|
-
* @name
|
476
|
-
* @methodOf ngAnimate.$animate
|
596
|
+
* @ngdoc method
|
597
|
+
* @name $animate#move
|
477
598
|
* @function
|
478
599
|
*
|
479
600
|
* @description
|
@@ -496,9 +617,9 @@ angular.module('ngAnimate', ['ng'])
|
|
496
617
|
* | 9. The animation ends and all generated CSS classes are removed from the element | class="my-animation" |
|
497
618
|
* | 10. The doneCallback() callback is fired (if provided) | class="my-animation" |
|
498
619
|
*
|
499
|
-
* @param {
|
500
|
-
* @param {
|
501
|
-
* @param {
|
620
|
+
* @param {DOMElement} element the element that will be the focus of the move animation
|
621
|
+
* @param {DOMElement} parentElement the parentElement element of the element that will be the focus of the move animation
|
622
|
+
* @param {DOMElement} afterElement the sibling element (which is the previous element) of the element that will be the focus of the move animation
|
502
623
|
* @param {function()=} doneCallback the callback function that will be called once the animation is complete
|
503
624
|
*/
|
504
625
|
move : function(element, parentElement, afterElement, doneCallback) {
|
@@ -512,9 +633,8 @@ angular.module('ngAnimate', ['ng'])
|
|
512
633
|
},
|
513
634
|
|
514
635
|
/**
|
515
|
-
* @ngdoc
|
516
|
-
* @name
|
517
|
-
* @methodOf ngAnimate.$animate
|
636
|
+
* @ngdoc method
|
637
|
+
* @name $animate#addClass
|
518
638
|
*
|
519
639
|
* @description
|
520
640
|
* Triggers a custom animation event based off the className variable and then attaches the className value to the element as a CSS class.
|
@@ -532,12 +652,12 @@ angular.module('ngAnimate', ['ng'])
|
|
532
652
|
* | 4. $animate scans the element styles to get the CSS transition/animation duration and delay | class="my-animation ng-animate super-add" |
|
533
653
|
* | 5. $animate waits for 10ms (this performs a reflow) | class="my-animation ng-animate super-add" |
|
534
654
|
* | 6. the .super, .super-add-active and .ng-animate-active classes are added (this triggers the CSS transition/animation) | class="my-animation ng-animate ng-animate-active super super-add super-add-active" |
|
535
|
-
* | 7. $animate waits for X milliseconds for the animation to complete | class="my-animation super-add super-add-active" |
|
655
|
+
* | 7. $animate waits for X milliseconds for the animation to complete | class="my-animation super super-add super-add-active" |
|
536
656
|
* | 8. The animation ends and all generated CSS classes are removed from the element | class="my-animation super" |
|
537
657
|
* | 9. The super class is kept on the element | class="my-animation super" |
|
538
658
|
* | 10. The doneCallback() callback is fired (if provided) | class="my-animation super" |
|
539
659
|
*
|
540
|
-
* @param {
|
660
|
+
* @param {DOMElement} element the element that will be animated
|
541
661
|
* @param {string} className the CSS class that will be added to the element and then animated
|
542
662
|
* @param {function()=} doneCallback the callback function that will be called once the animation is complete
|
543
663
|
*/
|
@@ -549,9 +669,8 @@ angular.module('ngAnimate', ['ng'])
|
|
549
669
|
},
|
550
670
|
|
551
671
|
/**
|
552
|
-
* @ngdoc
|
553
|
-
* @name
|
554
|
-
* @methodOf ngAnimate.$animate
|
672
|
+
* @ngdoc method
|
673
|
+
* @name $animate#removeClass
|
555
674
|
*
|
556
675
|
* @description
|
557
676
|
* Triggers a custom animation event based off the className variable and then removes the CSS class provided by the className value
|
@@ -574,7 +693,7 @@ angular.module('ngAnimate', ['ng'])
|
|
574
693
|
* | 9. The doneCallback() callback is fired (if provided) | class="my-animation" |
|
575
694
|
*
|
576
695
|
*
|
577
|
-
* @param {
|
696
|
+
* @param {DOMElement} element the element that will be animated
|
578
697
|
* @param {string} className the CSS class that will be animated and then removed from the element
|
579
698
|
* @param {function()=} doneCallback the callback function that will be called once the animation is complete
|
580
699
|
*/
|
@@ -593,11 +712,11 @@ angular.module('ngAnimate', ['ng'])
|
|
593
712
|
* @function
|
594
713
|
* @description Adds and/or removes the given CSS classes to and from the element.
|
595
714
|
* Once complete, the done() callback will be fired (if provided).
|
596
|
-
* @param {
|
715
|
+
* @param {DOMElement} element the element which will it's CSS classes changed
|
597
716
|
* removed from it
|
598
717
|
* @param {string} add the CSS classes which will be added to the element
|
599
718
|
* @param {string} remove the CSS class which will be removed from the element
|
600
|
-
* @param {
|
719
|
+
* @param {Function=} done the callback function (if provided) that will be fired after the
|
601
720
|
* CSS classes have been set on the element
|
602
721
|
*/
|
603
722
|
setClass : function(element, add, remove, doneCallback) {
|
@@ -608,13 +727,12 @@ angular.module('ngAnimate', ['ng'])
|
|
608
727
|
},
|
609
728
|
|
610
729
|
/**
|
611
|
-
* @ngdoc
|
612
|
-
* @name
|
613
|
-
* @methodOf ngAnimate.$animate
|
730
|
+
* @ngdoc method
|
731
|
+
* @name $animate#enabled
|
614
732
|
* @function
|
615
733
|
*
|
616
734
|
* @param {boolean=} value If provided then set the animation on or off.
|
617
|
-
* @param {
|
735
|
+
* @param {DOMElement=} element If provided then the element will be used to represent the enable/disable operation
|
618
736
|
* @return {boolean} Current animation state.
|
619
737
|
*
|
620
738
|
* @description
|
@@ -654,22 +772,8 @@ angular.module('ngAnimate', ['ng'])
|
|
654
772
|
*/
|
655
773
|
function performAnimation(animationEvent, className, element, parentElement, afterElement, domOperation, doneCallback) {
|
656
774
|
|
657
|
-
var
|
658
|
-
if(
|
659
|
-
classNameAdd = className[0];
|
660
|
-
classNameRemove = className[1];
|
661
|
-
className = classNameAdd + ' ' + classNameRemove;
|
662
|
-
}
|
663
|
-
|
664
|
-
var currentClassName, classes, node = element[0];
|
665
|
-
if(node) {
|
666
|
-
currentClassName = node.className;
|
667
|
-
classes = currentClassName + ' ' + className;
|
668
|
-
}
|
669
|
-
|
670
|
-
//transcluded directives may sometimes fire an animation using only comment nodes
|
671
|
-
//best to catch this early on to prevent any animation operations from occurring
|
672
|
-
if(!node || !isAnimatableClassName(classes)) {
|
775
|
+
var runner = animationRunner(element, animationEvent, className);
|
776
|
+
if(!runner) {
|
673
777
|
fireDOMOperation();
|
674
778
|
fireBeforeCallbackAsync();
|
675
779
|
fireAfterCallbackAsync();
|
@@ -677,29 +781,30 @@ angular.module('ngAnimate', ['ng'])
|
|
677
781
|
return;
|
678
782
|
}
|
679
783
|
|
680
|
-
|
784
|
+
className = runner.className;
|
785
|
+
var elementEvents = angular.element._data(runner.node);
|
681
786
|
elementEvents = elementEvents && elementEvents.events;
|
682
787
|
|
683
|
-
var animationLookup = (' ' + classes).replace(/\s+/g,'.');
|
684
788
|
if (!parentElement) {
|
685
789
|
parentElement = afterElement ? afterElement.parent() : element.parent();
|
686
790
|
}
|
687
791
|
|
688
|
-
var matches = lookup(animationLookup);
|
689
|
-
var isClassBased = animationEvent == 'addClass' ||
|
690
|
-
animationEvent == 'removeClass' ||
|
691
|
-
setClassOperation;
|
692
792
|
var ngAnimateState = element.data(NG_ANIMATE_STATE) || {};
|
693
|
-
|
694
793
|
var runningAnimations = ngAnimateState.active || {};
|
695
794
|
var totalActiveAnimations = ngAnimateState.totalActive || 0;
|
696
795
|
var lastAnimation = ngAnimateState.last;
|
697
796
|
|
797
|
+
//only allow animations if the currently running animation is not structural
|
798
|
+
//or if there is no animation running at all
|
799
|
+
var skipAnimations = runner.isClassBased ?
|
800
|
+
ngAnimateState.disabled || (lastAnimation && !lastAnimation.isClassBased) :
|
801
|
+
false;
|
802
|
+
|
698
803
|
//skip the animation if animations are disabled, a parent is already being animated,
|
699
804
|
//the element is not currently attached to the document body or then completely close
|
700
805
|
//the animation if any matching animations are not found at all.
|
701
|
-
//NOTE: IE8 + IE9 should close properly (run closeAnimation()) in case
|
702
|
-
if (animationsDisabled(element, parentElement)
|
806
|
+
//NOTE: IE8 + IE9 should close properly (run closeAnimation()) in case an animation was found.
|
807
|
+
if (skipAnimations || animationsDisabled(element, parentElement)) {
|
703
808
|
fireDOMOperation();
|
704
809
|
fireBeforeCallbackAsync();
|
705
810
|
fireAfterCallbackAsync();
|
@@ -707,50 +812,10 @@ angular.module('ngAnimate', ['ng'])
|
|
707
812
|
return;
|
708
813
|
}
|
709
814
|
|
710
|
-
var animations = [];
|
711
|
-
|
712
|
-
//only add animations if the currently running animation is not structural
|
713
|
-
//or if there is no animation running at all
|
714
|
-
var allowAnimations = isClassBased ?
|
715
|
-
!ngAnimateState.disabled && (!lastAnimation || lastAnimation.classBased) :
|
716
|
-
true;
|
717
|
-
|
718
|
-
if(allowAnimations) {
|
719
|
-
forEach(matches, function(animation) {
|
720
|
-
//add the animation to the queue to if it is allowed to be cancelled
|
721
|
-
if(!animation.allowCancel || animation.allowCancel(element, animationEvent, className)) {
|
722
|
-
var beforeFn, afterFn = animation[animationEvent];
|
723
|
-
|
724
|
-
//Special case for a leave animation since there is no point in performing an
|
725
|
-
//animation on a element node that has already been removed from the DOM
|
726
|
-
if(animationEvent == 'leave') {
|
727
|
-
beforeFn = afterFn;
|
728
|
-
afterFn = null; //this must be falsy so that the animation is skipped for leave
|
729
|
-
} else {
|
730
|
-
beforeFn = animation['before' + animationEvent.charAt(0).toUpperCase() + animationEvent.substr(1)];
|
731
|
-
}
|
732
|
-
animations.push({
|
733
|
-
before : beforeFn,
|
734
|
-
after : afterFn
|
735
|
-
});
|
736
|
-
}
|
737
|
-
});
|
738
|
-
}
|
739
|
-
|
740
|
-
//this would mean that an animation was not allowed so let the existing
|
741
|
-
//animation do it's thing and close this one early
|
742
|
-
if(animations.length === 0) {
|
743
|
-
fireDOMOperation();
|
744
|
-
fireBeforeCallbackAsync();
|
745
|
-
fireAfterCallbackAsync();
|
746
|
-
fireDoneCallbackAsync();
|
747
|
-
return;
|
748
|
-
}
|
749
|
-
|
750
815
|
var skipAnimation = false;
|
751
816
|
if(totalActiveAnimations > 0) {
|
752
817
|
var animationsToCancel = [];
|
753
|
-
if(!isClassBased) {
|
818
|
+
if(!runner.isClassBased) {
|
754
819
|
if(animationEvent == 'leave' && runningAnimations['ng-leave']) {
|
755
820
|
skipAnimation = true;
|
756
821
|
} else {
|
@@ -777,14 +842,13 @@ angular.module('ngAnimate', ['ng'])
|
|
777
842
|
}
|
778
843
|
|
779
844
|
if(animationsToCancel.length > 0) {
|
780
|
-
|
781
|
-
|
782
|
-
cancelAnimations(operation.animations);
|
845
|
+
forEach(animationsToCancel, function(operation) {
|
846
|
+
operation.cancel();
|
783
847
|
});
|
784
848
|
}
|
785
849
|
}
|
786
850
|
|
787
|
-
if(isClassBased && !
|
851
|
+
if(runner.isClassBased && !runner.isSetClassOperation && !skipAnimation) {
|
788
852
|
skipAnimation = (animationEvent == 'addClass') == element.hasClass(className); //opposite of XOR
|
789
853
|
}
|
790
854
|
|
@@ -795,23 +859,33 @@ angular.module('ngAnimate', ['ng'])
|
|
795
859
|
return;
|
796
860
|
}
|
797
861
|
|
862
|
+
if(animationEvent == 'leave') {
|
863
|
+
//there's no need to ever remove the listener since the element
|
864
|
+
//will be removed (destroyed) after the leave animation ends or
|
865
|
+
//is cancelled midway
|
866
|
+
element.one('$destroy', function(e) {
|
867
|
+
var element = angular.element(this);
|
868
|
+
var state = element.data(NG_ANIMATE_STATE);
|
869
|
+
if(state) {
|
870
|
+
var activeLeaveAnimation = state.active['ng-leave'];
|
871
|
+
if(activeLeaveAnimation) {
|
872
|
+
activeLeaveAnimation.cancel();
|
873
|
+
cleanup(element, 'ng-leave');
|
874
|
+
}
|
875
|
+
}
|
876
|
+
});
|
877
|
+
}
|
878
|
+
|
798
879
|
//the ng-animate class does nothing, but it's here to allow for
|
799
880
|
//parent animations to find and cancel child animations when needed
|
800
881
|
element.addClass(NG_ANIMATE_CLASS_NAME);
|
801
882
|
|
802
883
|
var localAnimationCount = globalAnimationCounter++;
|
803
|
-
lastAnimation = {
|
804
|
-
classBased : isClassBased,
|
805
|
-
event : animationEvent,
|
806
|
-
animations : animations,
|
807
|
-
done:onBeforeAnimationsComplete
|
808
|
-
};
|
809
|
-
|
810
884
|
totalActiveAnimations++;
|
811
|
-
runningAnimations[className] =
|
885
|
+
runningAnimations[className] = runner;
|
812
886
|
|
813
887
|
element.data(NG_ANIMATE_STATE, {
|
814
|
-
last :
|
888
|
+
last : runner,
|
815
889
|
active : runningAnimations,
|
816
890
|
index : localAnimationCount,
|
817
891
|
totalActive : totalActiveAnimations
|
@@ -819,77 +893,26 @@ angular.module('ngAnimate', ['ng'])
|
|
819
893
|
|
820
894
|
//first we run the before animations and when all of those are complete
|
821
895
|
//then we perform the DOM operation and run the next set of animations
|
822
|
-
|
823
|
-
|
824
|
-
function onBeforeAnimationsComplete(cancelled) {
|
896
|
+
fireBeforeCallbackAsync();
|
897
|
+
runner.before(function(cancelled) {
|
825
898
|
var data = element.data(NG_ANIMATE_STATE);
|
826
899
|
cancelled = cancelled ||
|
827
|
-
|
828
|
-
|
900
|
+
!data || !data.active[className] ||
|
901
|
+
(runner.isClassBased && data.active[className].event != animationEvent);
|
829
902
|
|
830
903
|
fireDOMOperation();
|
831
904
|
if(cancelled === true) {
|
832
905
|
closeAnimation();
|
833
|
-
|
834
|
-
|
835
|
-
|
836
|
-
//set the done function to the final done function
|
837
|
-
//so that the DOM event won't be executed twice by accident
|
838
|
-
//if the after animation is cancelled as well
|
839
|
-
var currentAnimation = data.active[className];
|
840
|
-
currentAnimation.done = closeAnimation;
|
841
|
-
invokeRegisteredAnimationFns(animations, 'after', closeAnimation);
|
842
|
-
}
|
843
|
-
|
844
|
-
function invokeRegisteredAnimationFns(animations, phase, allAnimationFnsComplete) {
|
845
|
-
phase == 'after' ?
|
846
|
-
fireAfterCallbackAsync() :
|
847
|
-
fireBeforeCallbackAsync();
|
848
|
-
|
849
|
-
var endFnName = phase + 'End';
|
850
|
-
forEach(animations, function(animation, index) {
|
851
|
-
var animationPhaseCompleted = function() {
|
852
|
-
progress(index, phase);
|
853
|
-
};
|
854
|
-
|
855
|
-
//there are no before functions for enter + move since the DOM
|
856
|
-
//operations happen before the performAnimation method fires
|
857
|
-
if(phase == 'before' && (animationEvent == 'enter' || animationEvent == 'move')) {
|
858
|
-
animationPhaseCompleted();
|
859
|
-
return;
|
860
|
-
}
|
861
|
-
|
862
|
-
if(animation[phase]) {
|
863
|
-
if(setClassOperation) {
|
864
|
-
animation[endFnName] = animation[phase](element, classNameAdd, classNameRemove, animationPhaseCompleted);
|
865
|
-
} else {
|
866
|
-
animation[endFnName] = isClassBased ?
|
867
|
-
animation[phase](element, className, animationPhaseCompleted) :
|
868
|
-
animation[phase](element, animationPhaseCompleted);
|
869
|
-
}
|
870
|
-
} else {
|
871
|
-
animationPhaseCompleted();
|
872
|
-
}
|
873
|
-
});
|
874
|
-
|
875
|
-
function progress(index, phase) {
|
876
|
-
var phaseCompletionFlag = phase + 'Complete';
|
877
|
-
var currentAnimation = animations[index];
|
878
|
-
currentAnimation[phaseCompletionFlag] = true;
|
879
|
-
(currentAnimation[endFnName] || noop)();
|
880
|
-
|
881
|
-
for(var i=0;i<animations.length;i++) {
|
882
|
-
if(!animations[i][phaseCompletionFlag]) return;
|
883
|
-
}
|
884
|
-
|
885
|
-
allAnimationFnsComplete();
|
906
|
+
} else {
|
907
|
+
fireAfterCallbackAsync();
|
908
|
+
runner.after(closeAnimation);
|
886
909
|
}
|
887
|
-
}
|
910
|
+
});
|
888
911
|
|
889
912
|
function fireDOMCallback(animationPhase) {
|
890
913
|
var eventName = '$animate:' + animationPhase;
|
891
914
|
if(elementEvents && elementEvents[eventName] && elementEvents[eventName].length > 0) {
|
892
|
-
$$
|
915
|
+
$$asyncCallback(function() {
|
893
916
|
element.triggerHandler(eventName, {
|
894
917
|
event : animationEvent,
|
895
918
|
className : className
|
@@ -909,13 +932,13 @@ angular.module('ngAnimate', ['ng'])
|
|
909
932
|
function fireDoneCallbackAsync() {
|
910
933
|
fireDOMCallback('close');
|
911
934
|
if(doneCallback) {
|
912
|
-
$$
|
935
|
+
$$asyncCallback(function() {
|
913
936
|
doneCallback();
|
914
937
|
});
|
915
938
|
}
|
916
939
|
}
|
917
940
|
|
918
|
-
//it is less complicated to use a flag than managing and
|
941
|
+
//it is less complicated to use a flag than managing and canceling
|
919
942
|
//timeouts containing multiple callbacks.
|
920
943
|
function fireDOMOperation() {
|
921
944
|
if(!fireDOMOperation.hasBeenRun) {
|
@@ -933,10 +956,10 @@ angular.module('ngAnimate', ['ng'])
|
|
933
956
|
animation, but class-based animations don't. An example of this
|
934
957
|
failing would be when a parent HTML tag has a ng-class attribute
|
935
958
|
causing ALL directives below to skip animations during the digest */
|
936
|
-
if(isClassBased) {
|
959
|
+
if(runner.isClassBased) {
|
937
960
|
cleanup(element, className);
|
938
961
|
} else {
|
939
|
-
$$
|
962
|
+
$$asyncCallback(function() {
|
940
963
|
var data = element.data(NG_ANIMATE_STATE) || {};
|
941
964
|
if(localAnimationCount == data.index) {
|
942
965
|
cleanup(element, className, animationEvent);
|
@@ -952,28 +975,20 @@ angular.module('ngAnimate', ['ng'])
|
|
952
975
|
|
953
976
|
function cancelChildAnimations(element) {
|
954
977
|
var node = extractElementNode(element);
|
955
|
-
|
956
|
-
|
957
|
-
|
958
|
-
|
959
|
-
|
960
|
-
|
961
|
-
|
962
|
-
|
963
|
-
|
964
|
-
|
965
|
-
|
966
|
-
|
967
|
-
|
968
|
-
|
969
|
-
forEach(animations, function(animation) {
|
970
|
-
if(!animation.beforeComplete) {
|
971
|
-
(animation.beforeEnd || noop)(isCancelledFlag);
|
972
|
-
}
|
973
|
-
if(!animation.afterComplete) {
|
974
|
-
(animation.afterEnd || noop)(isCancelledFlag);
|
975
|
-
}
|
976
|
-
});
|
978
|
+
if (node) {
|
979
|
+
var nodes = angular.isFunction(node.getElementsByClassName) ?
|
980
|
+
node.getElementsByClassName(NG_ANIMATE_CLASS_NAME) :
|
981
|
+
node.querySelectorAll('.' + NG_ANIMATE_CLASS_NAME);
|
982
|
+
forEach(nodes, function(element) {
|
983
|
+
element = angular.element(element);
|
984
|
+
var data = element.data(NG_ANIMATE_STATE);
|
985
|
+
if(data && data.active) {
|
986
|
+
forEach(data.active, function(runner) {
|
987
|
+
runner.cancel();
|
988
|
+
});
|
989
|
+
}
|
990
|
+
});
|
991
|
+
}
|
977
992
|
}
|
978
993
|
|
979
994
|
function cleanup(element, className) {
|
@@ -986,11 +1001,9 @@ angular.module('ngAnimate', ['ng'])
|
|
986
1001
|
var data = element.data(NG_ANIMATE_STATE) || {};
|
987
1002
|
|
988
1003
|
var removeAnimations = className === true;
|
989
|
-
if(!removeAnimations) {
|
990
|
-
|
991
|
-
|
992
|
-
delete data.active[className];
|
993
|
-
}
|
1004
|
+
if(!removeAnimations && data.active && data.active[className]) {
|
1005
|
+
data.totalActive--;
|
1006
|
+
delete data.active[className];
|
994
1007
|
}
|
995
1008
|
|
996
1009
|
if(removeAnimations || !data.totalActive) {
|
@@ -1094,6 +1107,15 @@ angular.module('ngAnimate', ['ng'])
|
|
1094
1107
|
var closingTimestamp = 0;
|
1095
1108
|
var animationElementQueue = [];
|
1096
1109
|
function animationCloseHandler(element, totalTime) {
|
1110
|
+
var node = extractElementNode(element);
|
1111
|
+
element = angular.element(node);
|
1112
|
+
|
1113
|
+
//this item will be garbage collected by the closing
|
1114
|
+
//animation timeout
|
1115
|
+
animationElementQueue.push(element);
|
1116
|
+
|
1117
|
+
//but it may not need to cancel out the existing timeout
|
1118
|
+
//if the timestamp is less than the previous one
|
1097
1119
|
var futureTimestamp = Date.now() + (totalTime * 1000);
|
1098
1120
|
if(futureTimestamp <= closingTimestamp) {
|
1099
1121
|
return;
|
@@ -1101,10 +1123,6 @@ angular.module('ngAnimate', ['ng'])
|
|
1101
1123
|
|
1102
1124
|
$timeout.cancel(closingTimer);
|
1103
1125
|
|
1104
|
-
var node = extractElementNode(element);
|
1105
|
-
element = angular.element(node);
|
1106
|
-
animationElementQueue.push(element);
|
1107
|
-
|
1108
1126
|
closingTimestamp = futureTimestamp;
|
1109
1127
|
closingTimer = $timeout(function() {
|
1110
1128
|
closeAllAnimations(animationElementQueue);
|
@@ -1243,7 +1261,7 @@ angular.module('ngAnimate', ['ng'])
|
|
1243
1261
|
itemIndex : itemIndex,
|
1244
1262
|
stagger : stagger,
|
1245
1263
|
timings : timings,
|
1246
|
-
closeAnimationFn :
|
1264
|
+
closeAnimationFn : noop
|
1247
1265
|
});
|
1248
1266
|
|
1249
1267
|
//temporarily disable the transition so that the enter styles
|
@@ -1252,7 +1270,14 @@ angular.module('ngAnimate', ['ng'])
|
|
1252
1270
|
if(transitionDuration > 0) {
|
1253
1271
|
blockTransitions(element, className, isCurrentlyAnimating);
|
1254
1272
|
}
|
1255
|
-
|
1273
|
+
|
1274
|
+
//staggering keyframe animations work by adjusting the `animation-delay` CSS property
|
1275
|
+
//on the given element, however, the delay value can only calculated after the reflow
|
1276
|
+
//since by that time $animate knows how many elements are being animated. Therefore,
|
1277
|
+
//until the reflow occurs the element needs to be blocked (where the keyframe animation
|
1278
|
+
//is set to `none 0s`). This blocking mechanism should only be set for when a stagger
|
1279
|
+
//animation is detected and when the element item index is greater than 0.
|
1280
|
+
if(animationDuration > 0 && stagger.animationDelay > 0 && stagger.animationDuration === 0) {
|
1256
1281
|
blockKeyframeAnimations(element);
|
1257
1282
|
}
|
1258
1283
|
|