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

Commit 3819bbe

Browse files
committed
feat(accordion): remove replace: true usage
- Remove usage of `replace: true` - Remove unnecessary `panel-class` feature BREAKING CHANGE: This removes usage of `replace: true` in the accordion group, which results in a template change where the template no longer needs to contain the panel itself, but its contents. The accordion group will add the `panel` class by default, so the user just needs to add the appropriate classes to the accordion group element. This allows the user to use ng-class as well to fully control the panel related classes, so `panel-class` now is unnecessary Closes #5985
1 parent e2016fd commit 3819bbe

File tree

5 files changed

+57
-100
lines changed

5 files changed

+57
-100
lines changed

src/accordion/accordion.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ angular.module('ui.bootstrap.accordion', ['ui.bootstrap.collapse'])
5858
return {
5959
require: '^uibAccordion', // We need this directive to be inside an accordion
6060
transclude: true, // It transcludes the contents of the directive into the template
61-
replace: true, // The element containing the directive will be replaced with the template
61+
restrict: 'A',
6262
templateUrl: function(element, attrs) {
6363
return attrs.templateUrl || 'uib/template/accordion/accordion-group.html';
6464
},
@@ -74,6 +74,7 @@ angular.module('ui.bootstrap.accordion', ['ui.bootstrap.collapse'])
7474
};
7575
},
7676
link: function(scope, element, attrs, accordionCtrl) {
77+
element.addClass('panel');
7778
accordionCtrl.addGroup(scope);
7879

7980
scope.openClass = attrs.openClass || 'panel-open';

src/accordion/docs/demo.html

+25-27
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
<div ng-controller="AccordionDemoCtrl">
22
<script type="text/ng-template" id="group-template.html">
3-
<div class="panel {{panelClass || 'panel-default'}}">
4-
<div class="panel-heading">
5-
<h4 class="panel-title" style="color:#fa39c3">
6-
<a href tabindex="0" class="accordion-toggle" ng-click="toggleOpen()" uib-accordion-transclude="heading">
7-
<span uib-accordion-header ng-class="{'text-muted': isDisabled}">
8-
{{heading}}
9-
</span>
10-
</a>
11-
</h4>
12-
</div>
13-
<div class="panel-collapse collapse" uib-collapse="!isOpen">
14-
<div class="panel-body" style="text-align: right" ng-transclude></div>
15-
</div>
3+
<div class="panel-heading">
4+
<h4 class="panel-title" style="color:#fa39c3">
5+
<a href tabindex="0" class="accordion-toggle" ng-click="toggleOpen()" uib-accordion-transclude="heading">
6+
<span uib-accordion-header ng-class="{'text-muted': isDisabled}">
7+
{{heading}}
8+
</span>
9+
</a>
10+
</h4>
11+
</div>
12+
<div class="panel-collapse collapse" uib-collapse="!isOpen">
13+
<div class="panel-body" style="text-align: right" ng-transclude></div>
1614
</div>
1715
</script>
1816

@@ -28,35 +26,35 @@ <h4 class="panel-title" style="color:#fa39c3">
2826
</label>
2927
</div>
3028
<uib-accordion close-others="oneAtATime">
31-
<uib-accordion-group heading="Static Header, initially expanded" is-open="status.isFirstOpen" is-disabled="status.isFirstDisabled">
29+
<div uib-accordion-group class="panel-default" heading="Static Header, initially expanded" is-open="status.isFirstOpen" is-disabled="status.isFirstDisabled">
3230
This content is straight in the template.
33-
</uib-accordion-group>
34-
<uib-accordion-group heading="{{group.title}}" ng-repeat="group in groups">
31+
</div>
32+
<div uib-accordion-group class="panel-default" heading="{{group.title}}" ng-repeat="group in groups">
3533
{{group.content}}
36-
</uib-accordion-group>
37-
<uib-accordion-group heading="Dynamic Body Content">
34+
</div>
35+
<div uib-accordion-group class="panel-default" heading="Dynamic Body Content">
3836
<p>The body of the uib-accordion group grows to fit the contents</p>
3937
<button type="button" class="btn btn-default btn-sm" ng-click="addItem()">Add Item</button>
4038
<div ng-repeat="item in items">{{item}}</div>
41-
</uib-accordion-group>
42-
<uib-accordion-group heading="Custom template" template-url="group-template.html">
39+
</div>
40+
<div uib-accordion-group class="panel-default" heading="Custom template" template-url="group-template.html">
4341
Hello
44-
</uib-accordion-group>
45-
<uib-accordion-group is-open="status.isCustomHeaderOpen" template-url="group-template.html">
42+
</div>
43+
<div uib-accordion-group class="panel-default" is-open="status.isCustomHeaderOpen" template-url="group-template.html">
4644
<uib-accordion-heading>
4745
Custom template with custom header template <i class="pull-right glyphicon" ng-class="{'glyphicon-chevron-down': status.isCustomHeaderOpen, 'glyphicon-chevron-right': !status.isCustomHeaderOpen}"></i>
4846
</uib-accordion-heading>
4947
World
50-
</uib-accordion-group>
51-
<uib-accordion-group heading="Delete account" panel-class="panel-danger">
48+
</div>
49+
<div uib-accordion-group class="panel-danger" heading="Delete account">
5250
<p>Please, to delete your account, click the button below</p>
5351
<button class="btn btn-danger">Delete</button>
54-
</uib-accordion-group>
55-
<uib-accordion-group is-open="status.open">
52+
</div>
53+
<div uib-accordion-group class="panel-default" is-open="status.open">
5654
<uib-accordion-heading>
5755
I can have markup, too! <i class="pull-right glyphicon" ng-class="{'glyphicon-chevron-down': status.open, 'glyphicon-chevron-right': !status.open}"></i>
5856
</uib-accordion-heading>
5957
This is just some content to illustrate fancy headings.
60-
</uib-accordion-group>
58+
</div>
6159
</uib-accordion>
6260
</div>

src/accordion/docs/readme.md

-5
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,6 @@ The body of each accordion group is transcluded into the body of the collapsible
3232
_(Default: `false`)_ -
3333
Whether accordion group is open or closed.
3434

35-
* `panel-class`
36-
<i class="glyphicon glyphicon-eye-open"></i>
37-
_(Default: `panel-default`)_ -
38-
Add ability to use Bootstrap's contextual panel classes (panel-primary, panel-success, panel-info, etc...) or your own. This must be a string.
39-
4035
* `template-url`
4136
_(Default: `uib/template/accordion/accordion-group.html`)_ -
4237
Add the ability to override the template used on the component.

src/accordion/test/accordion.spec.js

+23-58
Original file line numberDiff line numberDiff line change
@@ -176,21 +176,21 @@ describe('uib-accordion', function() {
176176

177177
var tpl =
178178
'<uib-accordion>' +
179-
'<uib-accordion-group heading="title 1" template-url="foo/bar.html"></uib-accordion-group>' +
179+
'<div uib-accordion-group heading="title 1" template-url="foo/bar.html"></div>' +
180180
'</uib-accordion>';
181181

182182
element = $compile(tpl)(scope);
183183
scope.$digest();
184-
expect(element.find('[template-url]').html()).toBe('baz');
184+
expect(element.find('[template-url]').html()).toBe('<div>baz</div>');
185185
}));
186186

187187
describe('with static panels', function() {
188188
beforeEach(function() {
189189
spyOn(Math, 'random').and.returnValue(0.1);
190190
var tpl =
191191
'<uib-accordion>' +
192-
'<uib-accordion-group heading="title 1">Content 1</uib-accordion-group>' +
193-
'<uib-accordion-group heading="title 2">Content 2</uib-accordion-group>' +
192+
'<div uib-accordion-group heading="title 1">Content 1</div>' +
193+
'<div uib-accordion-group heading="title 2">Content 2</div>' +
194194
'</uib-accordion>';
195195
element = angular.element(tpl);
196196
$compile(element)(scope);
@@ -288,8 +288,8 @@ describe('uib-accordion', function() {
288288
beforeEach(function() {
289289
var tpl =
290290
'<uib-accordion>' +
291-
'<uib-accordion-group heading="title 1" open-class="custom-open-class">Content 1</uib-accordion-group>' +
292-
'<uib-accordion-group heading="title 2" open-class="custom-open-class">Content 2</uib-accordion-group>' +
291+
'<div uib-accordion-group heading="title 1" open-class="custom-open-class">Content 1</div>' +
292+
'<div uib-accordion-group heading="title 2" open-class="custom-open-class">Content 2</div>' +
293293
'</uib-accordion>';
294294
element = angular.element(tpl);
295295
$compile(element)(scope);
@@ -318,7 +318,7 @@ describe('uib-accordion', function() {
318318
beforeEach(function() {
319319
var tpl =
320320
'<uib-accordion>' +
321-
'<uib-accordion-group ng-repeat="group in groups" heading="{{group.name}}">{{group.content}}</uib-accordion-group>' +
321+
'<div uib-accordion-group ng-repeat="group in groups" heading="{{group.name}}">{{group.content}}</div>' +
322322
'</uib-accordion>';
323323
element = angular.element(tpl);
324324
model = [
@@ -363,8 +363,8 @@ describe('uib-accordion', function() {
363363
beforeEach(function() {
364364
var tpl =
365365
'<uib-accordion>' +
366-
'<uib-accordion-group heading="title 1" is-open="open.first">Content 1</uib-accordion-group>' +
367-
'<uib-accordion-group heading="title 2" is-open="open.second">Content 2</uib-accordion-group>' +
366+
'<div uib-accordion-group heading="title 1" is-open="open.first">Content 1</div>' +
367+
'<div uib-accordion-group heading="title 2" is-open="open.second">Content 2</div>' +
368368
'</uib-accordion>';
369369
element = angular.element(tpl);
370370
scope.open = { first: false, second: true };
@@ -393,8 +393,8 @@ describe('uib-accordion', function() {
393393
beforeEach(function() {
394394
var tpl =
395395
'<uib-accordion>' +
396-
'<uib-accordion-group heading="title 1" is-open="open1"><div ng-repeat="item in items">{{item}}</div></uib-accordion-group>' +
397-
'<uib-accordion-group heading="title 2" is-open="open2">Static content</uib-accordion-group>' +
396+
'<div uib-accordion-group heading="title 1" is-open="open1"><div ng-repeat="item in items">{{item}}</div></div>' +
397+
'<div uib-accordion-group heading="title 2" is-open="open2">Static content</div>' +
398398
'</uib-accordion>';
399399
element = angular.element(tpl);
400400
scope.items = ['Item 1', 'Item 2', 'Item 3'];
@@ -421,7 +421,7 @@ describe('uib-accordion', function() {
421421
beforeEach(function() {
422422
var tpl =
423423
'<uib-accordion>' +
424-
'<uib-accordion-group ng-repeat="group in groups" heading="{{group.name}}" is-open="group.open">{{group.content}}</uib-accordion-group>' +
424+
'<div uib-accordion-group ng-repeat="group in groups" heading="{{group.name}}" is-open="group.open">{{group.content}}</div>' +
425425
'</uib-accordion>';
426426
element = angular.element(tpl);
427427
scope.groups = [
@@ -456,7 +456,7 @@ describe('uib-accordion', function() {
456456
beforeEach(function() {
457457
var tpl =
458458
'<uib-accordion>' +
459-
'<uib-accordion-group ng-repeat="group in groups" heading="{{group.name}}" is-open="group.open" class="testClass">{{group.content}}</uib-accordion-group>' +
459+
'<div uib-accordion-group ng-repeat="group in groups" heading="{{group.name}}" is-open="group.open" class="testClass">{{group.content}}</div>' +
460460
'</uib-accordion>';
461461
element = angular.element(tpl);
462462
scope.groups = [
@@ -480,7 +480,7 @@ describe('uib-accordion', function() {
480480
beforeEach(function() {
481481
var tpl =
482482
'<uib-accordion>' +
483-
'<uib-accordion-group heading="title 1" is-disabled="disabled">Content 1</uib-accordion-group>' +
483+
'<div uib-accordion-group heading="title 1" is-disabled="disabled">Content 1</div>' +
484484
'</uib-accordion>';
485485
element = angular.element(tpl);
486486
scope.disabled = true;
@@ -519,10 +519,10 @@ describe('uib-accordion', function() {
519519
function isDisabledStyleCheck() {
520520
var tpl =
521521
'<uib-accordion ng-init="a = [1,2,3]">' +
522-
'<uib-accordion-group heading="I get overridden" is-disabled="true">' +
522+
'<div uib-accordion-group heading="I get overridden" is-disabled="true">' +
523523
'<uib-accordion-heading>Heading Element <span ng-repeat="x in a">{{x}}</span> </uib-accordion-heading>' +
524524
'Body' +
525-
'</uib-accordion-group>' +
525+
'</div>' +
526526
'</uib-accordion>';
527527
scope.disabled = true;
528528
element = $compile(tpl)(scope);
@@ -536,10 +536,10 @@ describe('uib-accordion', function() {
536536
beforeEach(function() {
537537
var tpl =
538538
'<uib-accordion ng-init="a = [1,2,3]">' +
539-
'<uib-accordion-group heading="I get overridden">' +
539+
'<div uib-accordion-group heading="I get overridden">' +
540540
'<uib-accordion-heading>Heading Element <span ng-repeat="x in a">{{x}}</span> </uib-accordion-heading>' +
541541
'Body' +
542-
'</uib-accordion-group>' +
542+
'</div>' +
543543
'</uib-accordion>';
544544
element = $compile(tpl)(scope);
545545
scope.$digest();
@@ -565,10 +565,10 @@ describe('uib-accordion', function() {
565565
beforeEach(function() {
566566
var tpl =
567567
'<uib-accordion ng-init="a = [1,2,3]">' +
568-
'<uib-accordion-group heading="I get overridden">' +
568+
'<div uib-accordion-group heading="I get overridden">' +
569569
'<div uib-accordion-heading>Heading Element <span ng-repeat="x in a">{{x}}</span> </div>' +
570570
'Body' +
571-
'</uib-accordion-group>' +
571+
'</div>' +
572572
'</uib-accordion>';
573573
element = $compile(tpl)(scope);
574574
scope.$digest();
@@ -588,7 +588,7 @@ describe('uib-accordion', function() {
588588

589589
describe('uib-accordion-heading, with repeating uib-accordion-groups', function() {
590590
it('should clone the uib-accordion-heading for each group', function() {
591-
element = $compile('<uib-accordion><uib-accordion-group ng-repeat="x in [1,2,3]"><uib-accordion-heading>{{x}}</uib-accordion-heading></uib-accordion-group></uib-accordion>')(scope);
591+
element = $compile('<uib-accordion><div uib-accordion-group ng-repeat="x in [1,2,3]"><uib-accordion-heading>{{x}}</uib-accordion-heading></div></uib-accordion>')(scope);
592592
scope.$digest();
593593
groups = element.find('.panel');
594594
expect(groups.length).toBe(3);
@@ -600,7 +600,7 @@ describe('uib-accordion', function() {
600600

601601
describe('uib-accordion-heading attribute, with repeating uib-accordion-groups', function() {
602602
it('should clone the uib-accordion-heading for each group', function() {
603-
element = $compile('<uib-accordion><uib-accordion-group ng-repeat="x in [1,2,3]"><div uib-accordion-heading>{{x}}</div></uib-accordion-group></uib-accordion>')(scope);
603+
element = $compile('<uib-accordion><div uib-accordion-group ng-repeat="x in [1,2,3]"><div uib-accordion-heading>{{x}}</div></div></uib-accordion>')(scope);
604604
scope.$digest();
605605
groups = element.find('.panel');
606606
expect(groups.length).toBe(3);
@@ -614,46 +614,11 @@ describe('uib-accordion', function() {
614614
it('should transclude heading to a template using data-uib-accordion-header', inject(function($templateCache) {
615615
$templateCache.put('foo/bar.html', '<div class="panel"><a uib-accordion-transclude="heading" class="accordion-toggle"><span data-uib-accordion-header></span></a><div ng-transclude></div></div>');
616616

617-
element = $compile('<uib-accordion><uib-accordion-group template-url="foo/bar.html"><uib-accordion-heading>baz</uib-accordion-heading></uib-accordion-group></uib-accordion>')(scope);
617+
element = $compile('<uib-accordion><div uib-accordion-group template-url="foo/bar.html"><uib-accordion-heading>baz</uib-accordion-heading></div></uib-accordion>')(scope);
618618
scope.$digest();
619619
groups = element.find('.panel');
620620
expect(findGroupLink(0).text()).toBe('baz');
621621
}));
622622
});
623-
624-
describe('uib-accordion group panel class', function() {
625-
it('should use the default value when panel class is falsy - #3968', function() {
626-
element = $compile('<uib-accordion><uib-accordion-group heading="Heading">Content</uib-accordion-group></uib-accordion>')(scope);
627-
scope.$digest();
628-
groups = element.find('.panel');
629-
expect(groups.eq(0)).toHaveClass('panel-default');
630-
631-
element = $compile('<uib-accordion><uib-accordion-group heading="Heading" panel-class="">Content</uib-accordion-group></uib-accordion>')(scope);
632-
scope.$digest();
633-
groups = element.find('.panel');
634-
expect(groups.eq(0)).toHaveClass('panel-default');
635-
});
636-
637-
it('should use the specified value when not falsy - #3968', function() {
638-
element = $compile('<uib-accordion><uib-accordion-group heading="Heading" panel-class="custom-class">Content</uib-accordion-group></uib-accordion>')(scope);
639-
scope.$digest();
640-
groups = element.find('.panel');
641-
expect(groups.eq(0)).toHaveClass('custom-class');
642-
expect(groups.eq(0)).not.toHaveClass('panel-default');
643-
});
644-
645-
it('should change class if panel-class is changed', function() {
646-
element = $compile('<uib-accordion><uib-accordion-group heading="Heading" panel-class="{{panelClass}}">Content</uib-accordion-group></uib-accordion>')(scope);
647-
scope.panelClass = 'custom-class';
648-
scope.$digest();
649-
groups = element.find('.panel');
650-
expect(groups.eq(0)).toHaveClass('custom-class');
651-
652-
scope.panelClass = 'different-class';
653-
scope.$digest();
654-
expect(groups.eq(0)).toHaveClass('different-class');
655-
expect(groups.eq(0)).not.toHaveClass('custom-class');
656-
});
657-
});
658623
});
659624
});
+7-9
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
<div class="panel" ng-class="panelClass || 'panel-default'">
2-
<div role="tab" id="{{::headingId}}" aria-selected="{{isOpen}}" class="panel-heading" ng-keypress="toggleOpen($event)">
3-
<h4 class="panel-title">
4-
<a role="button" data-toggle="collapse" href aria-expanded="{{isOpen}}" aria-controls="{{::panelId}}" tabindex="0" class="accordion-toggle" ng-click="toggleOpen()" uib-accordion-transclude="heading"><span uib-accordion-header ng-class="{'text-muted': isDisabled}">{{heading}}</span></a>
5-
</h4>
6-
</div>
7-
<div id="{{::panelId}}" aria-labelledby="{{::headingId}}" aria-hidden="{{!isOpen}}" role="tabpanel" class="panel-collapse collapse" uib-collapse="!isOpen">
8-
<div class="panel-body" ng-transclude></div>
9-
</div>
1+
<div role="tab" id="{{::headingId}}" aria-selected="{{isOpen}}" class="panel-heading" ng-keypress="toggleOpen($event)">
2+
<h4 class="panel-title">
3+
<a role="button" data-toggle="collapse" href aria-expanded="{{isOpen}}" aria-controls="{{::panelId}}" tabindex="0" class="accordion-toggle" ng-click="toggleOpen()" uib-accordion-transclude="heading"><span uib-accordion-header ng-class="{'text-muted': isDisabled}">{{heading}}</span></a>
4+
</h4>
5+
</div>
6+
<div id="{{::panelId}}" aria-labelledby="{{::headingId}}" aria-hidden="{{!isOpen}}" role="tabpanel" class="panel-collapse collapse" uib-collapse="!isOpen">
7+
<div class="panel-body" ng-transclude></div>
108
</div>

0 commit comments

Comments
 (0)