Commits

Alexandre Vryghem authored 1989a6c0423
Fixed accessibility issues with pagination button

- Replaced the h6 tags with the role heading - Gave the gear button the roles in order to be detected as an expandable menu - Replaced the dropdown structure to render a menu of listboxes - Added the aria-selected attribute
No tags

src/app/shared/pagination/pagination.component.html

Modified
1 1 <div *ngIf="currentPageState == undefined || currentPageState == (currentPage$|async)" [id]="'p-' + id">
2 2 <div *ngIf="(!hidePaginationDetail && collectionSize > 0) || !hideGear" class="pagination-masked clearfix top">
3 3 <div class="row">
4 4 <div *ngIf="!hidePaginationDetail && collectionSize > 0" class="col-auto pagination-info">
5 5 <span class="align-middle hidden-xs-down">{{ 'pagination.showing.label' | translate }}</span>
6 6 <span class="align-middle">{{ 'pagination.showing.detail' | translate:(getShowingDetails(collectionSize)|async)}}</span>
7 7 </div>
8 8 <div class="col">
9 9 <div *ngIf="!hideGear" ngbDropdown #paginationControls="ngbDropdown" placement="bottom-right" class="d-inline-block float-right">
10 - <button class="btn btn-secondary" id="paginationControls" ngbDropdownToggle [title]="'pagination.options.description' | translate" [attr.aria-label]="'pagination.options.description' | translate"><i class="fas fa-cog" aria-hidden="true"></i></button>
11 - <div id="paginationControlsDropdownMenu" aria-labelledby="paginationControls" ngbDropdownMenu>
12 - <h6 class="dropdown-header">{{ 'pagination.results-per-page' | translate}}</h6>
13 - <button class="dropdown-item" *ngFor="let item of pageSizeOptions" (click)="doPageSizeChange(item)"><i [ngClass]="{'invisible': item != (pageSize$|async)}" class="fas fa-check" aria-hidden="true"></i> {{item}} </button>
14 - <ng-container *ngIf="!hideSortOptions">
15 - <h6 class="dropdown-header">{{ 'pagination.sort-direction' | translate}}</h6>
16 - <button class="dropdown-item" *ngFor="let direction of (sortDirections | dsKeys)" (click)="doSortDirectionChange(direction.value)"><i [ngClass]="{'invisible': direction.value !== (sortDirection$ |async)}" class="fas fa-check" aria-hidden="true"></i> {{'sorting.' + direction.key | translate}} </button>
17 - </ng-container>
18 - </div>
10 + <button class="btn btn-secondary" id="paginationControls" ngbDropdownToggle [title]="'pagination.options.description' | translate" [attr.aria-label]="'pagination.options.description' | translate" aria-haspopup="true" aria-expanded="false"><i class="fas fa-cog" aria-hidden="true"></i></button>
11 + <ul id="paginationControlsDropdownMenu" aria-labelledby="paginationControls" role="menu" ngbDropdownMenu>
12 + <li role="menuitem">
13 + <span class="dropdown-header" id="pagination-control_results-per-page" role="heading">{{ 'pagination.results-per-page' | translate}}</span>
14 + <ul aria-labelledby="pagination-control_results-per-page" class="list-unstyled" role="listbox">
15 + <li *ngFor="let item of pageSizeOptions" role="option" [attr.aria-selected]="item === (pageSize$ | async)">
16 + <button (click)="doPageSizeChange(item)" class="dropdown-item">
17 + <i [ngClass]="{'invisible': item !== (pageSize$ | async) }" class="fas fa-check" aria-hidden="true"></i> {{item}}
18 + </button>
19 + </li>
20 + </ul>
21 + </li>
22 + <li *ngIf="!hideSortOptions" role="menuitem">
23 + <span class="dropdown-header" id="pagination-control_sort-direction" role="heading">{{ 'pagination.sort-direction' | translate}}</span>
24 + <ul aria-labelledby="pagination-control_sort-direction" class="list-unstyled" role="listbox">
25 + <li *ngFor="let direction of (sortDirections | dsKeys)" [attr.aria-selected]="direction.value === (sortDirection$ | async)" role="option">
26 + <button class="dropdown-item" (click)="doSortDirectionChange(direction.value)">
27 + <i [ngClass]="{'invisible': direction.value !== (sortDirection$ |async)}" class="fas fa-check" aria-hidden="true"></i> {{'sorting.' + direction.key | translate}}
28 + </button>
29 + </li>
30 + </ul>
31 + </li>
32 + </ul>
19 33 </div>
20 34 <ds-rss></ds-rss>
21 35 </div>
22 36 </div>
23 37 </div>
24 38 <ng-content></ng-content>
25 39
26 40 <div *ngIf="shouldShowBottomPager | async">
27 41 <div *ngIf="showPaginator" class="pagination justify-content-center clearfix bottom">
28 42 <ngb-pagination [boundaryLinks]="paginationOptions.boundaryLinks"

Everything looks good. We'll let you know here if there's anything you should know about.

Add shortcut