Skip to content
This repository was archived by the owner on May 29, 2019. It is now read-only.

Commit 9bdb32e

Browse files
Foxandxsswesleycho
authored andcommittedSep 8, 2015
feat(collapse): use uib- prefix
Closes #4370
1 parent 79e38cb commit 9bdb32e

File tree

3 files changed

+124
-6
lines changed

3 files changed

+124
-6
lines changed
 

Diff for: ‎src/collapse/collapse.js

+86-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
angular.module('ui.bootstrap.collapse', [])
22

3-
.directive('collapse', ['$animate', '$injector', function($animate, $injector) {
3+
.directive('uibCollapse', ['$animate', '$injector', function($animate, $injector) {
44
var $animateCss = $injector.has('$animateCss') ? $injector.get('$animateCss') : null;
55
return {
66
link: function(scope, element, attrs) {
@@ -64,6 +64,91 @@ angular.module('ui.bootstrap.collapse', [])
6464
.addClass('collapse');
6565
}
6666

67+
scope.$watch(attrs.uibCollapse, function(shouldCollapse) {
68+
if (shouldCollapse) {
69+
collapse();
70+
} else {
71+
expand();
72+
}
73+
});
74+
}
75+
};
76+
}]);
77+
78+
/* Deprecated collapse below */
79+
80+
angular.module('ui.bootstrap.collapse')
81+
82+
.value('$collapseSuppressWarning', false)
83+
84+
.directive('collapse', ['$animate', '$injector', '$log', '$collapseSuppressWarning', function($animate, $injector, $log, $collapseSuppressWarning) {
85+
var $animateCss = $injector.has('$animateCss') ? $injector.get('$animateCss') : null;
86+
return {
87+
link: function(scope, element, attrs) {
88+
if (!$collapseSuppressWarning) {
89+
$log.warn('collapse is now deprecated. Use uib-collapse instead.');
90+
}
91+
92+
function expand() {
93+
element.removeClass('collapse')
94+
.addClass('collapsing')
95+
.attr('aria-expanded', true)
96+
.attr('aria-hidden', false);
97+
98+
if ($animateCss) {
99+
$animateCss(element, {
100+
addClass: 'in',
101+
easing: 'ease',
102+
to: { height: element[0].scrollHeight + 'px' }
103+
}).start().done(expandDone);
104+
} else {
105+
$animate.addClass(element, 'in', {
106+
to: { height: element[0].scrollHeight + 'px' }
107+
}).then(expandDone);
108+
}
109+
}
110+
111+
function expandDone() {
112+
element.removeClass('collapsing')
113+
.addClass('collapse')
114+
.css({height: 'auto'});
115+
}
116+
117+
function collapse() {
118+
if (!element.hasClass('collapse') && !element.hasClass('in')) {
119+
return collapseDone();
120+
}
121+
122+
element
123+
// IMPORTANT: The height must be set before adding "collapsing" class.
124+
// Otherwise, the browser attempts to animate from height 0 (in
125+
// collapsing class) to the given height here.
126+
.css({height: element[0].scrollHeight + 'px'})
127+
// initially all panel collapse have the collapse class, this removal
128+
// prevents the animation from jumping to collapsed state
129+
.removeClass('collapse')
130+
.addClass('collapsing')
131+
.attr('aria-expanded', false)
132+
.attr('aria-hidden', true);
133+
134+
if ($animateCss) {
135+
$animateCss(element, {
136+
removeClass: 'in',
137+
to: {height: '0'}
138+
}).start().done(collapseDone);
139+
} else {
140+
$animate.removeClass(element, 'in', {
141+
to: {height: '0'}
142+
}).then(collapseDone);
143+
}
144+
}
145+
146+
function collapseDone() {
147+
element.css({height: '0'}); // Required so that collapse works when animation is disabled
148+
element.removeClass('collapsing')
149+
.addClass('collapse');
150+
}
151+
67152
scope.$watch(attrs.collapse, function(shouldCollapse) {
68153
if (shouldCollapse) {
69154
collapse();

Diff for: ‎src/collapse/docs/demo.html

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<div ng-controller="CollapseDemoCtrl">
22
<button type="button" class="btn btn-default" ng-click="isCollapsed = !isCollapsed">Toggle collapse</button>
33
<hr>
4-
<div collapse="isCollapsed">
5-
<div class="well well-lg">Some content</div>
4+
<div uib-collapse="isCollapsed">
5+
<div class="well well-lg">Some content</div>
66
</div>
7-
</div>
7+
</div>

Diff for: ‎src/collapse/test/collapse.spec.js

+35-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ describe('collapse directive', function() {
1010
}));
1111

1212
beforeEach(function() {
13-
element = $compile('<div collapse="isCollapsed">Some Content</div>')(scope);
13+
element = $compile('<div uib-collapse="isCollapsed">Some Content</div>')(scope);
1414
angular.element(document.body).append(element);
1515
});
1616

@@ -98,7 +98,7 @@ describe('collapse directive', function() {
9898
var element;
9999

100100
beforeEach(function() {
101-
element = angular.element('<div collapse="isCollapsed"><p>Initial content</p><div ng-show="exp">Additional content</div></div>');
101+
element = angular.element('<div uib-collapse="isCollapsed"><p>Initial content</p><div ng-show="exp">Additional content</div></div>');
102102
$compile(element)(scope);
103103
angular.element(document.body).append(element);
104104
});
@@ -129,3 +129,36 @@ describe('collapse directive', function() {
129129
});
130130
});
131131
});
132+
133+
/* Deprecation tests below */
134+
135+
describe('collapse deprecation', function() {
136+
beforeEach(module('ui.bootstrap.collapse'));
137+
beforeEach(module('ngAnimateMock'));
138+
139+
it('should suppress warning', function() {
140+
module(function($provide) {
141+
$provide.value('$collapseSuppressWarning', true);
142+
});
143+
144+
inject(function($compile, $log, $rootScope) {
145+
spyOn($log, 'warn');
146+
147+
var element = $compile('<div collapse="isCollapsed">Some Content</div>')($rootScope);
148+
$rootScope.$digest();
149+
150+
expect($log.warn.calls.count()).toBe(0);
151+
});
152+
});
153+
154+
it('should give warning by default', inject(function($compile, $log, $rootScope) {
155+
spyOn($log, 'warn');
156+
157+
var element = $compile('<div collapse="isCollapsed">Some Content</div>')($rootScope);
158+
$rootScope.$digest();
159+
160+
expect($log.warn.calls.count()).toBe(1);
161+
expect($log.warn.calls.argsFor(0)).toEqual(['collapse is now deprecated. Use uib-collapse instead.']);
162+
163+
}));
164+
});

0 commit comments

Comments
 (0)