Skip to content
This repository was archived by the owner on Sep 5, 2024. It is now read-only.

Commit 06b2e77

Browse files
committed
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
1 parent 8081404 commit 06b2e77

File tree

5 files changed

+113
-1
lines changed

5 files changed

+113
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<div ng-controller="DemoCtrl as demo" layout="column">
2+
<md-content class="md-padding" layout="column">
3+
<p>
4+
You can also hide the speed dial programmatically.
5+
</p>
6+
7+
<md-checkbox ng-model="demo.hidden">
8+
Hide the speed dial.
9+
</md-checkbox>
10+
11+
<div class="lock-size" layout="row" layout-align="center center">
12+
<md-fab-speed-dial ng-hide="demo.hidden" md-direction="down" class="md-fling">
13+
<md-fab-trigger>
14+
<md-button aria-label="menu" class="md-fab md-warn">
15+
<md-icon md-svg-src="img/icons/menu.svg"></md-icon>
16+
</md-button>
17+
</md-fab-trigger>
18+
19+
<md-fab-actions>
20+
<md-button aria-label="twitter" class="md-fab md-raised md-mini">
21+
<md-icon md-svg-src="img/icons/twitter.svg"></md-icon>
22+
</md-button>
23+
24+
<md-button aria-label="facebook" class="md-fab md-raised md-mini">
25+
<md-icon md-svg-src="img/icons/facebook.svg"></md-icon>
26+
</md-button>
27+
28+
<md-button aria-label="Google Hangout" class="md-fab md-raised md-mini">
29+
<md-icon md-svg-src="img/icons/hangout.svg"></md-icon>
30+
</md-button>
31+
</md-fab-actions>
32+
</md-fab-speed-dial>
33+
</div>
34+
</md-content>
35+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
(function() {
2+
'use strict';
3+
4+
angular.module('fabSpeedDialHidingDemo', ['ngMaterial'])
5+
.controller('DemoCtrl', function() {
6+
this.hidden = false;
7+
});
8+
})();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
.text-capitalize {
2+
text-transform: capitalize;
3+
}
4+
5+
.md-fab:hover, .md-fab.md-focused {
6+
background-color: #000 !important;
7+
}
8+
9+
p.note {
10+
font-size: 1.2rem;
11+
}
12+
13+
.lock-size {
14+
min-width: 300px;
15+
min-height: 300px;
16+
width: 300px;
17+
height: 300px;
18+
margin-left: auto;
19+
margin-right: auto;
20+
}

src/components/fabSpeedDial/fabSpeedDial.js

+14-1
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,23 @@
22
'use strict';
33

44
angular
5+
// Declare our module
56
.module('material.components.fabSpeedDial', [
67
'material.core',
78
'material.components.fabTrigger',
89
'material.components.fabActions'
910
])
11+
12+
// Register our directive
1013
.directive('mdFabSpeedDial', MdFabSpeedDialDirective)
14+
15+
// Register our custom animations
1116
.animation('.md-fling', MdFabSpeedDialFlingAnimation)
12-
.animation('.md-scale', MdFabSpeedDialScaleAnimation);
17+
.animation('.md-scale', MdFabSpeedDialScaleAnimation)
18+
19+
// Register a service for each animation so that we can easily inject them into unit tests
20+
.service('mdFabSpeedDialFlingAnimation', MdFabSpeedDialFlingAnimation)
21+
.service('mdFabSpeedDialScaleAnimation', MdFabSpeedDialScaleAnimation);
1322

1423
/**
1524
* @ngdoc directive
@@ -199,10 +208,12 @@
199208
addClass: function(element, className, done) {
200209
if (element.hasClass('md-fling')) {
201210
runAnimation(element);
211+
done();
202212
}
203213
},
204214
removeClass: function(element, className, done) {
205215
runAnimation(element);
216+
done();
206217
}
207218
}
208219
}
@@ -229,10 +240,12 @@
229240
return {
230241
addClass: function(element, className, done) {
231242
runAnimation(element);
243+
done();
232244
},
233245

234246
removeClass: function(element, className, done) {
235247
runAnimation(element);
248+
done();
236249
}
237250
}
238251
}

src/components/fabSpeedDial/fabSpeedDial.spec.js

+36
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,40 @@ describe('<md-fab-speed-dial> directive', function() {
8383
expect(controller.isOpen).toBe(false);
8484
}));
8585

86+
it('properly finishes the fling animation', inject(function(mdFabSpeedDialFlingAnimation) {
87+
compileAndLink(
88+
'<md-fab-speed-dial md-open="isOpen" class="md-fling">' +
89+
' <md-fab-trigger><button></button></md-fab-trigger>' +
90+
' <md-fab-actions><button></button></md-fab-actions>' +
91+
'</md-fab-speed-dial>'
92+
);
93+
94+
var addDone = jasmine.createSpy('addDone');
95+
var removeDone = jasmine.createSpy('removeDone');
96+
97+
mdFabSpeedDialFlingAnimation.addClass(element, 'md-is-open', addDone);
98+
expect(addDone).toHaveBeenCalled();
99+
100+
mdFabSpeedDialFlingAnimation.removeClass(element, 'md-is-open', removeDone);
101+
expect(removeDone).toHaveBeenCalled();
102+
}));
103+
104+
it('properly finishes the scale animation', inject(function(mdFabSpeedDialScaleAnimation) {
105+
compileAndLink(
106+
'<md-fab-speed-dial md-open="isOpen" class="md-fling">' +
107+
' <md-fab-trigger><button></button></md-fab-trigger>' +
108+
' <md-fab-actions><button></button></md-fab-actions>' +
109+
'</md-fab-speed-dial>'
110+
);
111+
112+
var addDone = jasmine.createSpy('addDone');
113+
var removeDone = jasmine.createSpy('removeDone');
114+
115+
mdFabSpeedDialScaleAnimation.addClass(element, 'md-is-open', addDone);
116+
expect(addDone).toHaveBeenCalled();
117+
118+
mdFabSpeedDialScaleAnimation.removeClass(element, 'md-is-open', removeDone);
119+
expect(removeDone).toHaveBeenCalled();
120+
}));
121+
86122
});

0 commit comments

Comments
 (0)