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

Commit 61cdef1

Browse files
Towne, Jeremywesleycho
Towne, Jeremy
authored andcommitted
feat(accordion): add aria tags
- Improve accessibility of accordion Closes #5338
1 parent 56f5c82 commit 61cdef1

File tree

4 files changed

+35
-5
lines changed

4 files changed

+35
-5
lines changed

src/accordion/accordion.js

+4
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ angular.module('ui.bootstrap.accordion', ['ui.bootstrap.collapse'])
9191
}
9292
}
9393
};
94+
95+
var id = 'accordiongroup-' + scope.$id + '-' + Math.floor(Math.random() * 10000);
96+
scope.headingId = id + '-tab';
97+
scope.panelId = id + '-panel';
9498
}
9599
};
96100
})

src/accordion/test/accordion.spec.js

+26
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,12 @@ describe('uib-accordion', function() {
123123
$templateCache = _$templateCache_;
124124
}));
125125

126+
it('should be a tablist', function() {
127+
element = $compile('<uib-accordion></uib-accordion>')(scope);
128+
scope.$digest();
129+
expect(element.html()).toContain('role="tablist"');
130+
});
131+
126132
it('should expose the controller on the view', function() {
127133
$templateCache.put('uib/template/accordion/accordion.html', '<div>{{accordion.text}}</div>');
128134

@@ -150,6 +156,9 @@ describe('uib-accordion', function() {
150156
describe('uib-accordion-group', function() {
151157
var scope, $compile;
152158
var element, groups;
159+
var findGroupHeading = function(index) {
160+
return groups.eq(index).find('.panel-heading').eq(0);
161+
};
153162
var findGroupLink = function(index) {
154163
return groups.eq(index).find('.accordion-toggle').eq(0);
155164
};
@@ -177,6 +186,7 @@ describe('uib-accordion', function() {
177186

178187
describe('with static panels', function() {
179188
beforeEach(function() {
189+
spyOn(Math, 'random').and.returnValue(0.1);
180190
var tpl =
181191
'<uib-accordion>' +
182192
'<uib-accordion-group heading="title 1">Content 1</uib-accordion-group>' +
@@ -204,20 +214,26 @@ describe('uib-accordion', function() {
204214
findGroupLink(0).click();
205215
scope.$digest();
206216
expect(findGroupBody(0).scope().isOpen).toBe(true);
217+
expect(findGroupHeading(0).html()).toContain('aria-expanded="true"');
207218

208219
findGroupLink(1).click();
209220
scope.$digest();
210221
expect(findGroupBody(0).scope().isOpen).toBe(false);
222+
expect(findGroupHeading(0).html()).toContain('aria-expanded="false"');
211223
expect(findGroupBody(1).scope().isOpen).toBe(true);
224+
expect(findGroupHeading(1).html()).toContain('aria-expanded="true"');
212225
});
213226

214227
it('should toggle element on click', function() {
215228
findGroupLink(0).click();
216229
scope.$digest();
217230
expect(findGroupBody(0).scope().isOpen).toBe(true);
231+
expect(groups.eq(0).html()).toContain('aria-hidden="false"');
232+
218233
findGroupLink(0).click();
219234
scope.$digest();
220235
expect(findGroupBody(0).scope().isOpen).toBe(false);
236+
expect(groups.eq(0).html()).toContain('aria-hidden="true"');
221237
});
222238

223239
it('should add, by default, "panel-open" when opened', function() {
@@ -256,6 +272,16 @@ describe('uib-accordion', function() {
256272

257273
expect(group).not.toHaveClass('panel-open');
258274
});
275+
276+
it('should generate an Id for the heading', function() {
277+
var groupScope = findGroupBody(0).scope();
278+
expect(groupScope.headingId).toEqual('accordiongroup-' + groupScope.$id + '-1000-tab');
279+
});
280+
281+
it('should generate an Id for the panel', function() {
282+
var groupScope = findGroupBody(0).scope();
283+
expect(groupScope.panelId).toEqual('accordiongroup-' + groupScope.$id + '-1000-panel');
284+
});
259285
});
260286

261287
describe('with open-class attribute', function() {
+4-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<div class="panel" ng-class="panelClass || 'panel-default'">
2-
<div class="panel-heading" ng-keypress="toggleOpen($event)">
2+
<div role="tab" id="{{::headingId}}" aria-selected="{{isOpen}}" class="panel-heading" ng-keypress="toggleOpen($event)">
33
<h4 class="panel-title">
4-
<a href tabindex="0" class="accordion-toggle" ng-click="toggleOpen()" uib-accordion-transclude="heading"><span ng-class="{'text-muted': isDisabled}">{{heading}}</span></a>
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 ng-class="{'text-muted': isDisabled}">{{heading}}</span></a>
55
</h4>
66
</div>
7-
<div class="panel-collapse collapse" uib-collapse="!isOpen">
8-
<div class="panel-body" ng-transclude></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>
99
</div>
1010
</div>

template/accordion/accordion.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<div class="panel-group" ng-transclude></div>
1+
<div role="tablist" class="panel-group" ng-transclude></div>

0 commit comments

Comments
 (0)