improved "tab" navigation in safari

This commit is contained in:
Oscar Chacón
2025-05-09 13:27:29 -06:00
parent aaa4b910e2
commit 9aed649160
69 changed files with 156 additions and 122 deletions

View File

@@ -10,7 +10,7 @@
</nav> </nav>
<ng-template #breadcrumb let-text="text" let-url="url"> <ng-template #breadcrumb let-text="text" let-url="url">
<li class="breadcrumb-item"><div class="breadcrumb-item-limiter"><a [routerLink]="url" class="text-truncate" [ngbTooltip]="text | translate" placement="bottom" >{{text | translate}}</a></div></li> <li class="breadcrumb-item"><div class="breadcrumb-item-limiter"><a [routerLink]="url" class="text-truncate" [ngbTooltip]="text | translate" placement="bottom" role="link" tabindex="0">{{text | translate}}</a></div></li>
</ng-template> </ng-template>
<ng-template #activeBreadcrumb let-text="text"> <ng-template #activeBreadcrumb let-text="text">

View File

@@ -10,6 +10,8 @@
<a class="btn btn-primary" <a class="btn btn-primary"
[routerLink]="['/search']" [routerLink]="['/search']"
[queryParams]="queryParams" [queryParams]="queryParams"
[queryParamsHandling]="'merge'"> [queryParamsHandling]="'merge'"
role="link"
tabindex="0">
{{ 'browse.taxonomy.button' | translate }}</a> {{ 'browse.taxonomy.button' | translate }}</a>
</div> </div>

View File

@@ -9,7 +9,7 @@
</span> </span>
<div class="align-middle pt-2"> <div class="align-middle pt-2">
<button *ngIf="!(dataSource.loading$ | async)" (click)="getNextPage(node)" <button *ngIf="!(dataSource.loading$ | async)" (click)="getNextPage(node)"
class="btn btn-outline-primary btn-sm" role="button"> class="btn btn-outline-primary btn-sm" role="button" tabindex="0">
<i class="fas fa-angle-down"></i> {{ 'communityList.showMore' | translate }} <i class="fas fa-angle-down"></i> {{ 'communityList.showMore' | translate }}
</button> </button>
<ds-themed-loading *ngIf="node===loadingNode && dataSource.loading$ | async" class="ds-themed-loading"></ds-themed-loading> <ds-themed-loading *ngIf="node===loadingNode && dataSource.loading$ | async" class="ds-themed-loading"></ds-themed-loading>
@@ -27,7 +27,11 @@
<button *ngIf="hasChild(null, node) | async" type="button" class="btn btn-default" cdkTreeNodeToggle <button *ngIf="hasChild(null, node) | async" type="button" class="btn btn-default" cdkTreeNodeToggle
[attr.aria-label]="(node.isExpanded ? 'communityList.collapse' : 'communityList.expand') | translate:{ name: dsoNameService.getName(node.payload) }" [attr.aria-label]="(node.isExpanded ? 'communityList.collapse' : 'communityList.expand') | translate:{ name: dsoNameService.getName(node.payload) }"
(click)="toggleExpanded(node)" (click)="toggleExpanded(node)"
data-test="expand-button"> data-test="expand-button"
(keyup.enter)="toggleExpanded(node)"
(keyup.space)="toggleExpanded(node)"
role="button"
tabindex="0">
<span class="{{node.isExpanded ? 'fa fa-chevron-down' : 'fa fa-chevron-right'}}" <span class="{{node.isExpanded ? 'fa fa-chevron-down' : 'fa fa-chevron-right'}}"
aria-hidden="true"></span> aria-hidden="true"></span>
<span class="sr-only">{{ (node.isExpanded ? 'communityList.collapse' : 'communityList.expand') | translate:{ name: dsoNameService.getName(node.payload) } }}</span> <span class="sr-only">{{ (node.isExpanded ? 'communityList.collapse' : 'communityList.expand') | translate:{ name: dsoNameService.getName(node.payload) } }}</span>
@@ -38,7 +42,7 @@
</span> </span>
<div class="d-flex flex-row"> <div class="d-flex flex-row">
<span class="align-middle pt-2 lead"> <span class="align-middle pt-2 lead">
<a [routerLink]="node.route" class="lead">{{ dsoNameService.getName(node.payload) }}</a> <a [routerLink]="node.route" class="lead" role="link" tabindex="0">{{ dsoNameService.getName(node.payload) }}</a>
<span class="pr-2">&nbsp;</span> <span class="pr-2">&nbsp;</span>
<span *ngIf="node.payload.archivedItemsCount >= 0" class="badge badge-pill badge-secondary align-top archived-items-lead">{{node.payload.archivedItemsCount}}</span> <span *ngIf="node.payload.archivedItemsCount >= 0" class="badge badge-pill badge-secondary align-top archived-items-lead">{{node.payload.archivedItemsCount}}</span>
</span> </span>
@@ -72,7 +76,7 @@
<span class="fa fa-chevron-right"></span> <span class="fa fa-chevron-right"></span>
</span> </span>
<h6 class="align-middle pt-2"> <h6 class="align-middle pt-2">
<a [routerLink]="node.route" class="lead">{{ dsoNameService.getName(node.payload) }}</a> <a [routerLink]="node.route" class="lead" role="link" tabindex="0">{{ dsoNameService.getName(node.payload) }}</a>
</h6> </h6>
</div> </div>
<ds-truncatable [id]="node.id"> <ds-truncatable [id]="node.id">

View File

@@ -6,7 +6,7 @@
<a *ngIf="linkType != linkTypes.None" <a *ngIf="linkType != linkTypes.None"
[target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]"
class="card-img-top full-width" [attr.title]="'search.results.view-result' | translate"> class="card-img-top full-width" [attr.title]="'search.results.view-result' | translate" role="link" tabindex="0">
<div> <div>
<ds-themed-thumbnail [thumbnail]="dso?.thumbnail | async" [limitWidth]="false"> <ds-themed-thumbnail [thumbnail]="dso?.thumbnail | async" [limitWidth]="false">
</ds-themed-thumbnail> </ds-themed-thumbnail>
@@ -37,7 +37,7 @@
<div *ngIf="linkType != linkTypes.None" class="text-center"> <div *ngIf="linkType != linkTypes.None" class="text-center">
<a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]"
class="lead btn btn-primary viewButton">{{ 'search.results.view-result' | translate}}</a> class="lead btn btn-primary viewButton" role="link" tabindex="0">{{ 'search.results.view-result' | translate}}</a>
</div> </div>
</div> </div>
</ds-truncatable> </ds-truncatable>

View File

@@ -6,7 +6,7 @@
<a *ngIf="linkType != linkTypes.None" <a *ngIf="linkType != linkTypes.None"
[target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]"
class="card-img-top full-width" [attr.title]="'search.results.view-result' | translate"> class="card-img-top full-width" [attr.title]="'search.results.view-result' | translate" role="link" tabindex="0">
<div> <div>
<ds-themed-thumbnail [thumbnail]="dso?.thumbnail | async" [limitWidth]="false"> <ds-themed-thumbnail [thumbnail]="dso?.thumbnail | async" [limitWidth]="false">
</ds-themed-thumbnail> </ds-themed-thumbnail>
@@ -37,7 +37,7 @@
<div *ngIf="linkType != linkTypes.None" class="text-center"> <div *ngIf="linkType != linkTypes.None" class="text-center">
<a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]"
class="lead btn btn-primary viewButton">{{ 'search.results.view-result' | translate}}</a> class="lead btn btn-primary viewButton" role="link" tabindex="0">{{ 'search.results.view-result' | translate}}</a>
</div> </div>
</div> </div>
</ds-truncatable> </ds-truncatable>

View File

@@ -6,7 +6,7 @@
<a *ngIf="linkType != linkTypes.None" <a *ngIf="linkType != linkTypes.None"
[target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]"
class="card-img-top full-width" [attr.title]="'search.results.view-result' | translate"> class="card-img-top full-width" [attr.title]="'search.results.view-result' | translate" role="link" tabindex="0">
<div> <div>
<ds-themed-thumbnail [thumbnail]="dso?.thumbnail | async" [limitWidth]="false"> <ds-themed-thumbnail [thumbnail]="dso?.thumbnail | async" [limitWidth]="false">
</ds-themed-thumbnail> </ds-themed-thumbnail>
@@ -41,7 +41,7 @@
<div *ngIf="linkType != linkTypes.None" class="text-center"> <div *ngIf="linkType != linkTypes.None" class="text-center">
<a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]"
class="lead btn btn-primary viewButton">{{ 'search.results.view-result' | translate}}</a> class="lead btn btn-primary viewButton" role="link" tabindex="0">{{ 'search.results.view-result' | translate}}</a>
</div> </div>
</div> </div>
</ds-truncatable> </ds-truncatable>

View File

@@ -2,7 +2,7 @@
<div *ngIf="showThumbnails" class="col-3 col-md-2"> <div *ngIf="showThumbnails" class="col-3 col-md-2">
<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null"
[routerLink]="[itemPageRoute]" class="lead item-list-title dont-break-out"> [routerLink]="[itemPageRoute]" class="lead item-list-title dont-break-out" role="link" tabindex="0">
<ds-thumbnail [thumbnail]="dso?.thumbnail | async" [limitWidth]="true"> <ds-thumbnail [thumbnail]="dso?.thumbnail | async" [limitWidth]="true">
</ds-thumbnail> </ds-thumbnail>
</a> </a>
@@ -17,7 +17,7 @@
<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null"
[routerLink]="[itemPageRoute]" class="lead item-list-title dont-break-out" [routerLink]="[itemPageRoute]" class="lead item-list-title dont-break-out"
[innerHTML]="dsoTitle"></a> [innerHTML]="dsoTitle" role="link" tabindex="0"></a>
<span *ngIf="linkType == linkTypes.None" <span *ngIf="linkType == linkTypes.None"
class="lead item-list-title dont-break-out" class="lead item-list-title dont-break-out"
[innerHTML]="dsoTitle"></span> [innerHTML]="dsoTitle"></span>

View File

@@ -2,7 +2,7 @@
<div *ngIf="showThumbnails" class="col-3 col-md-2"> <div *ngIf="showThumbnails" class="col-3 col-md-2">
<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null"
[routerLink]="[itemPageRoute]" class="lead item-list-title dont-break-out"> [routerLink]="[itemPageRoute]" class="lead item-list-title dont-break-out" role="link" tabindex="0">
<ds-thumbnail [thumbnail]="dso?.thumbnail | async" [limitWidth]="true"> <ds-thumbnail [thumbnail]="dso?.thumbnail | async" [limitWidth]="true">
</ds-thumbnail> </ds-thumbnail>
</a> </a>
@@ -17,7 +17,7 @@
<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null"
[routerLink]="[itemPageRoute]" class="lead item-list-title dont-break-out" [routerLink]="[itemPageRoute]" class="lead item-list-title dont-break-out"
[innerHTML]="dsoTitle"></a> [innerHTML]="dsoTitle" role="link" tabindex="0"></a>
<span *ngIf="linkType == linkTypes.None" <span *ngIf="linkType == linkTypes.None"
class="lead item-list-title dont-break-out" class="lead item-list-title dont-break-out"
[innerHTML]="dsoTitle"></span> [innerHTML]="dsoTitle"></span>

View File

@@ -1,7 +1,7 @@
<div class="row"> <div class="row">
<div *ngIf="showThumbnails" class="col-3 col-md-2"> <div *ngIf="showThumbnails" class="col-3 col-md-2">
<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null"
[routerLink]="[itemPageRoute]" class="lead item-list-title dont-break-out"> [routerLink]="[itemPageRoute]" class="lead item-list-title dont-break-out" role="link" tabindex="0">
<ds-thumbnail [thumbnail]="dso?.thumbnail | async" [limitWidth]="true"> <ds-thumbnail [thumbnail]="dso?.thumbnail | async" [limitWidth]="true">
</ds-thumbnail> </ds-thumbnail>
</a> </a>
@@ -15,7 +15,7 @@
<ds-truncatable [id]="dso.id"> <ds-truncatable [id]="dso.id">
<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null"
[routerLink]="[itemPageRoute]" class="lead item-list-title dont-break-out" [routerLink]="[itemPageRoute]" class="lead item-list-title dont-break-out"
[innerHTML]="dsoTitle"></a> [innerHTML]="dsoTitle" role="link" tabindex="0"></a>
<span *ngIf="linkType == linkTypes.None" <span *ngIf="linkType == linkTypes.None"
class="lead item-list-title dont-break-out" class="lead item-list-title dont-break-out"
[innerHTML]="dsoTitle"></span> [innerHTML]="dsoTitle"></span>

View File

@@ -51,7 +51,7 @@
[label]="'journalissue.page.keyword'"> [label]="'journalissue.page.keyword'">
</ds-generic-item-page-field> </ds-generic-item-page-field>
<div> <div>
<a class="btn btn-outline-primary" [routerLink]="[itemPageRoute + '/full']"> <a class="btn btn-outline-primary" [routerLink]="[itemPageRoute + '/full']" role="button" tabindex="0">
{{"item.page.link.full" | translate}} {{"item.page.link.full" | translate}}
</a> </a>
</div> </div>

View File

@@ -34,7 +34,7 @@
[label]="'journalvolume.page.description'"> [label]="'journalvolume.page.description'">
</ds-generic-item-page-field> </ds-generic-item-page-field>
<div> <div>
<a class="btn btn-outline-primary" [routerLink]="[itemPageRoute + '/full']"> <a class="btn btn-outline-primary" [routerLink]="[itemPageRoute + '/full']" role="button" tabindex="0">
{{"item.page.link.full" | translate}} {{"item.page.link.full" | translate}}
</a> </a>
</div> </div>

View File

@@ -33,7 +33,7 @@
[label]="'journal.page.description'"> [label]="'journal.page.description'">
</ds-generic-item-page-field> </ds-generic-item-page-field>
<div> <div>
<a class="btn btn-outline-primary" [routerLink]="[itemPageRoute + '/full']"> <a class="btn btn-outline-primary" [routerLink]="[itemPageRoute + '/full']" role="button" tabindex="0">
{{"item.page.link.full" | translate}} {{"item.page.link.full" | translate}}
</a> </a>
</div> </div>

View File

@@ -6,7 +6,7 @@
<a *ngIf="linkType != linkTypes.None" <a *ngIf="linkType != linkTypes.None"
[target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]"
class="card-img-top full-width" [attr.title]="'search.results.view-result' | translate"> class="card-img-top full-width" [attr.title]="'search.results.view-result' | translate" role="link" tabindex="0">
<div> <div>
<ds-themed-thumbnail [thumbnail]="dso?.thumbnail | async" [limitWidth]="false"> <ds-themed-thumbnail [thumbnail]="dso?.thumbnail | async" [limitWidth]="false">
</ds-themed-thumbnail> </ds-themed-thumbnail>
@@ -43,7 +43,7 @@
<div *ngIf="linkType != linkTypes.None" class="text-center"> <div *ngIf="linkType != linkTypes.None" class="text-center">
<a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]"
class="lead btn btn-primary viewButton">{{ 'search.results.view-result' | translate}}</a> class="lead btn btn-primary viewButton" role="button" tabindex="0">{{ 'search.results.view-result' | translate}}</a>
</div> </div>
</div> </div>
</ds-truncatable> </ds-truncatable>

View File

@@ -6,7 +6,7 @@
<a *ngIf="linkType != linkTypes.None" <a *ngIf="linkType != linkTypes.None"
[target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]"
class="card-img-top full-width" [attr.title]="'search.results.view-result' | translate"> class="card-img-top full-width" [attr.title]="'search.results.view-result' | translate" role="link" tabindex="0">
<div> <div>
<ds-themed-thumbnail [thumbnail]="dso?.thumbnail | async" [limitWidth]="false"> <ds-themed-thumbnail [thumbnail]="dso?.thumbnail | async" [limitWidth]="false">
</ds-themed-thumbnail> </ds-themed-thumbnail>
@@ -36,7 +36,7 @@
<div *ngIf="linkType != linkTypes.None" class="text-center"> <div *ngIf="linkType != linkTypes.None" class="text-center">
<a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]"
class="lead btn btn-primary viewButton">{{ 'search.results.view-result' | translate}}</a> class="lead btn btn-primary viewButton" role="button" tabindex="0">{{ 'search.results.view-result' | translate}}</a>
</div> </div>
</div> </div>
</ds-truncatable> </ds-truncatable>

View File

@@ -6,7 +6,7 @@
<a *ngIf="linkType != linkTypes.None" <a *ngIf="linkType != linkTypes.None"
[target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]"
class="card-img-top full-width" [attr.title]="'search.results.view-result' | translate"> class="card-img-top full-width" [attr.title]="'search.results.view-result' | translate" role="link" tabindex="0">
<div> <div>
<ds-themed-thumbnail [thumbnail]="dso?.thumbnail | async" [limitWidth]="false"> <ds-themed-thumbnail [thumbnail]="dso?.thumbnail | async" [limitWidth]="false">
</ds-themed-thumbnail> </ds-themed-thumbnail>
@@ -31,7 +31,7 @@
<div *ngIf="linkType != linkTypes.None" class="text-center"> <div *ngIf="linkType != linkTypes.None" class="text-center">
<a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[itemPageRoute]"
class="lead btn btn-primary viewButton">{{ 'search.results.view-result' | translate}}</a> class="lead btn btn-primary viewButton" role="button" tabindex="0">{{ 'search.results.view-result' | translate}}</a>
</div> </div>
</div> </div>
</ds-truncatable> </ds-truncatable>

View File

@@ -2,7 +2,7 @@
<div *ngIf="showThumbnails" class="col-3 col-md-2"> <div *ngIf="showThumbnails" class="col-3 col-md-2">
<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null"
[routerLink]="[itemPageRoute]" class="dont-break-out"> [routerLink]="[itemPageRoute]" class="dont-break-out" role="link" tabindex="0">
<ds-thumbnail [thumbnail]="dso?.thumbnail | async" <ds-thumbnail [thumbnail]="dso?.thumbnail | async"
[defaultImage]="'assets/images/orgunit-placeholder.svg'" [defaultImage]="'assets/images/orgunit-placeholder.svg'"
[alt]="'thumbnail.orgunit.alt'" [alt]="'thumbnail.orgunit.alt'"
@@ -23,7 +23,7 @@
<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null"
[routerLink]="[itemPageRoute]" class="lead" [routerLink]="[itemPageRoute]" class="lead"
[innerHTML]="dsoTitle || ('orgunit.listelement.no-title' | translate)"></a> [innerHTML]="dsoTitle || ('orgunit.listelement.no-title' | translate)" role="link" tabindex="0"></a>
<span *ngIf="linkType == linkTypes.None" <span *ngIf="linkType == linkTypes.None"
class="lead" class="lead"
[innerHTML]="dsoTitle || ('orgunit.listelement.no-title' | translate)"></span> [innerHTML]="dsoTitle || ('orgunit.listelement.no-title' | translate)"></span>

View File

@@ -2,7 +2,7 @@
<div *ngIf="showThumbnails" class="col-3 col-md-2"> <div *ngIf="showThumbnails" class="col-3 col-md-2">
<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null"
[routerLink]="[itemPageRoute]" class="dont-break-out"> [routerLink]="[itemPageRoute]" class="dont-break-out" role="link" tabindex="0">
<ds-thumbnail [thumbnail]="dso?.thumbnail | async" <ds-thumbnail [thumbnail]="dso?.thumbnail | async"
[defaultImage]="'assets/images/person-placeholder.svg'" [defaultImage]="'assets/images/person-placeholder.svg'"
[alt]="'thumbnail.person.alt'" [alt]="'thumbnail.person.alt'"
@@ -23,7 +23,7 @@
<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null"
[routerLink]="[itemPageRoute]" class="lead" [routerLink]="[itemPageRoute]" class="lead"
[innerHTML]="dsoTitle || ('person.listelement.no-title' | translate)"></a> [innerHTML]="dsoTitle || ('person.listelement.no-title' | translate)" role="link" tabindex="0"></a>
<span *ngIf="linkType == linkTypes.None" <span *ngIf="linkType == linkTypes.None"
class="lead" class="lead"
[innerHTML]="dsoTitle || ('person.listelement.no-title' | translate)"></span> [innerHTML]="dsoTitle || ('person.listelement.no-title' | translate)"></span>

View File

@@ -2,7 +2,7 @@
<div *ngIf="showThumbnails" class="col-3 col-md-2"> <div *ngIf="showThumbnails" class="col-3 col-md-2">
<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null"
[routerLink]="[itemPageRoute]" class="dont-break-out"> [routerLink]="[itemPageRoute]" class="dont-break-out" role="link" tabindex="0">
<ds-thumbnail [thumbnail]="dso?.thumbnail | async" <ds-thumbnail [thumbnail]="dso?.thumbnail | async"
[defaultImage]="'assets/images/project-placeholder.svg'" [defaultImage]="'assets/images/project-placeholder.svg'"
[alt]="'thumbnail.project.alt'" [alt]="'thumbnail.project.alt'"
@@ -23,7 +23,7 @@
<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'"
[attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null"
[routerLink]="[itemPageRoute]" class="lead item-list-title dont-break-out" [routerLink]="[itemPageRoute]" class="lead item-list-title dont-break-out"
[innerHTML]="dsoTitle"></a> [innerHTML]="dsoTitle" role="link" tabindex="0"></a>
<span *ngIf="linkType == linkTypes.None" <span *ngIf="linkType == linkTypes.None"
class="lead item-list-title dont-break-out" class="lead item-list-title dont-break-out"
[innerHTML]="dsoTitle"></span> [innerHTML]="dsoTitle"></span>

View File

@@ -42,7 +42,7 @@
[label]="'orgunit.page.description'"> [label]="'orgunit.page.description'">
</ds-generic-item-page-field> </ds-generic-item-page-field>
<div> <div>
<a class="btn btn-outline-primary" [routerLink]="[itemPageRoute + '/full']"> <a class="btn btn-outline-primary" [routerLink]="[itemPageRoute + '/full']" role="button" tabindex="0">
{{"item.page.link.full" | translate}} {{"item.page.link.full" | translate}}
</a> </a>
</div> </div>

View File

@@ -50,7 +50,7 @@
[label]="'person.page.name'"> [label]="'person.page.name'">
</ds-generic-item-page-field> </ds-generic-item-page-field>
<div> <div>
<a class="btn btn-outline-primary" [routerLink]="[itemPageRoute + '/full']"> <a class="btn btn-outline-primary" [routerLink]="[itemPageRoute + '/full']" role="button" tabindex="0">
{{"item.page.link.full" | translate}} {{"item.page.link.full" | translate}}
</a> </a>
</div> </div>

View File

@@ -62,7 +62,7 @@
[label]="'project.page.keyword'"> [label]="'project.page.keyword'">
</ds-generic-item-page-field> </ds-generic-item-page-field>
<div> <div>
<a class="btn btn-outline-primary" [routerLink]="[itemPageRoute + '/full']"> <a class="btn btn-outline-primary" [routerLink]="[itemPageRoute + '/full']" role="button" tabindex="0">
{{"item.page.link.full" | translate}} {{"item.page.link.full" | translate}}
</a> </a>
</div> </div>

View File

@@ -11,13 +11,13 @@
<ul class="list-unstyled mb-0"> <ul class="list-unstyled mb-0">
<li> <li>
<a routerLink="./" class="">Lorem ipsum</a> <a routerLink="./" class="" role="link" tabindex="0">Lorem ipsum</a>
</li> </li>
<li> <li>
<a routerLink="./" class="">Ut facilisis</a> <a routerLink="./" class="" role="link" tabindex="0">Ut facilisis</a>
</li> </li>
<li> <li>
<a routerLink="./" class="">Aenean sit</a> <a routerLink="./" class="" role="link" tabindex="0">Aenean sit</a>
</li> </li>
</ul> </ul>
</div> </div>
@@ -29,7 +29,7 @@
<ul class="list-unstyled mb-0"> <ul class="list-unstyled mb-0">
<li> <li>
<a routerLink="./" class="">Suspendisse potenti</a> <a routerLink="./" class="" role="link" tabindex="0">Suspendisse potenti</a>
</li> </li>
</ul> </ul>
</div> </div>
@@ -57,28 +57,28 @@
<div class="content-container"> <div class="content-container">
<p class="m-0"> <p class="m-0">
<a class="text-white" <a class="text-white"
href="http://www.dspace.org/">{{ 'footer.link.dspace' | translate}}</a> href="http://www.dspace.org/" role="link" tabindex="0">{{ 'footer.link.dspace' | translate}}</a>
{{ 'footer.copyright' | translate:{year: dateObj | date:'y'} }} {{ 'footer.copyright' | translate:{year: dateObj | date:'y'} }}
<a class="text-white" <a class="text-white"
href="https://www.lyrasis.org/">{{ 'footer.link.lyrasis' | translate}}</a> href="https://www.lyrasis.org/" role="link" tabindex="0">{{ 'footer.link.lyrasis' | translate}}</a>
</p> </p>
<ul class="footer-info list-unstyled d-flex justify-content-center mb-0"> <ul class="footer-info list-unstyled d-flex justify-content-center mb-0">
<li> <li>
<button class="btn btn-link text-white" type="button" (click)="showCookieSettings()"> <button class="btn btn-link text-white" type="button" (click)="showCookieSettings()" role="button" tabindex="0">
{{ 'footer.link.cookies' | translate}} {{ 'footer.link.cookies' | translate}}
</button> </button>
</li> </li>
<li *ngIf="showPrivacyPolicy"> <li *ngIf="showPrivacyPolicy">
<a class="btn text-white" <a class="btn text-white"
routerLink="info/privacy">{{ 'footer.link.privacy-policy' | translate}}</a> routerLink="info/privacy" role="link" tabindex="0">{{ 'footer.link.privacy-policy' | translate}}</a>
</li> </li>
<li *ngIf="showEndUserAgreement"> <li *ngIf="showEndUserAgreement">
<a class="btn text-white" <a class="btn text-white"
routerLink="info/end-user-agreement">{{ 'footer.link.end-user-agreement' | translate}}</a> routerLink="info/end-user-agreement" role="link" tabindex="0">{{ 'footer.link.end-user-agreement' | translate}}</a>
</li> </li>
<li *ngIf="showSendFeedback$ | async"> <li *ngIf="showSendFeedback$ | async">
<a class="btn text-white" <a class="btn text-white"
routerLink="info/feedback">{{ 'footer.link.feedback' | translate}}</a> routerLink="info/feedback" role="link" tabindex="0">{{ 'footer.link.feedback' | translate}}</a>
</li> </li>
</ul> </ul>
</div> </div>

View File

@@ -1,7 +1,7 @@
<header> <header>
<div class="container"> <div class="container">
<div class="d-flex flex-row justify-content-between"> <div class="d-flex flex-row justify-content-between">
<a class="navbar-brand my-2" routerLink="/home"> <a class="navbar-brand my-2" routerLink="/home" role="button" tabindex="0">
<img src="assets/images/dspace-logo.svg" [attr.alt]="'menu.header.image.logo' | translate"/> <img src="assets/images/dspace-logo.svg" [attr.alt]="'menu.header.image.logo' | translate"/>
</a> </a>

View File

@@ -14,7 +14,7 @@
<li>issue permanent urls and trustworthy identifiers, including optional integrations with handle.net and DataCite DOI</li> <li>issue permanent urls and trustworthy identifiers, including optional integrations with handle.net and DataCite DOI</li>
</ul> </ul>
<p>Join an international community of <a href="https://wiki.lyrasis.org/display/DSPACE/DSpace+Positioning" <p>Join an international community of <a href="https://wiki.lyrasis.org/display/DSPACE/DSpace+Positioning"
target="_blank">leading institutions using DSpace</a>. target="_blank" role="link" tabindex="0">leading institutions using DSpace</a>.
</p> </p>
</div> </div>
</div> </div>

View File

@@ -6,7 +6,7 @@
<ds-listable-object-component-loader [object]="item" [viewMode]="viewMode" class="pb-4"> <ds-listable-object-component-loader [object]="item" [viewMode]="viewMode" class="pb-4">
</ds-listable-object-component-loader> </ds-listable-object-component-loader>
</div> </div>
<button (click)="onLoadMore()" class="btn btn-primary search-button mt-4"> {{'vocabulary-treeview.load-more' | translate }} ...</button> <button (click)="onLoadMore()" class="btn btn-primary search-button mt-4" role="button" tabindex="0"> {{'vocabulary-treeview.load-more' | translate }} ...</button>
</div> </div>
<ds-error *ngIf="itemRD?.hasFailed" message="{{'error.recent-submissions' | translate}}"></ds-error> <ds-error *ngIf="itemRD?.hasFailed" message="{{'error.recent-submissions' | translate}}"></ds-error>
<ds-loading *ngIf="!itemRD || itemRD.isLoading" message="{{'loading.recent-submissions' | translate}}"> <ds-loading *ngIf="!itemRD || itemRD.isLoading" message="{{'loading.recent-submissions' | translate}}">

View File

@@ -6,7 +6,7 @@
<ds-alert [type]="AlertTypeEnum.Warning"> <ds-alert [type]="AlertTypeEnum.Warning">
<div class="d-flex justify-content-between flex-wrap"> <div class="d-flex justify-content-between flex-wrap">
<span class="align-self-center">{{'item.alerts.withdrawn' | translate}}</span> <span class="align-self-center">{{'item.alerts.withdrawn' | translate}}</span>
<a routerLink="/home" class="btn btn-primary btn-sm">{{"404.link.home-page" | translate}}</a> <a routerLink="/home" class="btn btn-primary btn-sm" role="link" tabindex="0">{{"404.link.home-page" | translate}}</a>
</div> </div>
</ds-alert> </ds-alert>
</div> </div>

View File

@@ -1,6 +1,6 @@
<ds-metadata-field-wrapper [label]="label | translate"> <ds-metadata-field-wrapper [label]="label | translate">
<div class="collections"> <div class="collections">
<a *ngFor="let collection of (this.collections$ | async); let last=last;" [routerLink]="['/collections', collection.id]"> <a *ngFor="let collection of (this.collections$ | async); let last=last;" [routerLink]="['/collections', collection.id]" role="link" tabindex="0">
<span>{{ dsoNameService.getName(collection) }}</span><span *ngIf="!last" [innerHTML]="separator"></span> <span>{{ dsoNameService.getName(collection) }}</span><span *ngIf="!last" [innerHTML]="separator"></span>
</a> </a>
</div> </div>
@@ -15,6 +15,7 @@
class="load-more-btn btn btn-sm btn-outline-secondary" class="load-more-btn btn btn-sm btn-outline-secondary"
role="button" role="button"
href="javascript:void(0);" href="javascript:void(0);"
tabindex="0"
> >
{{'item.page.collections.load-more' | translate}} {{'item.page.collections.load-more' | translate}}
</a> </a>

View File

@@ -1,5 +1,5 @@
<ds-metadata-field-wrapper [label]="label | translate"> <ds-metadata-field-wrapper [label]="label | translate">
<a class="dont-break-out" *ngFor="let mdValue of mdValues; let last=last;" [href]="mdValue.value" [target]="linkTarget"> <a class="dont-break-out" *ngFor="let mdValue of mdValues; let last=last;" [href]="mdValue.value" [target]="linkTarget" role="link" tabindex="0">
{{ linktext || mdValue.value }}<span *ngIf="!last" [innerHTML]="separator"></span> {{ linktext || mdValue.value }}<span *ngIf="!last" [innerHTML]="separator"></span>
</a> </a>
</ds-metadata-field-wrapper> </ds-metadata-field-wrapper>

View File

@@ -21,7 +21,9 @@
<a class="dont-break-out ds-simple-metadata-link" <a class="dont-break-out ds-simple-metadata-link"
[href]="value" [href]="value"
[attr.target]="getLinkAttributes(value).target" [attr.target]="getLinkAttributes(value).target"
[attr.rel]="getLinkAttributes(value).rel"> [attr.rel]="getLinkAttributes(value).rel"
role="link"
tabindex="0">
{{value}} {{value}}
</a> </a>
</ng-template> </ng-template>
@@ -35,5 +37,5 @@
<ng-template #browselink let-value="value"> <ng-template #browselink let-value="value">
<a class="dont-break-out preserve-line-breaks ds-browse-link" <a class="dont-break-out preserve-line-breaks ds-browse-link"
[routerLink]="['/browse', browseDefinition.id]" [routerLink]="['/browse', browseDefinition.id]"
[queryParams]="getQueryParams(value)">{{value}}</a> [queryParams]="getQueryParams(value)" role="link" tabindex="0">{{value}}</a>
</ng-template> </ng-template>

View File

@@ -85,7 +85,7 @@
</ds-item-page-uri-field> </ds-item-page-uri-field>
<ds-item-page-collections [item]="object"></ds-item-page-collections> <ds-item-page-collections [item]="object"></ds-item-page-collections>
<div> <div>
<a class="btn btn-outline-primary" role="button" [routerLink]="[itemPageRoute + '/full']"> <a class="btn btn-outline-primary" role="button" [routerLink]="[itemPageRoute + '/full']" role="button" tabindex="0">
<i class="fas fa-info-circle"></i> {{"item.page.link.full" | translate}} <i class="fas fa-info-circle"></i> {{"item.page.link.full" | translate}}
</a> </a>
</div> </div>

View File

@@ -71,7 +71,7 @@
</ds-item-page-uri-field> </ds-item-page-uri-field>
<ds-item-page-collections [item]="object"></ds-item-page-collections> <ds-item-page-collections [item]="object"></ds-item-page-collections>
<div> <div>
<a class="btn btn-outline-primary" [routerLink]="[itemPageRoute + '/full']" role="button"> <a class="btn btn-outline-primary" [routerLink]="[itemPageRoute + '/full']" role="button" tabindex="0">
<i class="fas fa-info-circle"></i> {{"item.page.link.full" | translate}} <i class="fas fa-info-circle"></i> {{"item.page.link.full" | translate}}
</a> </a>
</div> </div>

View File

@@ -3,6 +3,6 @@
<h2><small><em>{{missingItem}}</em></small></h2> <h2><small><em>{{missingItem}}</em></small></h2>
<br /> <br />
<p class="text-center"> <p class="text-center">
<a routerLink="/home" class="btn btn-primary">{{"404.link.home-page" | translate}}</a> <a routerLink="/home" class="btn btn-primary" role="link" tabindex="0">{{"404.link.home-page" | translate}}</a>
</p> </p>
</div> </div>

View File

@@ -5,6 +5,6 @@
<p>{{"error-page." + code | translate}}</p> <p>{{"error-page." + code | translate}}</p>
<br/> <br/>
<p class="text-center"> <p class="text-center">
<a href="/home" class="btn btn-primary">{{ status + ".link.home-page" | translate}}</a> <a href="/home" class="btn btn-primary" role="link" tabindex="0">{{ status + ".link.home-page" | translate}}</a>
</p> </p>
</div> </div>

View File

@@ -5,6 +5,6 @@
<p>{{"404.help" | translate}}</p> <p>{{"404.help" | translate}}</p>
<br/> <br/>
<p class="text-center"> <p class="text-center">
<a routerLink="/home" class="btn btn-primary">{{"404.link.home-page" | translate}}</a> <a routerLink="/home" class="btn btn-primary" role="link" tabindex="0">{{"404.link.home-page" | translate}}</a>
</p> </p>
</div> </div>

View File

@@ -8,13 +8,15 @@
<div class="btn-group "> <div class="btn-group ">
<a [routerLink]="grantRoute$ | async" <a [routerLink]="grantRoute$ | async"
class="btn btn-outline-primary" class="btn btn-outline-primary"
title="{{'grant-deny-request-copy.grant' | translate }}"> title="{{'grant-deny-request-copy.grant' | translate }}"
role="button" tabindex="0">
{{'grant-deny-request-copy.grant' | translate }} {{'grant-deny-request-copy.grant' | translate }}
</a> </a>
<a [routerLink]="denyRoute$ | async" <a [routerLink]="denyRoute$ | async"
class="btn btn-outline-danger" class="btn btn-outline-danger"
title="{{'grant-deny-request-copy.deny' | translate }}"> title="{{'grant-deny-request-copy.deny' | translate }}"
role="button" tabindex="0">
{{'grant-deny-request-copy.deny' | translate }} {{'grant-deny-request-copy.deny' | translate }}
</a> </a>
</div> </div>
@@ -22,7 +24,7 @@
<div *ngIf="itemRequestRD.payload.decisionDate" class="processed-message"> <div *ngIf="itemRequestRD.payload.decisionDate" class="processed-message">
<p>{{'grant-deny-request-copy.processed' | translate}}</p> <p>{{'grant-deny-request-copy.processed' | translate}}</p>
<p class="text-center"> <p class="text-center">
<a routerLink="/home" class="btn btn-primary">{{'grant-deny-request-copy.home-page' | translate}}</a> <a routerLink="/home" class="btn btn-primary" role="link" tabindex="0">{{'grant-deny-request-copy.home-page' | translate}}</a>
</p> </p>
</div> </div>
</div> </div>

View File

@@ -7,7 +7,7 @@
[class.display]="searchExpanded ? 'inline-block' : 'none'" [class.display]="searchExpanded ? 'inline-block' : 'none'"
[tabIndex]="searchExpanded ? 0 : -1" [tabIndex]="searchExpanded ? 0 : -1"
[attr.data-test]="'header-search-box' | dsBrowserOnly"> [attr.data-test]="'header-search-box' | dsBrowserOnly">
<button class="submit-icon btn btn-link btn-link-inline" [attr.aria-label]="'nav.search.button' | translate" type="button" (click)="searchExpanded ? onSubmit(searchForm.value) : expand()" [attr.data-test]="'header-search-icon' | dsBrowserOnly"> <button class="submit-icon btn btn-link btn-link-inline" [attr.aria-label]="'nav.search.button' | translate" type="button" (click)="searchExpanded ? onSubmit(searchForm.value) : expand()" [attr.data-test]="'header-search-icon' | dsBrowserOnly" role="button" tabindex="0">
<em class="fas fa-search fa-lg fa-fw"></em> <em class="fas fa-search fa-lg fa-fw"></em>
</button> </button>
</form> </form>

View File

@@ -6,6 +6,7 @@
<a href="javascript:void(0);" class="dropdownLogin px-0.5" [attr.aria-label]="'nav.login' |translate" <a href="javascript:void(0);" class="dropdownLogin px-0.5" [attr.aria-label]="'nav.login' |translate"
(click)="$event.preventDefault()" [attr.data-test]="'login-menu' | dsBrowserOnly" (click)="$event.preventDefault()" [attr.data-test]="'login-menu' | dsBrowserOnly"
role="menuitem" role="menuitem"
tabindex="0"
aria-haspopup="menu" aria-haspopup="menu"
aria-controls="loginDropdownMenu" aria-controls="loginDropdownMenu"
[attr.aria-expanded]="loginDrop.isOpen()" [attr.aria-expanded]="loginDrop.isOpen()"
@@ -22,6 +23,7 @@
<div ngbDropdown display="dynamic" placement="bottom-right" class="d-inline-block" @fadeInOut> <div ngbDropdown display="dynamic" placement="bottom-right" class="d-inline-block" @fadeInOut>
<a href="javascript:void(0);" <a href="javascript:void(0);"
role="menuitem" role="menuitem"
tabindex="0"
[attr.aria-label]="'nav.user-profile-menu-and-logout' | translate" [attr.aria-label]="'nav.user-profile-menu-and-logout' | translate"
aria-controls="user-menu-dropdown" aria-controls="user-menu-dropdown"
(click)="$event.preventDefault()" [title]="'nav.user-profile-menu-and-logout' | translate" (click)="$event.preventDefault()" [title]="'nav.user-profile-menu-and-logout' | translate"
@@ -39,10 +41,10 @@
<ng-template #mobileButtons> <ng-template #mobileButtons>
<div data-test="auth-nav"> <div data-test="auth-nav">
<a *ngIf="!(isAuthenticated | async)" routerLink="/login" routerLinkActive="active" class="loginLink px-0.5" role="button"> <a *ngIf="!(isAuthenticated | async)" routerLink="/login" routerLinkActive="active" class="loginLink px-0.5" role="button" tabindex="0">
{{ 'nav.login' | translate }}<span class="sr-only">(current)</span> {{ 'nav.login' | translate }}<span class="sr-only">(current)</span>
</a> </a>
<a *ngIf="(isAuthenticated | async)" role="button" [attr.aria-label]="'nav.logout' |translate" [title]="'nav.logout' | translate" routerLink="/logout" routerLinkActive="active" class="logoutLink px-1"> <a *ngIf="(isAuthenticated | async)" role="button" [attr.aria-label]="'nav.logout' |translate" [title]="'nav.logout' | translate" routerLink="/logout" routerLinkActive="active" class="logoutLink px-1" tabindex="0">
<i class="fas fa-sign-out-alt fa-lg fa-fw"></i> <i class="fas fa-sign-out-alt fa-lg fa-fw"></i>
<span class="sr-only">(current)</span> <span class="sr-only">(current)</span>
</a> </a>

View File

@@ -9,7 +9,8 @@
role="tab" role="tab"
[routerLink]="option.routerLink" [routerLink]="option.routerLink"
[queryParams]="option.params" [queryParams]="option.params"
[class.active]="(currentOptionId$ | async) === option.id">{{ option.label | translate }}</a> [class.active]="(currentOptionId$ | async) === option.id"
tabindex="0">{{ option.label | translate }}</a>
</div> </div>
</div> </div>

View File

@@ -1,4 +1,4 @@
<p *ngIf="content" class="d-flex flex-wrap gapx-2 text-break"> <p *ngIf="content" class="d-flex flex-wrap gapx-2 text-break">
<span class="mb-0" *ngIf="title">{{ title | translate }}</span> <span class="mb-0" *ngIf="title">{{ title | translate }}</span>
<a [href]="getHandle()">{{getHandle()}}</a> <a [href]="getHandle()" role="link" tabindex="0">{{getHandle()}}</a>
</p> </p>

View File

@@ -2,7 +2,9 @@
[queryParams]="(bitstreamPath$| async)?.queryParams" [queryParams]="(bitstreamPath$| async)?.queryParams"
[target]="isBlank ? '_blank': '_self'" [target]="isBlank ? '_blank': '_self'"
[ngClass]="cssClasses" [ngClass]="cssClasses"
[attr.aria-label]="('file-download-link.download' | translate) + dsoNameService.getName(bitstream)"> [attr.aria-label]="('file-download-link.download' | translate) + dsoNameService.getName(bitstream)"
role="link"
tabindex="0">
<span *ngIf="!(canDownload$ |async)" [attr.aria-label]="'file-download-link.restricted' | translate" class="pr-1"><i class="fas fa-lock"></i></span> <span *ngIf="!(canDownload$ |async)" [attr.aria-label]="'file-download-link.restricted' | translate" class="pr-1"><i class="fas fa-lock"></i></span>
<ng-container *ngTemplateOutlet="content"></ng-container> <ng-container *ngTemplateOutlet="content"></ng-container>
</a> </a>

View File

@@ -7,15 +7,15 @@
[placeholder]="'vocabulary-treeview.search.form.search-placeholder' | translate"> [placeholder]="'vocabulary-treeview.search.form.search-placeholder' | translate">
<div class="input-group-append" id="button-addon4"> <div class="input-group-append" id="button-addon4">
<button class="btn btn-outline-primary" type="button" (click)="search()" [dsBtnDisabled]="!isSearchEnabled()" <button class="btn btn-outline-primary" type="button" (click)="search()" [dsBtnDisabled]="!isSearchEnabled()"
[attr.aria-label]="'vocabulary-treeview.search.form.search' | translate"> [attr.aria-label]="'vocabulary-treeview.search.form.search' | translate" role="button" tabindex="0">
{{'vocabulary-treeview.search.form.search' | translate}} {{'vocabulary-treeview.search.form.search' | translate}}
</button> </button>
<button class="btn btn-outline-secondary" type="button" (click)="reset()" <button class="btn btn-outline-secondary" type="button" (click)="reset()"
[attr.aria-label]="'vocabulary-treeview.search.form.reset' | translate"> [attr.aria-label]="'vocabulary-treeview.search.form.reset' | translate" role="button" tabindex="0">
{{'vocabulary-treeview.search.form.reset' | translate}} {{'vocabulary-treeview.search.form.reset' | translate}}
</button> </button>
<button class="btn btn-outline-primary" type="button" (click)="add()" [dsBtnDisabled]="this.vocabularyOptions.closed" <button class="btn btn-outline-primary" type="button" (click)="add()" [dsBtnDisabled]="this.vocabularyOptions.closed"
[attr.aria-label]="'vocabulary-treeview.search.form.add' | translate"> [attr.aria-label]="'vocabulary-treeview.search.form.add' | translate" role="button" tabindex="0">
{{'vocabulary-treeview.search.form.add' | translate}} {{'vocabulary-treeview.search.form.add' | translate}}
</button> </button>
</div> </div>
@@ -46,6 +46,8 @@
[(ngModel)]="node.isSelected" [(ngModel)]="node.isSelected"
[checked]="node.isSelected" [checked]="node.isSelected"
(change)="onSelect(node.item)" (change)="onSelect(node.item)"
role="checkbox"
tabindex="0"
> >
<span>{{node.item.display}}</span> <span>{{node.item.display}}</span>
</label> </label>
@@ -55,7 +57,9 @@
[ngbTooltip]="node.item?.otherInformation?.note" [ngbTooltip]="node.item?.otherInformation?.note"
[openDelay]="500" [openDelay]="500"
container="body" container="body"
(click)="onSelect(node.item)"> (click)="onSelect(node.item)"
role="button"
tabindex="0">
<span>{{node.item.display}}</span> <span>{{node.item.display}}</span>
</button> </button>
</cdk-tree-node> </cdk-tree-node>
@@ -64,7 +68,9 @@
<cdk-tree-node *cdkTreeNodeDef="let node; when: hasChildren" cdkTreeNodePadding class="d-flex"> <cdk-tree-node *cdkTreeNodeDef="let node; when: hasChildren" cdkTreeNodePadding class="d-flex">
<button type="button" class="btn btn-default px-2 mr-1" cdkTreeNodeToggle <button type="button" class="btn btn-default px-2 mr-1" cdkTreeNodeToggle
[attr.aria-label]="'toggle ' + node.name" [attr.aria-label]="'toggle ' + node.name"
(click)="loadChildren(node)"> (click)="loadChildren(node)"
role="button"
tabindex="0">
<i class="fas fa-fw {{treeControl.isExpanded(node) ? 'fa-angle-down' : 'fa-angle-right'}}"></i> <i class="fas fa-fw {{treeControl.isExpanded(node) ? 'fa-angle-down' : 'fa-angle-right'}}"></i>
</button> </button>
@@ -78,6 +84,8 @@
[(ngModel)]="node.isSelected" [(ngModel)]="node.isSelected"
[checked]="node.isSelected" [checked]="node.isSelected"
(change)="onSelect(node.item)" (change)="onSelect(node.item)"
role="checkbox"
tabindex="0"
> >
<span>{{node.item.display}}</span> <span>{{node.item.display}}</span>
</label> </label>
@@ -87,21 +95,23 @@
[ngbTooltip]="node.item?.otherInformation?.note" [ngbTooltip]="node.item?.otherInformation?.note"
[openDelay]="500" [openDelay]="500"
container="body" container="body"
(click)="onSelect(node.item)"> (click)="onSelect(node.item)"
role="button"
tabindex="0">
<span>{{node.item.display}}</span> <span>{{node.item.display}}</span>
</button> </button>
</cdk-tree-node> </cdk-tree-node>
<cdk-tree-node *cdkTreeNodeDef="let node; when: isLoadMore" cdkTreeNodePadding> <cdk-tree-node *cdkTreeNodeDef="let node; when: isLoadMore" cdkTreeNodePadding>
<button class="btn btn-outline-secondary btn-sm" (click)="loadMore(node.loadMoreParentItem)" <button class="btn btn-outline-secondary btn-sm" (click)="loadMore(node.loadMoreParentItem)"
[attr.aria-label]="'vocabulary-treeview.load-more' | translate"> [attr.aria-label]="'vocabulary-treeview.load-more' | translate" role="button" tabindex="0">
{{'vocabulary-treeview.load-more' | translate}}... {{'vocabulary-treeview.load-more' | translate}}...
</button> </button>
</cdk-tree-node> </cdk-tree-node>
<cdk-tree-node *cdkTreeNodeDef="let node; when: isLoadMoreRoot"> <cdk-tree-node *cdkTreeNodeDef="let node; when: isLoadMoreRoot">
<button class="btn btn-outline-secondary btn-sm" (click)="loadMoreRoot(node)" <button class="btn btn-outline-secondary btn-sm" (click)="loadMoreRoot(node)"
[attr.aria-label]="'vocabulary-treeview.load-more' | translate"> [attr.aria-label]="'vocabulary-treeview.load-more' | translate" role="button" tabindex="0">
{{'vocabulary-treeview.load-more' | translate}}... {{'vocabulary-treeview.load-more' | translate}}...
</button> </button>
</cdk-tree-node> </cdk-tree-node>

View File

@@ -1,3 +1,3 @@
<button class="btn btn-lg btn-primary btn-block text-white" (click)="redirectToExternalProvider()"> <button class="btn btn-lg btn-primary btn-block text-white" (click)="redirectToExternalProvider()" role="button" tabindex="0">
<i class="fas fa-sign-in-alt"></i> {{getButtonLabel() | translate}} <i class="fas fa-sign-in-alt"></i> {{getButtonLabel() | translate}}
</button> </button>

View File

@@ -24,14 +24,14 @@
@fadeOut>{{ (message | async) | translate }}</div> @fadeOut>{{ (message | async) | translate }}</div>
<button class="btn btn-lg btn-primary btn-block mt-3" type="submit" [attr.data-test]="'login-button' | dsBrowserOnly" <button class="btn btn-lg btn-primary btn-block mt-3" type="submit" [attr.data-test]="'login-button' | dsBrowserOnly"
[dsBtnDisabled]="!form.valid"><i class="fas fa-sign-in-alt"></i> {{"login.form.submit" | translate}}</button> [dsBtnDisabled]="!form.valid" role="button" tabindex="0"><i class="fas fa-sign-in-alt"></i> {{"login.form.submit" | translate}}</button>
</form> </form>
<div class="mt-2"> <div class="mt-2">
<a class="dropdown-item" *ngIf="canRegister$ | async" [routerLink]="[getRegisterRoute()]" [attr.data-test]="'register' | dsBrowserOnly" role="menuitem"> <a class="dropdown-item" *ngIf="canRegister$ | async" [routerLink]="[getRegisterRoute()]" [attr.data-test]="'register' | dsBrowserOnly" role="menuitem" tabindex="0">
{{ 'login.form.new-user' | translate }} {{ 'login.form.new-user' | translate }}
</a> </a>
<a class="dropdown-item" [routerLink]="[getForgotRoute()]" [attr.data-test]="'forgot' | dsBrowserOnly" role="menuitem"> <a class="dropdown-item" [routerLink]="[getForgotRoute()]" [attr.data-test]="'forgot' | dsBrowserOnly" role="menuitem" tabindex="0">
{{ 'login.form.forgot-password' | translate }} {{ 'login.form.forgot-password' | translate }}
</a> </a>
</div> </div>

View File

@@ -8,4 +8,5 @@
(keyup.space)="navigate($event)" (keyup.space)="navigate($event)"
(keydown.enter)="navigate($event)" (keydown.enter)="navigate($event)"
href="javascript:void(0);" href="javascript:void(0);"
tabindex="0"
>{{item.text | translate}}</a> >{{item.text | translate}}</a>

View File

@@ -1 +1 @@
<span class="ds-menu-item" [class.disabled]="item.disabled">{{item.text | translate}}</span> <span class="ds-menu-item" [class.disabled]="item.disabled" tabindex="0" role="button">{{item.text | translate}}</span>

View File

@@ -1,5 +1,5 @@
<div class="d-flex flex-row"> <div class="d-flex flex-row">
<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[]" [queryParams]="queryParams$ | async" [queryParamsHandling]="'merge'" class="lead"> <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[]" [queryParams]="queryParams$ | async" [queryParamsHandling]="'merge'" class="lead" role="link" tabindex="0">
{{object.value}} {{object.value}}
</a> </a>
<span *ngIf="linkType == linkTypes.None" class="lead"> <span *ngIf="linkType == linkTypes.None" class="lead">

View File

@@ -1,5 +1,5 @@
<div class="d-flex flex-row"> <div class="d-flex flex-row">
<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="['/collections/' + object.id]" class="lead"> <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="['/collections/' + object.id]" class="lead" role="link" tabindex="0">
{{ dsoNameService.getName(object) }} {{ dsoNameService.getName(object) }}
</a> </a>
<span *ngIf="linkType == linkTypes.None" class="lead"> <span *ngIf="linkType == linkTypes.None" class="lead">

View File

@@ -1,5 +1,5 @@
<div class="d-flex flex-row"> <div class="d-flex flex-row">
<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="['/communities/' + object.id]" class="lead"> <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="['/communities/' + object.id]" class="lead" role="link" tabindex="0">
{{ dsoNameService.getName(object) }} {{ dsoNameService.getName(object) }}
</a> </a>
<span *ngIf="linkType == linkTypes.None" class="lead"> <span *ngIf="linkType == linkTypes.None" class="lead">

View File

@@ -4,14 +4,16 @@
{{mdRepresentation.getValue()}} {{mdRepresentation.getValue()}}
</span> </span>
<a *ngIf="(mdRepresentation.representationType=='plain_text') && isLink()" class="dont-break-out" <a *ngIf="(mdRepresentation.representationType=='plain_text') && isLink()" class="dont-break-out"
target="_blank" [href]="mdRepresentation.getValue()"> target="_blank" [href]="mdRepresentation.getValue()" role="link" tabindex="0">
{{mdRepresentation.getValue()}} {{mdRepresentation.getValue()}}
</a> </a>
<span *ngIf="(mdRepresentation.representationType=='authority_controlled')" class="dont-break-out">{{mdRepresentation.getValue()}}</span> <span *ngIf="(mdRepresentation.representationType=='authority_controlled')" class="dont-break-out">{{mdRepresentation.getValue()}}</span>
<a *ngIf="(mdRepresentation.representationType=='browse_link')" <a *ngIf="(mdRepresentation.representationType=='browse_link')"
class="dont-break-out ds-browse-link" class="dont-break-out ds-browse-link"
[routerLink]="['/browse/', mdRepresentation.browseDefinition.id]" [routerLink]="['/browse/', mdRepresentation.browseDefinition.id]"
[queryParams]="getQueryParams()"> [queryParams]="getQueryParams()"
role="link"
tabindex="0">
{{mdRepresentation.getValue()}} {{mdRepresentation.getValue()}}
</a> </a>
</div> </div>

View File

@@ -1,7 +1,7 @@
<div class="row"> <div class="row">
<div *ngIf="showThumbnails" class="col-3 col-md-2"> <div *ngIf="showThumbnails" class="col-3 col-md-2">
<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null"
[routerLink]="[itemPageRoute]" class="dont-break-out"> [routerLink]="[itemPageRoute]" class="dont-break-out" role="link" tabindex="0">
<ds-thumbnail [thumbnail]="dso?.thumbnail | async" [limitWidth]="true"> <ds-thumbnail [thumbnail]="dso?.thumbnail | async" [limitWidth]="true">
</ds-thumbnail> </ds-thumbnail>
</a> </a>
@@ -18,7 +18,7 @@
<ds-truncatable [id]="dso.id" *ngIf="object !== undefined && object !== null"> <ds-truncatable [id]="dso.id" *ngIf="object !== undefined && object !== null">
<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null" <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" [attr.rel]="(linkType == linkTypes.ExternalLink) ? 'noopener noreferrer' : null"
[routerLink]="[itemPageRoute]" class="lead item-list-title dont-break-out" [routerLink]="[itemPageRoute]" class="lead item-list-title dont-break-out"
[innerHTML]="dsoTitle"></a> [innerHTML]="dsoTitle" role="link" tabindex="0"></a>
<span *ngIf="linkType == linkTypes.None" class="lead item-list-title dont-break-out" <span *ngIf="linkType == linkTypes.None" class="lead item-list-title dont-break-out"
[innerHTML]="dsoTitle"></span> [innerHTML]="dsoTitle"></span>
<span class="text-muted"> <span class="text-muted">

View File

@@ -7,13 +7,13 @@
</div> </div>
<div class="col"> <div class="col">
<div *ngIf="!hideGear" ngbDropdown #paginationControls="ngbDropdown" placement="bottom-right" class="d-inline-block float-right"> <div *ngIf="!hideGear" ngbDropdown #paginationControls="ngbDropdown" placement="bottom-right" class="d-inline-block float-right">
<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> <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" role="button" tabindex="0"><i class="fas fa-cog" aria-hidden="true"></i></button>
<ul id="paginationControlsDropdownMenu" aria-labelledby="paginationControls" role="menu" ngbDropdownMenu> <ul id="paginationControlsDropdownMenu" aria-labelledby="paginationControls" role="menu" ngbDropdownMenu>
<li role="menuitem"> <li role="menuitem">
<span class="dropdown-header" id="pagination-control_results-per-page" role="heading">{{ 'pagination.results-per-page' | translate}}</span> <span class="dropdown-header" id="pagination-control_results-per-page" role="heading">{{ 'pagination.results-per-page' | translate}}</span>
<ul aria-labelledby="pagination-control_results-per-page" class="list-unstyled" role="listbox"> <ul aria-labelledby="pagination-control_results-per-page" class="list-unstyled" role="listbox">
<li *ngFor="let item of pageSizeOptions" role="option" [attr.aria-selected]="item === (pageSize$ | async)"> <li *ngFor="let item of pageSizeOptions" role="option" [attr.aria-selected]="item === (pageSize$ | async)">
<button (click)="doPageSizeChange(item)" class="dropdown-item"> <button (click)="doPageSizeChange(item)" class="dropdown-item" role="button" tabindex="0">
<i [ngClass]="{'invisible': item !== (pageSize$ | async) }" class="fas fa-check" aria-hidden="true"></i> {{item}} <i [ngClass]="{'invisible': item !== (pageSize$ | async) }" class="fas fa-check" aria-hidden="true"></i> {{item}}
</button> </button>
</li> </li>
@@ -23,7 +23,7 @@
<span class="dropdown-header" id="pagination-control_sort-direction" role="heading">{{ 'pagination.sort-direction' | translate}}</span> <span class="dropdown-header" id="pagination-control_sort-direction" role="heading">{{ 'pagination.sort-direction' | translate}}</span>
<ul aria-labelledby="pagination-control_sort-direction" class="list-unstyled" role="listbox"> <ul aria-labelledby="pagination-control_sort-direction" class="list-unstyled" role="listbox">
<li *ngFor="let direction of (sortDirections | dsKeys)" [attr.aria-selected]="direction.value === (sortDirection$ | async)" role="option"> <li *ngFor="let direction of (sortDirections | dsKeys)" [attr.aria-selected]="direction.value === (sortDirection$ | async)" role="option">
<button class="dropdown-item" (click)="doSortDirectionChange(direction.value)"> <button class="dropdown-item" (click)="doSortDirectionChange(direction.value)" role="button" tabindex="0">
<i [ngClass]="{'invisible': direction.value !== (sortDirection$ |async)}" class="fas fa-check" aria-hidden="true"></i> {{'sorting.' + direction.key | translate}} <i [ngClass]="{'invisible': direction.value !== (sortDirection$ |async)}" class="fas fa-check" aria-hidden="true"></i> {{'sorting.' + direction.key | translate}}
</button> </button>
</li> </li>
@@ -56,12 +56,12 @@
<div *ngIf="!showPaginator" class="d-flex justify-content-between"> <div *ngIf="!showPaginator" class="d-flex justify-content-between">
<button id="nav-prev" type="button" class="btn btn-outline-primary float-left" <button id="nav-prev" type="button" class="btn btn-outline-primary float-left"
(click)="goPrev()" (click)="goPrev()"
[dsBtnDisabled]="(objects?.payload?.currentPage <= 1) && (paginationOptions?.currentPage <= 1)"> [dsBtnDisabled]="(objects?.payload?.currentPage <= 1) && (paginationOptions?.currentPage <= 1)" role="button" tabindex="0">
<i class="fas fa-angle-left"></i> {{'pagination.previous.button' |translate}} <i class="fas fa-angle-left"></i> {{'pagination.previous.button' |translate}}
</button> </button>
<button id="nav-next" type="button" class="btn btn-outline-primary float-right" <button id="nav-next" type="button" class="btn btn-outline-primary float-right"
(click)="goNext()" (click)="goNext()"
[dsBtnDisabled]="(objects?.payload?.currentPage >= objects?.payload?.totalPages) || (paginationOptions?.currentPage >= objects?.payload?.totalPages)"> [dsBtnDisabled]="(objects?.payload?.currentPage >= objects?.payload?.totalPages) || (paginationOptions?.currentPage >= objects?.payload?.totalPages)" role="button" tabindex="0">
<span [ngbTooltip]="objects?.payload?.currentPage >= objects?.payload?.totalPages ? ('pagination.next.button.disabled.tooltip' |translate) : null"> <span [ngbTooltip]="objects?.payload?.currentPage >= objects?.payload?.totalPages ? ('pagination.next.button.disabled.tooltip' |translate) : null">
<i class="fas fa-angle-right"></i> {{'pagination.next.button' |translate}} <i class="fas fa-angle-right"></i> {{'pagination.next.button' |translate}}
</span> </span>

View File

@@ -1,4 +1,4 @@
<button class="btn btn-secondary btn-sm mb-2 ng-tns-c242-28" (click)="back()"> <button class="btn btn-secondary btn-sm mb-2 ng-tns-c242-28" (click)="back()" role="button" tabindex="0">
<i _ngcontent-dspace-angular-c242="" class="fas fa-arrow-left ng-tns-c242-3"></i> <i _ngcontent-dspace-angular-c242="" class="fas fa-arrow-left ng-tns-c242-3"></i>
{{this.buttonLabel | async}} {{this.buttonLabel | async}}
</button> </button>

View File

@@ -1,5 +1,5 @@
<ng-container *ngIf="(isEnabled$ | async) && (hasRoute('home') || hasRoute('collections') || hasRoute('communities'))"> <ng-container *ngIf="(isEnabled$ | async) && (hasRoute('home') || hasRoute('collections') || hasRoute('communities'))">
<div *ngIf="route$ | async as route" class="d-inline-block float-right margin-right"> <div *ngIf="route$ | async as route" class="d-inline-block float-right margin-right">
<a [href]="route" class="btn btn-secondary" [title]="'feed.description' | translate" [attr.aria-label]="'feed.description' | translate"><i class="fas fa-rss-square"></i></a> <a [href]="route" class="btn btn-secondary" [title]="'feed.description' | translate" [attr.aria-label]="'feed.description' | translate" role="button" tabindex="0"><i class="fas fa-rss-square"></i></a>
</div> </div>
</ng-container> </ng-container>

View File

@@ -4,7 +4,7 @@
<div *ngIf="showScopeSelector" class="input-group-prepend"> <div *ngIf="showScopeSelector" class="input-group-prepend">
<button class="scope-button btn btn-outline-secondary text-truncate" <button class="scope-button btn btn-outline-secondary text-truncate"
[ngbTooltip]="dsoNameService.getName(selectedScope | async)" type="button" [ngbTooltip]="dsoNameService.getName(selectedScope | async)" type="button"
(click)="openScopeModal()"> (click)="openScopeModal()" role="button" tabindex="0">
{{dsoNameService.getName(selectedScope | async) || ('search.form.scope.all' | translate)}} {{dsoNameService.getName(selectedScope | async) || ('search.form.scope.all' | translate)}}
</button> </button>
</div> </div>
@@ -12,7 +12,7 @@
attr.aria-label="{{ searchPlaceholder }}" [attr.data-test]="'search-box' | dsBrowserOnly" attr.aria-label="{{ searchPlaceholder }}" [attr.data-test]="'search-box' | dsBrowserOnly"
[placeholder]="searchPlaceholder"> [placeholder]="searchPlaceholder">
<span class="input-group-append"> <span class="input-group-append">
<button type="submit" class="search-button btn btn-{{brandColor}}" [attr.data-test]="'search-button' | dsBrowserOnly"><i class="fas fa-search"></i> {{ ('search.form.search' | translate) }}</button> <button type="submit" class="search-button btn btn-{{brandColor}}" [attr.data-test]="'search-button' | dsBrowserOnly" role="button" tabindex="0"><i class="fas fa-search"></i> {{ ('search.form.search' | translate) }}</button>
</span> </span>
</div> </div>
</div> </div>

View File

@@ -8,11 +8,11 @@
</ng-container> </ng-container>
<div class="clearfix toggle-more-filters"> <div class="clearfix toggle-more-filters">
<a class="float-left" *ngIf="!(isLastPage$ | async)" <a class="float-left" *ngIf="!(isLastPage$ | async)"
(click)="showMore()" href="javascript:void(0);"> (click)="showMore()" href="javascript:void(0);" role="link" tabindex="0">
{{"search.filters.filter.show-more" | translate}} {{"search.filters.filter.show-more" | translate}}
</a> </a>
<a class="float-right" *ngIf="(currentPage | async) > 1" <a class="float-right" *ngIf="(currentPage | async) > 1"
(click)="showFirstPageOnly()" href="javascript:void(0);"> (click)="showFirstPageOnly()" href="javascript:void(0);" role="link" tabindex="0">
{{"search.filters.filter.show-less" | translate}} {{"search.filters.filter.show-less" | translate}}
</a> </a>
</div> </div>

View File

@@ -8,11 +8,11 @@
</ng-container> </ng-container>
<div class="clearfix toggle-more-filters"> <div class="clearfix toggle-more-filters">
<a class="float-left" *ngIf="!(isLastPage$ | async)" <a class="float-left" *ngIf="!(isLastPage$ | async)"
(click)="showMore()" href="javascript:void(0);"> (click)="showMore()" href="javascript:void(0);" role="link" tabindex="0">
{{"search.filters.filter.show-more" | translate}} {{"search.filters.filter.show-more" | translate}}
</a> </a>
<a class="float-right" *ngIf="(currentPage | async) > 1" <a class="float-right" *ngIf="(currentPage | async) > 1"
(click)="showFirstPageOnly()" href="javascript:void(0);"> (click)="showFirstPageOnly()" href="javascript:void(0);" role="link" tabindex="0">
{{"search.filters.filter.show-less" | translate}} {{"search.filters.filter.show-less" | translate}}
</a> </a>
</div> </div>

View File

@@ -2,9 +2,9 @@
[tabIndex]="-1" [tabIndex]="-1"
[routerLink]="[searchLink]" [routerLink]="[searchLink]"
[queryParams]="addQueryParams" queryParamsHandling="merge" [queryParams]="addQueryParams" queryParamsHandling="merge"
(click)="announceFilter()"> (click)="announceFilter()" role="button" tabindex="0">
<label class="mb-0 d-flex w-100"> <label class="mb-0 d-flex w-100">
<input type="checkbox" [checked]="false" class="my-1 align-self-stretch filter-checkbox"/> <input type="checkbox" [checked]="false" class="my-1 align-self-stretch filter-checkbox" role="checkbox" tabindex="0"/>
<span class="w-100 pl-1 break-facet"> <span class="w-100 pl-1 break-facet">
<span class="float-right badge badge-secondary badge-pill mt-1 ml-1">{{filterValue.count | dsShortNumber}}</span> <span class="float-right badge badge-secondary badge-pill mt-1 ml-1">{{filterValue.count | dsShortNumber}}</span>
{{ 'search.filters.' + filterConfig.name + '.' + filterValue.value | translate: {default: filterValue.value} }} {{ 'search.filters.' + filterConfig.name + '.' + filterValue.value | translate: {default: filterValue.value} }}

View File

@@ -1,6 +1,6 @@
<a *ngIf="isVisible | async" class="d-flex flex-row" <a *ngIf="isVisible | async" class="d-flex flex-row"
[routerLink]="[searchLink]" [routerLink]="[searchLink]"
[queryParams]="changeQueryParams" queryParamsHandling="merge"> [queryParams]="changeQueryParams" queryParamsHandling="merge" role="button" tabindex="0">
<span class="filter-value px-1">{{filterValue.label}}</span> <span class="filter-value px-1">{{filterValue.label}}</span>
<span class="float-right filter-value-count ml-auto"> <span class="float-right filter-value-count ml-auto">
<span class="badge badge-secondary badge-pill">{{filterValue.count | dsShortNumber}}</span> <span class="badge badge-secondary badge-pill">{{filterValue.count | dsShortNumber}}</span>

View File

@@ -1,9 +1,9 @@
<a class="d-flex flex-row" <a class="d-flex flex-row"
[tabIndex]="-1" [tabIndex]="-1"
[routerLink]="[searchLink]" [routerLink]="[searchLink]"
[queryParams]="removeQueryParams" queryParamsHandling="merge"> [queryParams]="removeQueryParams" queryParamsHandling="merge" role="link" tabindex="0">
<label class="mb-0 d-flex w-100"> <label class="mb-0 d-flex w-100">
<input type="checkbox" [checked]="true" class="my-1 align-self-stretch filter-checkbox"/> <input type="checkbox" [checked]="true" class="my-1 align-self-stretch filter-checkbox" role="checkbox" tabindex="0"/>
<span class="filter-value pl-1 break-facet"> <span class="filter-value pl-1 break-facet">
{{ 'search.filters.' + filterConfig.name + '.' + selectedValue.value | translate: {default: selectedValue.label} }} {{ 'search.filters.' + filterConfig.name + '.' + selectedValue.value | translate: {default: selectedValue.label} }}
</span> </span>

View File

@@ -5,6 +5,8 @@
[attr.aria-expanded]="!(collapsed$ | async)" [attr.aria-expanded]="!(collapsed$ | async)"
[attr.aria-label]="(((collapsed$ | async) ? 'search.filters.filter.expand' : 'search.filters.filter.collapse') | translate) + ' ' + (('search.filters.filter.' + filter.name + '.head') | translate | lowercase)" [attr.aria-label]="(((collapsed$ | async) ? 'search.filters.filter.expand' : 'search.filters.filter.collapse') | translate) + ' ' + (('search.filters.filter.' + filter.name + '.head') | translate | lowercase)"
[attr.data-test]="'filter-toggle' | dsBrowserOnly" [attr.data-test]="'filter-toggle' | dsBrowserOnly"
role="button"
tabindex="0"
> >
<span class="h4 d-inline-block text-left mt-auto mb-auto dark:text-white text-dark"> <span class="h4 d-inline-block text-left mt-auto mb-auto dark:text-white text-dark">
{{'search.filters.filter.' + filter.name + '.head'| translate}} {{'search.filters.filter.' + filter.name + '.head'| translate}}

View File

@@ -8,11 +8,13 @@
</ng-container> </ng-container>
<div class="clearfix toggle-more-filters"> <div class="clearfix toggle-more-filters">
<a class="float-left" *ngIf="!(isLastPage$ | async)" <a class="float-left" *ngIf="!(isLastPage$ | async)"
(click)="showMore()" href="javascript:void(0);"> (click)="showMore()" href="javascript:void(0);"
role="button" tabindex="0">
{{"search.filters.filter.show-more" | translate}} {{"search.filters.filter.show-more" | translate}}
</a> </a>
<a class="float-right" *ngIf="(currentPage | async) > 1" <a class="float-right" *ngIf="(currentPage | async) > 1"
(click)="showFirstPageOnly()" href="javascript:void(0);"> (click)="showFirstPageOnly()" href="javascript:void(0);"
role="button" tabindex="0">
{{"search.filters.filter.show-less" | translate}} {{"search.filters.filter.show-less" | translate}}
</a> </a>
</div> </div>
@@ -34,6 +36,6 @@
<a *ngIf="vocabularyExists$ | async" <a *ngIf="vocabularyExists$ | async"
href="javascript:void(0);" href="javascript:void(0);"
id="show-{{filterConfig.name}}-tree" id="show-{{filterConfig.name}}-tree"
(click)="showVocabularyTree()"> (click)="showVocabularyTree()" role="button" tabindex="0">
{{'search.filters.filter.show-tree' | translate: {name: ('search.filters.filter.' + filterConfig.name + '.head' | translate | lowercase )} }} {{'search.filters.filter.show-tree' | translate: {name: ('search.filters.filter.' + filterConfig.name + '.head' | translate | lowercase )} }}
</a> </a>

View File

@@ -26,7 +26,7 @@
/> />
</label> </label>
</div> </div>
<button class="sr-only" type="submit"> <button class="sr-only" type="submit" role="button" tabindex="0">
{{'search.filters.search.submit' | translate}} {{'search.filters.search.submit' | translate}}
</button> </button>
</form> </form>
@@ -44,7 +44,7 @@
<ds-search-facet-range-option *ngFor="let value of page.page; trackBy: trackUpdate" [filterConfig]="filterConfig" [filterValue]="value" [inPlaceSearch]="inPlaceSearch"></ds-search-facet-range-option> <ds-search-facet-range-option *ngFor="let value of page.page; trackBy: trackUpdate" [filterConfig]="filterConfig" [filterValue]="value" [inPlaceSearch]="inPlaceSearch"></ds-search-facet-range-option>
</div> </div>
</ng-container> </ng-container>
<button (click)="onSubmit()" class="btn btn-primary"> <button (click)="onSubmit()" class="btn btn-primary" role="button" tabindex="0">
{{'search.filters.search.submit' | translate}} {{'search.filters.search.submit' | translate}}
</button> </button>
</div> </div>

View File

@@ -8,11 +8,11 @@
</ng-container> </ng-container>
<div class="clearfix toggle-more-filters"> <div class="clearfix toggle-more-filters">
<a class="float-left" *ngIf="!(isLastPage$ | async)" <a class="float-left" *ngIf="!(isLastPage$ | async)"
(click)="showMore()" href="javascript:void(0);"> (click)="showMore()" href="javascript:void(0);" role="button" tabindex="0">
{{"search.filters.filter.show-more" | translate}} {{"search.filters.filter.show-more" | translate}}
</a> </a>
<a class="float-right" *ngIf="(currentPage | async) > 1" <a class="float-right" *ngIf="(currentPage | async) > 1"
(click)="showFirstPageOnly()" href="javascript:void(0);"> (click)="showFirstPageOnly()" href="javascript:void(0);" role="button" tabindex="0">
{{"search.filters.filter.show-less" | translate}} {{"search.filters.filter.show-less" | translate}}
</a> </a>
</div> </div>

View File

@@ -32,7 +32,7 @@
{{ 'search.results.no-results' | translate }} {{ 'search.results.no-results' | translate }}
<a [routerLink]="['/search']" <a [routerLink]="['/search']"
[queryParams]="{ query: surroundStringWithQuotes(searchConfig?.query) }" [queryParams]="{ query: surroundStringWithQuotes(searchConfig?.query) }"
queryParamsHandling="merge"> queryParamsHandling="merge" role="link" tabindex="0">
{{"search.results.no-results-link" | translate}} {{"search.results.no-results-link" | translate}}
</a> </a>
</div> </div>

View File

@@ -27,7 +27,7 @@
<div class="form-group input-group col-12 col-md-6 pt-1 pt-md-0"> <div class="form-group input-group col-12 col-md-6 pt-1 pt-md-0">
<input class="form-control" placeholder="{{'browse.startsWith.type_date' | translate}}" [attr.aria-label]="'browse.startsWith.type_date.label' |translate" type="text" name="startsWith" formControlName="startsWith" [value]="getStartsWith() ? getStartsWith() : ''" /> <input class="form-control" placeholder="{{'browse.startsWith.type_date' | translate}}" [attr.aria-label]="'browse.startsWith.type_date.label' |translate" type="text" name="startsWith" formControlName="startsWith" [value]="getStartsWith() ? getStartsWith() : ''" />
<span class="input-group-append"> <span class="input-group-append">
<button class="btn btn-primary" type="submit"><i class="fas fa-book-open"></i> {{'browse.startsWith.submit' | translate}}</button> <button class="btn btn-primary" type="submit" role="button" tabindex="0"><i class="fas fa-book-open"></i> {{'browse.startsWith.submit' | translate}}</button>
</span> </span>
</div> </div>
</div> </div>

View File

@@ -4,7 +4,7 @@
<div class="form-group input-group col-sm-12 col-md-6 col-auto"> <div class="form-group input-group col-sm-12 col-md-6 col-auto">
<input class="form-control" [attr.aria-label]="'browse.startsWith.input' | translate" placeholder="{{'browse.search-form.placeholder' | translate}}" type="text" name="startsWith" formControlName="startsWith" [value]="getStartsWith()" /> <input class="form-control" [attr.aria-label]="'browse.startsWith.input' | translate" placeholder="{{'browse.search-form.placeholder' | translate}}" type="text" name="startsWith" formControlName="startsWith" [value]="getStartsWith()" />
<span class="input-group-append"> <span class="input-group-append">
<button class="btn btn-primary" type="submit"><i class="fas fa-book-open"></i> {{'browse.startsWith.submit' | translate}}</button> <button class="btn btn-primary" type="submit" role="button" tabindex="0"><i class="fas fa-book-open"></i> {{'browse.startsWith.submit' | translate}}</button>
</span> </span>
</div> </div>
</div> </div>

View File

@@ -10,6 +10,7 @@
(keyup.Space)="toggle()" (keyup.Space)="toggle()"
role="button" role="button"
[attr.aria-expanded]="isExpanded" [attr.aria-expanded]="isExpanded"
tabindex="0"
> >
<i class="fas {{isExpanded ? 'fa-angle-up' : 'fa-angle-down'}}"></i> <i class="fas {{isExpanded ? 'fa-angle-up' : 'fa-angle-down'}}"></i>
<span class="ml-1">{{ 'item.truncatable-part.show-' + (isExpanded ? 'less' : 'more') | translate }}</span> <span class="ml-1">{{ 'item.truncatable-part.show-' + (isExpanded ? 'less' : 'more') | translate }}</span>

View File

@@ -5,7 +5,7 @@
[attr.role]="(isMobile$ | async) ? 'navigation' : 'presentation'" [attr.role]="(isMobile$ | async) ? 'navigation' : 'presentation'"
[attr.aria-label]="(isMobile$ | async) ? ('nav.main.description' | translate) : null" [attr.aria-label]="(isMobile$ | async) ? ('nav.main.description' | translate) : null"
class="h-100 flex-fill d-flex flex-row flex-nowrap justify-content-start align-items-center gapx-3"> class="h-100 flex-fill d-flex flex-row flex-nowrap justify-content-start align-items-center gapx-3">
<a class="d-block my-2 my-md-0" routerLink="/home" [attr.aria-label]="'home.title' | translate"> <a class="d-block my-2 my-md-0" routerLink="/home" [attr.aria-label]="'home.title' | translate" role="button" tabindex="0">
<img id="header-logo" src="assets/images/dspace-logo.svg" [attr.alt]="'menu.header.image.logo' | translate"/> <img id="header-logo" src="assets/images/dspace-logo.svg" [attr.alt]="'menu.header.image.logo' | translate"/>
</a> </a>
<nav *ngIf="!(isMobile$ | async)" class="navbar navbar-expand p-0 align-items-stretch align-self-stretch" id="desktop-navbar" [attr.aria-label]="'nav.main.description' | translate"> <nav *ngIf="!(isMobile$ | async)" class="navbar navbar-expand p-0 align-items-stretch align-self-stretch" id="desktop-navbar" [attr.aria-label]="'nav.main.description' | translate">

View File

@@ -19,7 +19,7 @@
handle.net and DataCite DOI handle.net and DataCite DOI
</li> </li>
</ul> </ul>
<p>Join an international community of <a href="https://wiki.lyrasis.org/display/DSPACE/DSpace+Positioning" target="_blank">leading institutions using DSpace</a>.</p> <p>Join an international community of <a href="https://wiki.lyrasis.org/display/DSPACE/DSpace+Positioning" target="_blank" role="link" tabindex="0">leading institutions using DSpace</a>.</p>
<p>The test user accounts below have their password set to the name of this <p>The test user accounts below have their password set to the name of this
software in lowercase.</p> software in lowercase.</p>
<ul> <ul>
@@ -35,5 +35,5 @@
<source type="image/jpg" srcset="assets/dspace/images/banner.jpg 2000w, assets/dspace/images/banner-half.jpg 1200w, assets/dspace/images/banner-tall.jpg 768w"> <source type="image/jpg" srcset="assets/dspace/images/banner.jpg 2000w, assets/dspace/images/banner-half.jpg 1200w, assets/dspace/images/banner-tall.jpg 768w">
<img alt="" [src]="'assets/dspace/images/banner.jpg'"/><!-- without the []="''" Firefox downloads both the fallback and the resolved image --> <img alt="" [src]="'assets/dspace/images/banner.jpg'"/><!-- without the []="''" Firefox downloads both the fallback and the resolved image -->
</picture> </picture>
<small class="credits">Photo by <a href="https://www.pexels.com/@inspiredimages">@inspiredimages</a></small> <small class="credits">Photo by <a href="https://www.pexels.com/@inspiredimages" role="link" tabindex="0">@inspiredimages</a></small>
</div> </div>