From 37cfe91b762d8e30d0eebf26c63afb08d4008cff Mon Sep 17 00:00:00 2001 From: Topher Fangio Date: Sun, 28 Jun 2015 16:47:06 -0700 Subject: [PATCH] fix(fabSpeedDial): fix ability to use ng-hide the animations were not properly calling the `done()` callback, so the `ng-animate` class was never being removed closes #3313 --- .../fabSpeedDial/demoHiding/index.html | 35 ++++++++++++++++++ .../fabSpeedDial/demoHiding/script.js | 8 +++++ .../fabSpeedDial/demoHiding/style.scss | 20 +++++++++++ src/components/fabSpeedDial/fabSpeedDial.js | 15 +++++++- .../fabSpeedDial/fabSpeedDial.spec.js | 36 +++++++++++++++++++ 5 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 src/components/fabSpeedDial/demoHiding/index.html create mode 100644 src/components/fabSpeedDial/demoHiding/script.js create mode 100644 src/components/fabSpeedDial/demoHiding/style.scss diff --git a/src/components/fabSpeedDial/demoHiding/index.html b/src/components/fabSpeedDial/demoHiding/index.html new file mode 100644 index 00000000000..0894a8e9a98 --- /dev/null +++ b/src/components/fabSpeedDial/demoHiding/index.html @@ -0,0 +1,35 @@ +
+ +

+ You can also hide the speed dial programmatically. +

+ + + Hide the speed dial. + + +
+ + + + + + + + + + + + + + + + + + + + + +
+
+
diff --git a/src/components/fabSpeedDial/demoHiding/script.js b/src/components/fabSpeedDial/demoHiding/script.js new file mode 100644 index 00000000000..1bdb2945f7b --- /dev/null +++ b/src/components/fabSpeedDial/demoHiding/script.js @@ -0,0 +1,8 @@ +(function() { + 'use strict'; + + angular.module('fabSpeedDialHidingDemo', ['ngMaterial']) + .controller('DemoCtrl', function() { + this.hidden = false; + }); +})(); \ No newline at end of file diff --git a/src/components/fabSpeedDial/demoHiding/style.scss b/src/components/fabSpeedDial/demoHiding/style.scss new file mode 100644 index 00000000000..b7bdd49aa1d --- /dev/null +++ b/src/components/fabSpeedDial/demoHiding/style.scss @@ -0,0 +1,20 @@ +.text-capitalize { + text-transform: capitalize; +} + +.md-fab:hover, .md-fab.md-focused { + background-color: #000 !important; +} + +p.note { + font-size: 1.2rem; +} + +.lock-size { + min-width: 300px; + min-height: 300px; + width: 300px; + height: 300px; + margin-left: auto; + margin-right: auto; +} \ No newline at end of file diff --git a/src/components/fabSpeedDial/fabSpeedDial.js b/src/components/fabSpeedDial/fabSpeedDial.js index 61c4751e152..30ba4570f26 100644 --- a/src/components/fabSpeedDial/fabSpeedDial.js +++ b/src/components/fabSpeedDial/fabSpeedDial.js @@ -2,14 +2,23 @@ 'use strict'; angular + // Declare our module .module('material.components.fabSpeedDial', [ 'material.core', 'material.components.fabTrigger', 'material.components.fabActions' ]) + + // Register our directive .directive('mdFabSpeedDial', MdFabSpeedDialDirective) + + // Register our custom animations .animation('.md-fling', MdFabSpeedDialFlingAnimation) - .animation('.md-scale', MdFabSpeedDialScaleAnimation); + .animation('.md-scale', MdFabSpeedDialScaleAnimation) + + // Register a service for each animation so that we can easily inject them into unit tests + .service('mdFabSpeedDialFlingAnimation', MdFabSpeedDialFlingAnimation) + .service('mdFabSpeedDialScaleAnimation', MdFabSpeedDialScaleAnimation); /** * @ngdoc directive @@ -199,10 +208,12 @@ addClass: function(element, className, done) { if (element.hasClass('md-fling')) { runAnimation(element); + done(); } }, removeClass: function(element, className, done) { runAnimation(element); + done(); } } } @@ -229,10 +240,12 @@ return { addClass: function(element, className, done) { runAnimation(element); + done(); }, removeClass: function(element, className, done) { runAnimation(element); + done(); } } } diff --git a/src/components/fabSpeedDial/fabSpeedDial.spec.js b/src/components/fabSpeedDial/fabSpeedDial.spec.js index 3545a5cd9ff..c6b2f40d425 100644 --- a/src/components/fabSpeedDial/fabSpeedDial.spec.js +++ b/src/components/fabSpeedDial/fabSpeedDial.spec.js @@ -83,4 +83,40 @@ describe(' directive', function() { expect(controller.isOpen).toBe(false); })); + it('properly finishes the fling animation', inject(function(mdFabSpeedDialFlingAnimation) { + compileAndLink( + '' + + ' ' + + ' ' + + '' + ); + + var addDone = jasmine.createSpy('addDone'); + var removeDone = jasmine.createSpy('removeDone'); + + mdFabSpeedDialFlingAnimation.addClass(element, 'md-is-open', addDone); + expect(addDone).toHaveBeenCalled(); + + mdFabSpeedDialFlingAnimation.removeClass(element, 'md-is-open', removeDone); + expect(removeDone).toHaveBeenCalled(); + })); + + it('properly finishes the scale animation', inject(function(mdFabSpeedDialScaleAnimation) { + compileAndLink( + '' + + ' ' + + ' ' + + '' + ); + + var addDone = jasmine.createSpy('addDone'); + var removeDone = jasmine.createSpy('removeDone'); + + mdFabSpeedDialScaleAnimation.addClass(element, 'md-is-open', addDone); + expect(addDone).toHaveBeenCalled(); + + mdFabSpeedDialScaleAnimation.removeClass(element, 'md-is-open', removeDone); + expect(removeDone).toHaveBeenCalled(); + })); + });