1
0
mirror of https://github.com/bitwarden/browser.git synced 2024-10-29 07:59:42 +01:00

ally title work

This commit is contained in:
Kyle Spearrin 2019-10-11 10:35:24 -04:00
parent 9ebd700317
commit 9c2f128585
79 changed files with 407 additions and 278 deletions

View File

@ -2,7 +2,8 @@
<div> <div>
<img src="../../images/logo-dark@2x.png" class="mb-4 logo" alt="Bitwarden"> <img src="../../images/logo-dark@2x.png" class="mb-4 logo" alt="Bitwarden">
<p class="text-center"> <p class="text-center">
<i class="fa fa-spinner fa-spin fa-2x text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin fa-2x text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</p> </p>
</div> </div>
</div> </div>

View File

@ -14,7 +14,7 @@
<div class="d-flex"> <div class="d-flex">
<button type="submit" class="btn btn-primary btn-block btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-block btn-submit" [disabled]="form.loading">
<span [hidden]="form.loading">{{'submit' | i18n}}</span> <span [hidden]="form.loading">{{'submit' | i18n}}</span>
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
</button> </button>
<a routerLink="/" class="btn btn-outline-secondary btn-block ml-2 mt-0"> <a routerLink="/" class="btn btn-outline-secondary btn-block ml-2 mt-0">
{{'cancel' | i18n}} {{'cancel' | i18n}}

View File

@ -13,9 +13,9 @@
<input id="masterPassword" type="{{showPassword ? 'text' : 'password'}}" <input id="masterPassword" type="{{showPassword ? 'text' : 'password'}}"
name="MasterPassword" class="text-monospace form-control" [(ngModel)]="masterPassword" name="MasterPassword" class="text-monospace form-control" [(ngModel)]="masterPassword"
required appAutofocus appInputVerbatim> required appAutofocus appInputVerbatim>
<button type="button" class="ml-1 btn btn-link" title="{{'toggleVisibility' | i18n}}" <button type="button" class="ml-1 btn btn-link" appA11yTitle="{{'toggleVisibility' | i18n}}"
(click)="togglePassword()"> (click)="togglePassword()">
<i class="fa fa-lg" <i class="fa fa-lg" aria-hidden="true"
[ngClass]="{'fa-eye': !showPassword, 'fa-eye-slash': showPassword}"></i> [ngClass]="{'fa-eye': !showPassword, 'fa-eye-slash': showPassword}"></i>
</button> </button>
</div> </div>

View File

@ -16,9 +16,9 @@
<input id="masterPassword" type="{{showPassword ? 'text' : 'password'}}" <input id="masterPassword" type="{{showPassword ? 'text' : 'password'}}"
name="MasterPassword" class="text-monospace form-control" [(ngModel)]="masterPassword" name="MasterPassword" class="text-monospace form-control" [(ngModel)]="masterPassword"
required appInputVerbatim> required appInputVerbatim>
<button type="button" class="ml-1 btn btn-link" title="{{'toggleVisibility' | i18n}}" <button type="button" class="ml-1 btn btn-link" appA11yTitle="{{'toggleVisibility' | i18n}}"
(click)="togglePassword()"> (click)="togglePassword()">
<i class="fa fa-lg" <i class="fa fa-lg" aria-hidden="true"
[ngClass]="{'fa-eye': !showPassword, 'fa-eye-slash': showPassword}"></i> [ngClass]="{'fa-eye': !showPassword, 'fa-eye-slash': showPassword}"></i>
</button> </button>
</div> </div>
@ -37,7 +37,7 @@
<span> <span>
<i class="fa fa-sign-in"></i> {{'logIn' | i18n}} <i class="fa fa-sign-in"></i> {{'logIn' | i18n}}
</span> </span>
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
</button> </button>
<a routerLink="/register" [queryParams]="{email: email}" <a routerLink="/register" [queryParams]="{email: email}"
class="btn btn-outline-secondary btn-block ml-2 mt-0"> class="btn btn-outline-secondary btn-block ml-2 mt-0">

View File

@ -14,7 +14,7 @@
<div class="d-flex"> <div class="d-flex">
<button type="submit" class="btn btn-primary btn-block btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-block btn-submit" [disabled]="form.loading">
<span>{{'submit' | i18n}}</span> <span>{{'submit' | i18n}}</span>
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
</button> </button>
<a routerLink="/" class="btn btn-outline-secondary btn-block ml-2 mt-0"> <a routerLink="/" class="btn btn-outline-secondary btn-block ml-2 mt-0">
{{'cancel' | i18n}} {{'cancel' | i18n}}

View File

@ -27,7 +27,7 @@
<div class="d-flex"> <div class="d-flex">
<button type="submit" class="btn btn-primary btn-block btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-block btn-submit" [disabled]="form.loading">
<span>{{'submit' | i18n}}</span> <span>{{'submit' | i18n}}</span>
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
</button> </button>
<a routerLink="/" class="btn btn-outline-secondary btn-block ml-2 mt-0"> <a routerLink="/" class="btn btn-outline-secondary btn-block ml-2 mt-0">
{{'cancel' | i18n}} {{'cancel' | i18n}}

View File

@ -32,9 +32,9 @@
</app-password-strength> </app-password-strength>
</div> </div>
<div> <div>
<button type="button" class="ml-1 btn btn-link" title="{{'toggleVisibility' | i18n}}" <button type="button" class="ml-1 btn btn-link"
(click)="togglePassword(false)"> appA11yTitle="{{'toggleVisibility' | i18n}}" (click)="togglePassword(false)">
<i class="fa fa-lg" <i class="fa fa-lg" aria-hidden="true"
[ngClass]="{'fa-eye': !showPassword, 'fa-eye-slash': showPassword}"></i> [ngClass]="{'fa-eye': !showPassword, 'fa-eye-slash': showPassword}"></i>
</button> </button>
<div class="progress-bar invisible"></div> <div class="progress-bar invisible"></div>
@ -48,9 +48,9 @@
<input id="masterPasswordRetype" type="{{showPassword ? 'text' : 'password'}}" <input id="masterPasswordRetype" type="{{showPassword ? 'text' : 'password'}}"
name="MasterPasswordRetype" class="text-monospace form-control" name="MasterPasswordRetype" class="text-monospace form-control"
[(ngModel)]="confirmMasterPassword" required appInputVerbatim> [(ngModel)]="confirmMasterPassword" required appInputVerbatim>
<button type="button" class="ml-1 btn btn-link" title="{{'toggleVisibility' | i18n}}" <button type="button" class="ml-1 btn btn-link" appA11yTitle="{{'toggleVisibility' | i18n}}"
(click)="togglePassword(true)"> (click)="togglePassword(true)">
<i class="fa fa-lg" <i class="fa fa-lg" aria-hidden="true"
[ngClass]="{'fa-eye': !showPassword, 'fa-eye-slash': showPassword}"></i> [ngClass]="{'fa-eye': !showPassword, 'fa-eye-slash': showPassword}"></i>
</button> </button>
</div> </div>
@ -64,7 +64,7 @@
<div class="d-flex mb-2"> <div class="d-flex mb-2">
<button type="submit" class="btn btn-primary btn-block btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-block btn-submit" [disabled]="form.loading">
<span>{{'submit' | i18n}}</span> <span>{{'submit' | i18n}}</span>
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
</button> </button>
<a routerLink="/" class="btn btn-outline-secondary btn-block ml-2 mt-0"> <a routerLink="/" class="btn btn-outline-secondary btn-block ml-2 mt-0">
{{'cancel' | i18n}} {{'cancel' | i18n}}

View File

@ -35,7 +35,9 @@
</ng-container> </ng-container>
<ng-container *ngIf="selectedProviderType === providerType.U2f"> <ng-container *ngIf="selectedProviderType === providerType.U2f">
<p class="text-center" *ngIf="!u2fReady"> <p class="text-center" *ngIf="!u2fReady">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"
aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</p> </p>
<ng-container *ngIf="u2fReady"> <ng-container *ngIf="u2fReady">
<p class="text-center">{{'insertU2f' | i18n}}</p> <p class="text-center">{{'insertU2f' | i18n}}</p>
@ -49,7 +51,7 @@
</div> </div>
</ng-container> </ng-container>
<i class="fa fa-spinner text-muted fa-spin pull-right" title="{{'loading' | i18n}}" <i class="fa fa-spinner text-muted fa-spin pull-right" title="{{'loading' | i18n}}"
*ngIf="form.loading && selectedProviderType === providerType.U2f"></i> *ngIf="form.loading && selectedProviderType === providerType.U2f" aria-hidden="true"></i>
<div class="form-check" *ngIf="selectedProviderType != null"> <div class="form-check" *ngIf="selectedProviderType != null">
<input id="remember" type="checkbox" name="Remember" class="form-check-input" <input id="remember" type="checkbox" name="Remember" class="form-check-input"
[(ngModel)]="remember"> [(ngModel)]="remember">
@ -67,7 +69,7 @@
<span> <span>
<i class="fa fa-sign-in"></i> {{'continue' | i18n}} <i class="fa fa-sign-in"></i> {{'continue' | i18n}}
</span> </span>
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
</button> </button>
<a routerLink="/" class="btn btn-outline-secondary btn-block ml-2 mt-0"> <a routerLink="/" class="btn btn-outline-secondary btn-block ml-2 mt-0">
{{'cancel' | i18n}} {{'cancel' | i18n}}

View File

@ -2,7 +2,8 @@
<div> <div>
<img src="../../images/logo-dark@2x.png" class="mb-4 logo" alt="Bitwarden"> <img src="../../images/logo-dark@2x.png" class="mb-4 logo" alt="Bitwarden">
<p class="text-center"> <p class="text-center">
<i class="fa fa-spinner fa-spin fa-2x text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin fa-2x text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</p> </p>
</div> </div>
</div> </div>

View File

@ -13,7 +13,7 @@
<div class="d-flex"> <div class="d-flex">
<button type="submit" class="btn btn-danger btn-block btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-danger btn-block btn-submit" [disabled]="form.loading">
<span>{{'deleteAccount' | i18n}}</span> <span>{{'deleteAccount' | i18n}}</span>
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
</button> </button>
<a routerLink="/" class="btn btn-outline-secondary btn-block ml-2 mt-0"> <a routerLink="/" class="btn btn-outline-secondary btn-block ml-2 mt-0">
{{'cancel' | i18n}} {{'cancel' | i18n}}

View File

@ -1,7 +1,7 @@
<nav class="navbar navbar-expand navbar-dark bg-primary" [ngClass]="{'bg-secondary-alt': selfHosted}"> <nav class="navbar navbar-expand navbar-dark bg-primary" [ngClass]="{'bg-secondary-alt': selfHosted}">
<div class="container"> <div class="container">
<a class="navbar-brand" routerLink="/" title="{{'pageTitle' | i18n : 'Bitwarden'}}"> <a class="navbar-brand" routerLink="/" appA11yTitle="{{'pageTitle' | i18n : 'Bitwarden'}}">
<i class="fa fa-shield"></i> <i class="fa fa-shield" aria-hidden="true"></i>
</a> </a>
<div class="collapse navbar-collapse"> <div class="collapse navbar-collapse">
<ul class="navbar-nav"> <ul class="navbar-nav">

View File

@ -8,7 +8,8 @@
</button> </button>
</div> </div>
<div class="modal-body" *ngIf="loading"> <div class="modal-body" *ngIf="loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</div> </div>
<div class="modal-body" *ngIf="!loading"> <div class="modal-body" *ngIf="!loading">
<div class="form-group"> <div class="form-group">
@ -51,8 +52,11 @@
</td> </td>
<td (click)="check(g)"> <td (click)="check(g)">
{{g.name}} {{g.name}}
<i class="fa fa-th text-muted fa-fw" *ngIf="g.accessAll" <ng-container *ngIf="g.accessAll">
title="This group can access all items"></i> <i class="fa fa-th text-muted fa-fw" title="{{'groupAccessAllItems' | i18n}}"
aria-hidden="true"></i>
<span class="sr-only">{{'groupAccessAllItems' | i18n}}</span>
</ng-container>
</td> </td>
<td class="text-center"> <td class="text-center">
<input type="checkbox" [(ngModel)]="g.readOnly" name="Groups[{{i}}].ReadOnly" <input type="checkbox" [(ngModel)]="g.readOnly" name="Groups[{{i}}].ReadOnly"
@ -65,18 +69,18 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'save' | i18n}}</span> <span>{{'save' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" <button type="button" class="btn btn-outline-secondary"
data-dismiss="modal">{{'cancel' | i18n}}</button> data-dismiss="modal">{{'cancel' | i18n}}</button>
<div class="ml-auto"> <div class="ml-auto">
<button #deleteBtn type="button" (click)="delete()" class="btn btn-outline-danger" <button #deleteBtn type="button" (click)="delete()" class="btn btn-outline-danger"
title="{{'delete' | i18n}}" *ngIf="editMode" [disabled]="deleteBtn.loading" appA11yTitle="{{'delete' | i18n}}" *ngIf="editMode" [disabled]="deleteBtn.loading"
[appApiAction]="deletePromise"> [appApiAction]="deletePromise">
<i class="fa fa-trash-o fa-lg fa-fw" [hidden]="deleteBtn.loading"></i> <i class="fa fa-trash-o fa-lg fa-fw" [hidden]="deleteBtn.loading" aria-hidden="true"></i>
<i class="fa fa-spinner fa-spin fa-lg fa-fw" [hidden]="!deleteBtn.loading" <i class="fa fa-spinner fa-spin fa-lg fa-fw" [hidden]="!deleteBtn.loading"
title="{{'loading' | i18n}}"></i> title="{{'loading' | i18n}}" aria-hidden="true"></i>
</button> </button>
</div> </div>
</div> </div>

View File

@ -11,7 +11,8 @@
</button> </button>
</div> </div>
<div class="modal-body" *ngIf="!loaded"> <div class="modal-body" *ngIf="!loaded">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</div> </div>
<div class="modal-body" *ngIf="loaded"> <div class="modal-body" *ngIf="loaded">
<div class="d-flex"> <div class="d-flex">
@ -50,10 +51,12 @@
<tr *ngFor="let e of events"> <tr *ngFor="let e of events">
<td>{{e.date | date:'medium'}}</td> <td>{{e.date | date:'medium'}}</td>
<td> <td>
<i class="text-muted fa fa-lg {{e.appIcon}}" title="{{e.appName}}, {{e.ip}}"></i> <i class="text-muted fa fa-lg {{e.appIcon}}" title="{{e.appName}}, {{e.ip}}"
aria-hidden="true"></i>
<span class="sr-only">{{e.appName}}, {{e.ip}}</span>
</td> </td>
<td *ngIf="showUser"> <td *ngIf="showUser">
<span title="{{e.userEmail}}">{{e.userName}}</span> <span appA11yTitle="{{e.userEmail}}">{{e.userName}}</span>
</td> </td>
<td [innerHTML]="e.message"></td> <td [innerHTML]="e.message"></td>
</tr> </tr>
@ -61,7 +64,7 @@
</table> </table>
<button #moreBtn [appApiAction]="morePromise" type="button" class="btn btn-block btn-link btn-submit" <button #moreBtn [appApiAction]="morePromise" type="button" class="btn btn-block btn-link btn-submit"
(click)="loadEvents(false)" [disabled]="loaded && moreBtn.loading" *ngIf="continuationToken"> (click)="loadEvents(false)" [disabled]="loaded && moreBtn.loading" *ngIf="continuationToken">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'loadMore' | i18n}}</span> <span>{{'loadMore' | i18n}}</span>
</button> </button>
</div> </div>

View File

@ -11,7 +11,8 @@
</button> </button>
</div> </div>
<div class="modal-body" *ngIf="loading || !users"> <div class="modal-body" *ngIf="loading || !users">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</div> </div>
<div class="modal-body" <div class="modal-body"
*ngIf="!loading && users && (users | search:searchText:'name':'email':'id') as searchedUsers"> *ngIf="!loading && users && (users | search:searchText:'name':'email':'id') as searchedUsers">
@ -72,7 +73,10 @@
<small class="text-muted d-block" *ngIf="u.name">{{u.name}}</small> <small class="text-muted d-block" *ngIf="u.name">{{u.name}}</small>
</td> </td>
<td *ngIf="entity === 'collection'"> <td *ngIf="entity === 'collection'">
<i class="fa fa-th" *ngIf="u.accessAll" title="{{'userAccessAllItems' | i18n}}"></i> <ng-container *ngIf="u.accessAll">
<i class="fa fa-th" title="{{'userAccessAllItems' | i18n}}"></i>
<span class="sr-only">{{'userAccessAllItems' | i18n}}</span>
</ng-container>
</td> </td>
<td> <td>
<span *ngIf="u.type === organizationUserType.Owner">{{'owner' | i18n}}</span> <span *ngIf="u.type === organizationUserType.Owner">{{'owner' | i18n}}</span>
@ -91,7 +95,7 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'save' | i18n}}</span> <span>{{'save' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{'close' | i18n}}</button> <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{'close' | i18n}}</button>

View File

@ -17,7 +17,10 @@
</button> </button>
</div> </div>
</div> </div>
<i class="fa fa-spinner fa-spin text-muted" *ngIf="!loaded" title="{{'loading' | i18n}}"></i> <ng-container *ngIf="!loaded">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</ng-container>
<ng-container *ngIf="loaded"> <ng-container *ngIf="loaded">
<p *ngIf="!events || !events.length">{{'noEventsInList' | i18n}}</p> <p *ngIf="!events || !events.length">{{'noEventsInList' | i18n}}</p>
<table class="table table-hover" *ngIf="events && events.length"> <table class="table table-hover" *ngIf="events && events.length">
@ -35,7 +38,8 @@
<tr *ngFor="let e of events"> <tr *ngFor="let e of events">
<td>{{e.date | date:'medium'}}</td> <td>{{e.date | date:'medium'}}</td>
<td> <td>
<i class="text-muted fa fa-lg {{e.appIcon}}" title="{{e.appName}}, {{e.ip}}"></i> <i class="text-muted fa fa-lg {{e.appIcon}}" title="{{e.appName}}, {{e.ip}}" aria-hidden="true"></i>
<span class="sr-only">{{e.appName}}, {{e.ip}}</span>
</td> </td>
<td> <td>
<span title="{{e.userEmail}}">{{e.userName}}</span> <span title="{{e.userEmail}}">{{e.userName}}</span>
@ -46,7 +50,7 @@
</table> </table>
<button #moreBtn [appApiAction]="morePromise" type="button" class="btn btn-block btn-link btn-submit" <button #moreBtn [appApiAction]="morePromise" type="button" class="btn btn-block btn-link btn-submit"
(click)="loadEvents(false)" [disabled]="loaded && moreBtn.loading" *ngIf="continuationToken"> (click)="loadEvents(false)" [disabled]="loaded && moreBtn.loading" *ngIf="continuationToken">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'loadMore' | i18n}}</span> <span>{{'loadMore' | i18n}}</span>
</button> </button>
</ng-container> </ng-container>

View File

@ -8,7 +8,8 @@
</button> </button>
</div> </div>
<div class="modal-body" *ngIf="loading"> <div class="modal-body" *ngIf="loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</div> </div>
<div class="modal-body" *ngIf="!loading"> <div class="modal-body" *ngIf="!loading">
<div class="form-group"> <div class="form-group">
@ -81,17 +82,17 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'save' | i18n}}</span> <span>{{'save' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" <button type="button" class="btn btn-outline-secondary"
data-dismiss="modal">{{'cancel' | i18n}}</button> data-dismiss="modal">{{'cancel' | i18n}}</button>
<div class="ml-auto"> <div class="ml-auto">
<button #deleteBtn type="button" (click)="delete()" class="btn btn-outline-danger" <button #deleteBtn type="button" (click)="delete()" class="btn btn-outline-danger"
title="{{'delete' | i18n}}" *ngIf="editMode" [disabled]="deleteBtn.loading" appA11yTitle="{{'delete' | i18n}}" *ngIf="editMode" [disabled]="deleteBtn.loading"
[appApiAction]="deletePromise"> [appApiAction]="deletePromise">
<i class="fa fa-trash-o fa-lg fa-fw" [hidden]="deleteBtn.loading"></i> <i class="fa fa-trash-o fa-lg fa-fw" [hidden]="deleteBtn.loading" aria-hidden="true"></i>
<i class="fa fa-spinner fa-spin fa-lg fa-fw" [hidden]="!deleteBtn.loading" <i class="fa fa-spinner fa-spin fa-lg fa-fw" [hidden]="!deleteBtn.loading" aria-hidden="true"
title="{{'loading' | i18n}}"></i> title="{{'loading' | i18n}}"></i>
</button> </button>
</div> </div>

View File

@ -12,7 +12,10 @@
</button> </button>
</div> </div>
</div> </div>
<i class="fa fa-spinner fa-spin text-muted" *ngIf="loading" title="{{'loading' | i18n}}"></i> <ng-container *ngIf="loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</ng-container>
<ng-container *ngIf="!loading && (groups | search:searchText:'name':'id') as searchedGroups"> <ng-container *ngIf="!loading && (groups | search:searchText:'name':'id') as searchedGroups">
<p *ngIf="!searchedGroups.length">{{'noGroupsInList' | i18n}}</p> <p *ngIf="!searchedGroups.length">{{'noGroupsInList' | i18n}}</p>
<table class="table table-hover table-list" *ngIf="searchedGroups.length"> <table class="table table-hover table-list" *ngIf="searchedGroups.length">

View File

@ -30,7 +30,10 @@
</button> </button>
</div> </div>
</div> </div>
<i class="fa fa-spinner fa-spin text-muted" *ngIf="loading" title="{{'loading' | i18n}}"></i> <ng-container *ngIf="loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</ng-container>
<ng-container *ngIf="!loading && (users | search:searchText:'name':'email':'id') as searchedUsers"> <ng-container *ngIf="!loading && (users | search:searchText:'name':'email':'id') as searchedUsers">
<p *ngIf="!searchedUsers.length">{{'noUsersInList' | i18n}}</p> <p *ngIf="!searchedUsers.length">{{'noUsersInList' | i18n}}</p>
<ng-container *ngIf="searchedUsers.length"> <ng-container *ngIf="searchedUsers.length">
@ -53,7 +56,10 @@
<small class="text-muted d-block" *ngIf="u.name">{{u.name}}</small> <small class="text-muted d-block" *ngIf="u.name">{{u.name}}</small>
</td> </td>
<td> <td>
<i class="fa fa-lock" *ngIf="u.twoFactorEnabled" title="{{'userUsingTwoStep' | i18n}}"></i> <ng-container *ngIf="u.twoFactorEnabled">
<i class="fa fa-lock" title="{{'userUsingTwoStep' | i18n}}"></i>
<span class="sr-only">{{'userUsingTwoStep' | i18n}}</span>
</ng-container>
</td> </td>
<td> <td>
<span *ngIf="u.type === organizationUserType.Owner">{{'owner' | i18n}}</span> <span *ngIf="u.type === organizationUserType.Owner">{{'owner' | i18n}}</span>

View File

@ -11,7 +11,8 @@
</button> </button>
</div> </div>
<div class="modal-body" *ngIf="loading"> <div class="modal-body" *ngIf="loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</div> </div>
<div class="modal-body" *ngIf="!loading"> <div class="modal-body" *ngIf="!loading">
<ng-container *ngIf="!editMode"> <ng-container *ngIf="!editMode">
@ -116,18 +117,18 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'save' | i18n}}</span> <span>{{'save' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" <button type="button" class="btn btn-outline-secondary"
data-dismiss="modal">{{'cancel' | i18n}}</button> data-dismiss="modal">{{'cancel' | i18n}}</button>
<div class="ml-auto"> <div class="ml-auto">
<button #deleteBtn type="button" (click)="delete()" class="btn btn-outline-danger" <button #deleteBtn type="button" (click)="delete()" class="btn btn-outline-danger"
title="{{'delete' | i18n}}" *ngIf="editMode" [disabled]="deleteBtn.loading" appA11yTitle="{{'delete' | i18n}}" *ngIf="editMode" [disabled]="deleteBtn.loading"
[appApiAction]="deletePromise"> [appApiAction]="deletePromise">
<i class="fa fa-trash-o fa-lg fa-fw" [hidden]="deleteBtn.loading"></i> <i class="fa fa-trash-o fa-lg fa-fw" [hidden]="deleteBtn.loading" aria-hidden="true"></i>
<i class="fa fa-spinner fa-spin fa-lg fa-fw" [hidden]="!deleteBtn.loading" <i class="fa fa-spinner fa-spin fa-lg fa-fw" [hidden]="!deleteBtn.loading"
title="{{'loading' | i18n}}"></i> title="{{'loading' | i18n}}" aria-hidden="true"></i>
</button> </button>
</div> </div>
</div> </div>

View File

@ -27,7 +27,7 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'confirm' | i18n}}</span> <span>{{'confirm' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" <button type="button" class="btn btn-outline-secondary"

View File

@ -11,7 +11,8 @@
</button> </button>
</div> </div>
<div class="modal-body" *ngIf="loading"> <div class="modal-body" *ngIf="loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</div> </div>
<div class="modal-body" *ngIf="!loading"> <div class="modal-body" *ngIf="!loading">
<p>{{'groupAccessUserDesc' | i18n}}</p> <p>{{'groupAccessUserDesc' | i18n}}</p>
@ -33,7 +34,7 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'save' | i18n}}</span> <span>{{'save' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" <button type="button" class="btn btn-outline-secondary"

View File

@ -2,7 +2,8 @@
<h1>{{'myOrganization' | i18n}}</h1> <h1>{{'myOrganization' | i18n}}</h1>
</div> </div>
<div *ngIf="loading"> <div *ngIf="loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</div> </div>
<form *ngIf="org && !loading" #form (ngSubmit)="submit()" [appApiAction]="formPromise" ngNativeValidate> <form *ngIf="org && !loading" #form (ngSubmit)="submit()" [appApiAction]="formPromise" ngNativeValidate>
<div class="row"> <div class="row">
@ -27,7 +28,7 @@
</div> </div>
</div> </div>
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'save' | i18n}}</span> <span>{{'save' | i18n}}</span>
</button> </button>
</form> </form>

View File

@ -1,6 +1,6 @@
<form #form class="card" (ngSubmit)="submit()" [appApiAction]="formPromise" ngNativeValidate> <form #form class="card" (ngSubmit)="submit()" [appApiAction]="formPromise" ngNativeValidate>
<div class="card-body"> <div class="card-body">
<button type="button" class="close" attr.aria-label="{{'cancel' | i18n}}" title="{{'cancel' | i18n}}" <button type="button" class="close" attr.aria-label="{{'cancel' | i18n}}" appA11yTitle="{{'cancel' | i18n}}"
(click)="cancel()"><span aria-hidden="true">&times;</span></button> (click)="cancel()"><span aria-hidden="true">&times;</span></button>
<h3 class="card-body-header">{{(add ? 'addSeats' : 'removeSeats') | i18n}}</h3> <h3 class="card-body-header">{{(add ? 'addSeats' : 'removeSeats') | i18n}}</h3>
<div class="row"> <div class="row">
@ -15,7 +15,7 @@
| currency:'$'}} /{{interval | i18n}} | currency:'$'}} /{{interval | i18n}}
</div> </div>
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'submit' | i18n}}</span> <span>{{'submit' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" (click)="cancel()"> <button type="button" class="btn btn-outline-secondary" (click)="cancel()">

View File

@ -38,7 +38,7 @@
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading" <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"
*ngIf="!clientSecret"> *ngIf="!clientSecret">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'viewApiKey' | i18n}}</span> <span>{{'viewApiKey' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{'close' | i18n}}</button> <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{'close' | i18n}}</button>

View File

@ -1,6 +1,6 @@
<div class="card card-org-plans"> <div class="card card-org-plans">
<div class="card-body"> <div class="card-body">
<button type="button" class="close" attr.aria-label="{{'cancel' | i18n}}" title="{{'cancel' | i18n}}" <button type="button" class="close" attr.aria-label="{{'cancel' | i18n}}" appA11yTitle="{{'cancel' | i18n}}"
(click)="cancel()"><span aria-hidden="true">&times;</span></button> (click)="cancel()"><span aria-hidden="true">&times;</span></button>
<h2 class="card-body-header">{{'changeBillingPlan' | i18n}}</h2> <h2 class="card-body-header">{{'changeBillingPlan' | i18n}}</h2>
<p class="mb-0">{{'changeBillingPlanUpgrade' | i18n}}</p> <p class="mb-0">{{'changeBillingPlanUpgrade' | i18n}}</p>

View File

@ -16,7 +16,7 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-danger btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-danger btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'deleteOrganization' | i18n}}</span> <span>{{'deleteOrganization' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{'close' | i18n}}</button> <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{'close' | i18n}}</button>

View File

@ -1,13 +1,13 @@
<form #form class="card" (ngSubmit)="submit()" [appApiAction]="formPromise" ngNativeValidate> <form #form class="card" (ngSubmit)="submit()" [appApiAction]="formPromise" ngNativeValidate>
<div class="card-body"> <div class="card-body">
<button type="button" class="close" attr.aria-label="{{'cancel' | i18n}}" title="{{'cancel' | i18n}}" <button type="button" class="close" attr.aria-label="{{'cancel' | i18n}}" appA11yTitle="{{'cancel' | i18n}}"
(click)="cancel()"><span aria-hidden="true">&times;</span></button> (click)="cancel()"><span aria-hidden="true">&times;</span></button>
<h3 class="card-body-header">{{'downloadLicense' | i18n}}</h3> <h3 class="card-body-header">{{'downloadLicense' | i18n}}</h3>
<div class="row"> <div class="row">
<div class="form-group col-6"> <div class="form-group col-6">
<div class="d-flex"> <div class="d-flex">
<label for="installationId">{{'enterInstallationId' | i18n}}</label> <label for="installationId">{{'enterInstallationId' | i18n}}</label>
<a class="ml-auto" target="_blank" rel="noopener" title="{{'learnMore' | i18n}}" <a class="ml-auto" target="_blank" rel="noopener" appA11yTitle="{{'learnMore' | i18n}}"
href="https://help.bitwarden.com/article/licensing-on-premise/#organization-account-sharing"> href="https://help.bitwarden.com/article/licensing-on-premise/#organization-account-sharing">
<i class="fa fa-question-circle-o"></i> <i class="fa fa-question-circle-o"></i>
</a> </a>
@ -17,7 +17,7 @@
</div> </div>
</div> </div>
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'submit' | i18n}}</span> <span>{{'submit' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" (click)="cancel()"> <button type="button" class="btn btn-outline-secondary" (click)="cancel()">

View File

@ -1,12 +1,16 @@
<div class="page-header"> <div class="page-header">
<h1> <h1>
{{'subscription' | i18n}} {{'subscription' | i18n}}
<small> <small *ngIf="firstLoaded && loading">
<i class="fa fa-spinner fa-spin text-muted" *ngIf="firstLoaded && loading" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</small> </small>
</h1> </h1>
</div> </div>
<i class="fa fa-spinner fa-spin text-muted" *ngIf="!firstLoaded && loading" title="{{'loading' | i18n}}"></i> <ng-container *ngIf="!firstLoaded && loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</ng-container>
<ng-container *ngIf="sub"> <ng-container *ngIf="sub">
<app-callout type="warning" title="{{'canceled' | i18n}}" *ngIf="subscription && subscription.cancelled"> <app-callout type="warning" title="{{'canceled' | i18n}}" *ngIf="subscription && subscription.cancelled">
{{'subscriptionCanceled' | i18n}}</app-callout> {{'subscriptionCanceled' | i18n}}</app-callout>
@ -14,7 +18,7 @@
<p>{{'subscriptionPendingCanceled' | i18n}}</p> <p>{{'subscriptionPendingCanceled' | i18n}}</p>
<button #reinstateBtn type="button" class="btn btn-outline-secondary btn-submit" (click)="reinstate()" <button #reinstateBtn type="button" class="btn btn-outline-secondary btn-submit" (click)="reinstate()"
[appApiAction]="reinstatePromise" [disabled]="reinstateBtn.loading"> [appApiAction]="reinstatePromise" [disabled]="reinstateBtn.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'reinstateSubscription' | i18n}}</span> <span>{{'reinstateSubscription' | i18n}}</span>
</button> </button>
</app-callout> </app-callout>
@ -77,7 +81,7 @@
</div> </div>
<div class="card mt-3" *ngIf="showUpdateLicense"> <div class="card mt-3" *ngIf="showUpdateLicense">
<div class="card-body"> <div class="card-body">
<button type="button" class="close" attr.aria-label="{{'cancel' | i18n}}" title="{{'cancel' | i18n}}" <button type="button" class="close" appA11yTitle="{{'cancel' | i18n}}"
(click)="closeUpdateLicense(false)"><span aria-hidden="true">&times;</span></button> (click)="closeUpdateLicense(false)"><span aria-hidden="true">&times;</span></button>
<h3 class="card-body-header">{{'updateLicense' | i18n}}</h3> <h3 class="card-body-header">{{'updateLicense' | i18n}}</h3>
<app-update-license [organizationId]="organizationId" (onUpdated)="closeUpdateLicense(true)" <app-update-license [organizationId]="organizationId" (onUpdated)="closeUpdateLicense(true)"
@ -97,7 +101,7 @@
<button #cancelBtn type="button" class="btn btn-outline-danger btn-submit ml-auto" (click)="cancel()" <button #cancelBtn type="button" class="btn btn-outline-danger btn-submit ml-auto" (click)="cancel()"
[appApiAction]="cancelPromise" [disabled]="cancelBtn.loading" [appApiAction]="cancelPromise" [disabled]="cancelBtn.loading"
*ngIf="subscription && !subscription.cancelled && !subscriptionMarkedForCancel"> *ngIf="subscription && !subscription.cancelled && !subscriptionMarkedForCancel">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'cancelSubscription' | i18n}}</span> <span>{{'cancelSubscription' | i18n}}</span>
</button> </button>
</div> </div>

View File

@ -38,7 +38,7 @@
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading" <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"
*ngIf="!clientSecret"> *ngIf="!clientSecret">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'rotateApiKey' | i18n}}</span> <span>{{'rotateApiKey' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{'close' | i18n}}</button> <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{'close' | i18n}}</button>

View File

@ -11,8 +11,11 @@
<h1> <h1>
{{'vault' | i18n}} {{'vault' | i18n}}
<small #actionSpinner [appApiAction]="ciphersComponent.actionPromise"> <small #actionSpinner [appApiAction]="ciphersComponent.actionPromise">
<i *ngIf="actionSpinner.loading" class="fa fa-spinner fa-spin text-muted" <ng-container *ngIf="actionSpinner.loading">
title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"
aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</ng-container>
</small> </small>
</h1> </h1>
<button type="button" class="btn btn-outline-primary btn-sm ml-auto" (click)="addCipher()"> <button type="button" class="btn btn-outline-primary btn-sm ml-auto" (click)="addCipher()">

View File

@ -1,7 +1,7 @@
<form #form class="card" (ngSubmit)="submit()" [appApiAction]="formPromise" ngNativeValidate> <form #form class="card" (ngSubmit)="submit()" [appApiAction]="formPromise" ngNativeValidate>
<div class="card-body"> <div class="card-body">
<button type="button" class="close" attr.aria-label="{{'cancel' | i18n}}" title="{{'cancel' | i18n}}" <button type="button" class="close" appA11yTitle="{{'cancel' | i18n}}" (click)="cancel()"><span
(click)="cancel()"><span aria-hidden="true">&times;</span></button> aria-hidden="true">&times;</span></button>
<h3 class="card-body-header">{{'addCredit' | i18n}}</h3> <h3 class="card-body-header">{{'addCredit' | i18n}}</h3>
<div class="mb-4 text-lg" *ngIf="showOptions"> <div class="mb-4 text-lg" *ngIf="showOptions">
<div class="form-check form-check-inline"> <div class="form-check form-check-inline">
@ -31,7 +31,7 @@
<small class="form-text text-muted">{{'creditDelayed' | i18n}}</small> <small class="form-text text-muted">{{'creditDelayed' | i18n}}</small>
</div> </div>
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading || ppLoading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading || ppLoading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'submit' | i18n}}</span> <span>{{'submit' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" (click)="cancel()"> <button type="button" class="btn btn-outline-secondary" (click)="cancel()">

View File

@ -1,11 +1,11 @@
<form #form class="card" (ngSubmit)="submit()" [appApiAction]="formPromise" ngNativeValidate> <form #form class="card" (ngSubmit)="submit()" [appApiAction]="formPromise" ngNativeValidate>
<div class="card-body"> <div class="card-body">
<button type="button" class="close" attr.aria-label="{{'cancel' | i18n}}" title="{{'cancel' | i18n}}" <button type="button" class="close" appA11yTitle="{{'cancel' | i18n}}" (click)="cancel()"><span
(click)="cancel()"><span aria-hidden="true">&times;</span></button> aria-hidden="true">&times;</span></button>
<h3 class="card-body-header">{{(currentType != null ? 'changePaymentMethod' : 'addPaymentMethod') | i18n}}</h3> <h3 class="card-body-header">{{(currentType != null ? 'changePaymentMethod' : 'addPaymentMethod') | i18n}}</h3>
<app-payment [hideBank]="!organizationId" [hideCredit]="true"></app-payment> <app-payment [hideBank]="!organizationId" [hideCredit]="true"></app-payment>
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'submit' | i18n}}</span> <span>{{'submit' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" (click)="cancel()"> <button type="button" class="btn btn-outline-secondary" (click)="cancel()">

View File

@ -1,7 +1,7 @@
<form #form class="card" (ngSubmit)="submit()" [appApiAction]="formPromise" ngNativeValidate> <form #form class="card" (ngSubmit)="submit()" [appApiAction]="formPromise" ngNativeValidate>
<div class="card-body"> <div class="card-body">
<button type="button" class="close" attr.aria-label="{{'cancel' | i18n}}" title="{{'cancel' | i18n}}" <button type="button" class="close" appA11yTitle="{{'cancel' | i18n}}" (click)="cancel()"><span
(click)="cancel()"><span aria-hidden="true">&times;</span></button> aria-hidden="true">&times;</span></button>
<h3 class="card-body-header">{{(add ? 'addStorage' : 'removeStorage') | i18n}}</h3> <h3 class="card-body-header">{{(add ? 'addStorage' : 'removeStorage') | i18n}}</h3>
<div class="row"> <div class="row">
<div class="form-group col-6"> <div class="form-group col-6">
@ -16,7 +16,7 @@
| currency:'$'}} /{{interval | i18n}} | currency:'$'}} /{{interval | i18n}}
</div> </div>
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'submit' | i18n}}</span> <span>{{'submit' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" (click)="cancel()"> <button type="button" class="btn btn-outline-secondary" (click)="cancel()">

View File

@ -28,7 +28,7 @@
</div> </div>
</ng-container> </ng-container>
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span *ngIf="!tokenSent">{{'continue' | i18n}}</span> <span *ngIf="!tokenSent">{{'continue' | i18n}}</span>
<span *ngIf="tokenSent">{{'changeEmail' | i18n}}</span> <span *ngIf="tokenSent">{{'changeEmail' | i18n}}</span>
</button> </button>

View File

@ -14,8 +14,8 @@
<div class="form-group mb-0"> <div class="form-group mb-0">
<label for="kdf">{{'kdfAlgorithm' | i18n}}</label> <label for="kdf">{{'kdfAlgorithm' | i18n}}</label>
<a class="ml-auto" href="https://en.wikipedia.org/wiki/Key_derivation_function" target="_blank" <a class="ml-auto" href="https://en.wikipedia.org/wiki/Key_derivation_function" target="_blank"
rel="noopener" title="{{'learnMore' | i18n}}"> rel="noopener" appA11yTitle="{{'learnMore' | i18n}}">
<i class="fa fa-question-circle-o"></i> <i class="fa fa-question-circle-o" aria-hidden="true"></i>
</a> </a>
<select id="kdf" name="Kdf" [(ngModel)]="kdf" class="form-control" required> <select id="kdf" name="Kdf" [(ngModel)]="kdf" class="form-control" required>
<option *ngFor="let o of kdfOptions" [ngValue]="o.value">{{o.name}}</option> <option *ngFor="let o of kdfOptions" [ngValue]="o.value">{{o.name}}</option>
@ -26,8 +26,8 @@
<div class="form-group mb-0"> <div class="form-group mb-0">
<label for="kdfIterations">{{'kdfIterations' | i18n}}</label> <label for="kdfIterations">{{'kdfIterations' | i18n}}</label>
<a class="ml-auto" href="https://en.wikipedia.org/wiki/PBKDF2" target="_blank" rel="noopener" <a class="ml-auto" href="https://en.wikipedia.org/wiki/PBKDF2" target="_blank" rel="noopener"
title="{{'learnMore' | i18n}}"> appA11yTitle="{{'learnMore' | i18n}}">
<i class="fa fa-question-circle-o"></i> <i class="fa fa-question-circle-o" aria-hidden="true"></i>
</a> </a>
<input id="kdfIterations" type="number" min="5000" max="2000000" name="KdfIterations" <input id="kdfIterations" type="number" min="5000" max="2000000" name="KdfIterations"
class="form-control" [(ngModel)]="kdfIterations" required> class="form-control" [(ngModel)]="kdfIterations" required>
@ -43,7 +43,7 @@
</div> </div>
</div> </div>
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'changeKdf' | i18n}}</span> <span>{{'changeKdf' | i18n}}</span>
</button> </button>
</form> </form>

View File

@ -36,13 +36,13 @@
{{'rotateAccountEncKey' | i18n}} {{'rotateAccountEncKey' | i18n}}
</label> </label>
<a href="https://help.bitwarden.com/article/change-your-master-password/#rotating-your-accounts-encryption-key" <a href="https://help.bitwarden.com/article/change-your-master-password/#rotating-your-accounts-encryption-key"
target="_blank" rel="noopener" title="{{'learnMore' | i18n}}"> target="_blank" rel="noopener" appA11yTitle="{{'learnMore' | i18n}}">
<i class="fa fa-question-circle-o"></i> <i class="fa fa-question-circle-o" aria-hidden="true"></i>
</a> </a>
</div> </div>
</div> </div>
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'changeMasterPassword' | i18n}}</span> <span>{{'changeMasterPassword' | i18n}}</span>
</button> </button>
</form> </form>

View File

@ -16,7 +16,7 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-danger btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-danger btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'deauthorizeSessions' | i18n}}</span> <span>{{'deauthorizeSessions' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{'close' | i18n}}</button> <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{'close' | i18n}}</button>

View File

@ -16,7 +16,7 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-danger btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-danger btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'deleteAccount' | i18n}}</span> <span>{{'deleteAccount' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{'close' | i18n}}</button> <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{'close' | i18n}}</button>

View File

@ -5,7 +5,8 @@
<form #form (ngSubmit)="submit()" [appApiAction]="formPromise" ngNativeValidate> <form #form (ngSubmit)="submit()" [appApiAction]="formPromise" ngNativeValidate>
<h2>{{'customEqDomains' | i18n}}</h2> <h2>{{'customEqDomains' | i18n}}</h2>
<p *ngIf="loading"> <p *ngIf="loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</p> </p>
<ng-container *ngIf="!loading"> <ng-container *ngIf="!loading">
<div class="form-group d-flex" *ngFor="let d of custom; let i = index; trackBy: indexTrackBy"> <div class="form-group d-flex" *ngFor="let d of custom; let i = index; trackBy: indexTrackBy">
@ -14,8 +15,9 @@
<textarea class="form-control" name="CustomDomain[{{i}}]" id="customDomain_{{i}}" <textarea class="form-control" name="CustomDomain[{{i}}]" id="customDomain_{{i}}"
[(ngModel)]="custom[i]" placeholder="{{'ex' | i18n}} google.com, gmail.com" required></textarea> [(ngModel)]="custom[i]" placeholder="{{'ex' | i18n}} google.com, gmail.com" required></textarea>
</div> </div>
<button type="button" class="btn btn-link text-danger ml-2" (click)="remove(i)" title="{{'remove' | i18n}}"> <button type="button" class="btn btn-link text-danger ml-2" (click)="remove(i)"
<i class="fa fa-minus-circle fa-lg"></i> appA11yTitle="{{'remove' | i18n}}">
<i class="fa fa-minus-circle fa-lg" aria-hidden="true"></i>
</button> </button>
</div> </div>
<button type="button" (click)="add()" class="btn btn-outline-secondary btn-sm mb-2"> <button type="button" (click)="add()" class="btn btn-outline-secondary btn-sm mb-2">
@ -24,12 +26,13 @@
<small class="text-muted d-block mb-3">{{'newCustomDomainDesc' | i18n}}</small> <small class="text-muted d-block mb-3">{{'newCustomDomainDesc' | i18n}}</small>
</ng-container> </ng-container>
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'save' | i18n}}</span> <span>{{'save' | i18n}}</span>
</button> </button>
<h2 class="spaced-header">{{'globalEqDomains' | i18n}}</h2> <h2 class="spaced-header">{{'globalEqDomains' | i18n}}</h2>
<p *ngIf="loading"> <p *ngIf="loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</p> </p>
<table class="table table-hover table-list" *ngIf="!loading && global.length > 0"> <table class="table table-hover table-list" *ngIf="!loading && global.length > 0">
<tbody> <tbody>
@ -63,7 +66,7 @@
</tbody> </tbody>
</table> </table>
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'save' | i18n}}</span> <span>{{'save' | i18n}}</span>
</button> </button>
</form> </form>

View File

@ -20,8 +20,8 @@
<div class="d-flex"> <div class="d-flex">
<label for="locale">{{'language' | i18n}}</label> <label for="locale">{{'language' | i18n}}</label>
<a class="ml-auto" href="https://help.bitwarden.com/article/localization/" target="_blank" <a class="ml-auto" href="https://help.bitwarden.com/article/localization/" target="_blank"
rel="noopener" title="{{'learnMore' | i18n}}"> rel="noopener" appA11yTitle="{{'learnMore' | i18n}}">
<i class="fa fa-question-circle-o"></i> <i class="fa fa-question-circle-o" aria-hidden="true"></i>
</a> </a>
</div> </div>
<select id="locale" name="Locale" [(ngModel)]="locale" class="form-control"> <select id="locale" name="Locale" [(ngModel)]="locale" class="form-control">
@ -39,8 +39,8 @@
{{'disableIcons' | i18n}} {{'disableIcons' | i18n}}
</label> </label>
<a href="https://help.bitwarden.com/article/website-icons/" target="_blank" rel="noopener" <a href="https://help.bitwarden.com/article/website-icons/" target="_blank" rel="noopener"
title="{{'learnMore' | i18n}}"> appA11yTitle="{{'learnMore' | i18n}}">
<i class="fa fa-question-circle-o"></i> <i class="fa fa-question-circle-o" aria-hidden="true"></i>
</a> </a>
</div> </div>
<small class="form-text text-muted">{{'disableIconsDesc' | i18n}}</small> <small class="form-text text-muted">{{'disableIconsDesc' | i18n}}</small>
@ -52,8 +52,8 @@
<label class="form-check-label" for="enableGravatars"> <label class="form-check-label" for="enableGravatars">
{{'enableGravatars' | i18n}} {{'enableGravatars' | i18n}}
</label> </label>
<a href="https://gravatar.com/" target="_blank" rel="noopener" title="{{'learnMore' | i18n}}"> <a href="https://gravatar.com/" target="_blank" rel="noopener" appA11yTitle="{{'learnMore' | i18n}}">
<i class="fa fa-question-circle-o"></i> <i class="fa fa-question-circle-o" aria-hidden="true"></i>
</a> </a>
</div> </div>
<small class="form-text text-muted">{{'enableGravatarsDesc' | i18n}}</small> <small class="form-text text-muted">{{'enableGravatarsDesc' | i18n}}</small>

View File

@ -1,14 +1,18 @@
<ng-container *ngIf="vault"> <ng-container *ngIf="vault">
<p *ngIf="!loaded" class="text-muted"> <p *ngIf="!loaded" class="text-muted">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</p> </p>
<ng-container *ngIf="loaded"> <ng-container *ngIf="loaded">
<ul class="fa-ul card-ul carets" *ngIf="organizations && organizations.length"> <ul class="fa-ul card-ul carets" *ngIf="organizations && organizations.length">
<li *ngFor="let o of organizations"> <li *ngFor="let o of organizations">
<a [routerLink]="['/organizations', o.id]" class="text-body"> <a [routerLink]="['/organizations', o.id]" class="text-body">
<i class="fa-li fa fa-caret-right"></i> {{o.name}} <i class="fa-li fa fa-caret-right" aria-hidden="true"></i> {{o.name}}
<i *ngIf="!o.enabled" class="fa fa-exclamation-triangle text-danger" <ng-container *ngIf="!o.enabled">
title="{{'organizationIsDisabled' | i18n}}"></i> <i class="fa fa-exclamation-triangle text-danger" title="{{'organizationIsDisabled' | i18n}}"
aria-hidden="true"></i>
<span class="sr-only">{{'organizationIsDisabled' | i18n}}</span>
</ng-container>
</a> </a>
</li> </li>
</ul> </ul>
@ -24,7 +28,10 @@
<h1> <h1>
{{'organizations' | i18n}} {{'organizations' | i18n}}
<small [appApiAction]="actionPromise" #action> <small [appApiAction]="actionPromise" #action>
<i class="fa fa-spinner fa-spin text-muted" *ngIf="action.loading" title="{{'loading' | i18n}}"></i> <ng-container *ngIf="action.loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</ng-container>
</small> </small>
</h1> </h1>
<a href="#" routerLink="/settings/create-organization" class="btn btn-sm btn-outline-primary ml-auto" <a href="#" routerLink="/settings/create-organization" class="btn btn-sm btn-outline-primary ml-auto"
@ -33,7 +40,10 @@
{{'newOrganization' | i18n}} {{'newOrganization' | i18n}}
</a> </a>
</div> </div>
<i class="fa fa-spinner fa-spin text-muted" *ngIf="!loaded" title="{{'loading' | i18n}}"></i> <ng-container *ngIf="!loaded">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</ng-container>
<ng-container *ngIf="loaded"> <ng-container *ngIf="loaded">
<ng-container *ngIf="!organizations || !organizations.length"> <ng-container *ngIf="!organizations || !organizations.length">
<p>{{'noOrganizationsList' | i18n}}</p> <p>{{'noOrganizationsList' | i18n}}</p>
@ -50,8 +60,11 @@
</td> </td>
<td> <td>
<a href="#" [routerLink]="['/organizations', o.id]">{{o.name}}</a> <a href="#" [routerLink]="['/organizations', o.id]">{{o.name}}</a>
<i *ngIf="!o.enabled" class="fa fa-exclamation-triangle text-danger" <ng-container *ngIf="!o.enabled">
title="{{'organizationIsDisabled' | i18n}}"></i> <i class="fa fa-exclamation-triangle text-danger"
title="{{'organizationIsDisabled' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'organizationIsDisabled' | i18n}}</span>
</ng-container>
</td> </td>
<td class="table-list-options"> <td class="table-list-options">
<div class="dropdown" appListDropdown> <div class="dropdown" appListDropdown>

View File

@ -42,8 +42,8 @@
<label for="stripe-card-cvc-element" class="d-flex"> <label for="stripe-card-cvc-element" class="d-flex">
{{'securityCode' | i18n}} {{'securityCode' | i18n}}
<a href="https://www.cvvnumber.com/cvv.html" tabindex="-1" target="_blank" rel="noopener noreferrer" <a href="https://www.cvvnumber.com/cvv.html" tabindex="-1" target="_blank" rel="noopener noreferrer"
class="ml-auto" title="{{'learnMore' | i18n}}"> class="ml-auto" appA11yTitle="{{'learnMore' | i18n}}">
<i class="fa fa-question-circle-o"></i> <i class="fa fa-question-circle-o" aria-hidden="true"></i>
</a> </a>
</label> </label>
<div id="stripe-card-cvc-element" class="form-control stripe-form-control"></div> <div id="stripe-card-cvc-element" class="form-control stripe-form-control"></div>

View File

@ -47,7 +47,7 @@
<small class="form-text text-muted">{{'licenseFileDesc' | i18n : 'bitwarden_premium_license.json'}}</small> <small class="form-text text-muted">{{'licenseFileDesc' | i18n : 'bitwarden_premium_license.json'}}</small>
</div> </div>
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'submit' | i18n}}</span> <span>{{'submit' | i18n}}</span>
</button> </button>
</form> </form>
@ -76,7 +76,7 @@
<h2 class="spaced-header mb-4">{{'paymentInformation' | i18n}}</h2> <h2 class="spaced-header mb-4">{{'paymentInformation' | i18n}}</h2>
<app-payment [hideBank]="true"></app-payment> <app-payment [hideBank]="true"></app-payment>
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'submit' | i18n}}</span> <span>{{'submit' | i18n}}</span>
</button> </button>
</form> </form>

View File

@ -1,5 +1,6 @@
<div *ngIf="loading"> <div *ngIf="loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</div> </div>
<form *ngIf="profile && !loading" #form (ngSubmit)="submit()" [appApiAction]="formPromise" ngNativeValidate> <form *ngIf="profile && !loading" #form (ngSubmit)="submit()" [appApiAction]="formPromise" ngNativeValidate>
<div class="row"> <div class="row">
@ -27,14 +28,14 @@
<p *ngIf="fingerprint"> <p *ngIf="fingerprint">
{{'yourAccountsFingerprint' | i18n}}: {{'yourAccountsFingerprint' | i18n}}:
<a href="https://help.bitwarden.com/article/fingerprint-phrase/" target="_blank" rel="noopener" <a href="https://help.bitwarden.com/article/fingerprint-phrase/" target="_blank" rel="noopener"
title="{{'learnMore' | i18n}}"> appA11yTitle="{{'learnMore' | i18n}}">
<i class="fa fa-question-circle-o"></i></a><br> <i class="fa fa-question-circle-o" aria-hidden="true"></i></a><br>
<code>{{fingerprint}}</code> <code>{{fingerprint}}</code>
</p> </p>
</div> </div>
</div> </div>
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'save' | i18n}}</span> <span>{{'save' | i18n}}</span>
</button> </button>
</form> </form>

View File

@ -16,7 +16,7 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-danger btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-danger btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'purgeVault' | i18n}}</span> <span>{{'purgeVault' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{'close' | i18n}}</button> <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{'close' | i18n}}</button>

View File

@ -54,7 +54,7 @@
<hr *ngIf="enabled"> <hr *ngIf="enabled">
<p class="text-center" [ngClass]="{'mb-0': enabled}"> <p class="text-center" [ngClass]="{'mb-0': enabled}">
<canvas id="qr"></canvas><br> <canvas id="qr"></canvas><br>
<code title="{{'key' | i18n}}">{{key}}</code> <code appA11yTitle="{{'key' | i18n}}">{{key}}</code>
</p> </p>
<ng-container *ngIf="!enabled"> <ng-container *ngIf="!enabled">
<label for="token">3. {{'twoStepAuthenticatorEnterCode' | i18n}}</label> <label for="token">3. {{'twoStepAuthenticatorEnterCode' | i18n}}</label>
@ -64,7 +64,7 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span *ngIf="!enabled">{{'enable' | i18n}}</span> <span *ngIf="!enabled">{{'enable' | i18n}}</span>
<span *ngIf="enabled">{{'disable' | i18n}}</span> <span *ngIf="enabled">{{'disable' | i18n}}</span>
</button> </button>

View File

@ -49,7 +49,7 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span *ngIf="!enabled">{{'enable' | i18n}}</span> <span *ngIf="!enabled">{{'enable' | i18n}}</span>
<span *ngIf="enabled">{{'disable' | i18n}}</span> <span *ngIf="enabled">{{'disable' | i18n}}</span>
</button> </button>

View File

@ -35,7 +35,7 @@
<button #sendBtn type="button" <button #sendBtn type="button"
class="btn btn-outline-primary btn-sm btn-submit align-self-start" (click)="sendEmail()" class="btn btn-outline-primary btn-sm btn-submit align-self-start" (click)="sendEmail()"
[appApiAction]="emailPromise" [disabled]="sendBtn.loading"> [appApiAction]="emailPromise" [disabled]="sendBtn.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'sendEmail' | i18n}}</span> <span>{{'sendEmail' | i18n}}</span>
</button> </button>
<span class="text-success ml-3" *ngIf="sentEmail"> <span class="text-success ml-3" *ngIf="sentEmail">
@ -51,7 +51,7 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span *ngIf="!enabled">{{'enable' | i18n}}</span> <span *ngIf="!enabled">{{'enable' | i18n}}</span>
<span *ngIf="enabled">{{'disable' | i18n}}</span> <span *ngIf="enabled">{{'disable' | i18n}}</span>
</button> </button>

View File

@ -11,7 +11,8 @@
<h2 [ngClass]="{'mt-5':!organizationId}"> <h2 [ngClass]="{'mt-5':!organizationId}">
{{'providers' | i18n}} {{'providers' | i18n}}
<small *ngIf="loading"> <small *ngIf="loading">
<i class="fa fa-spinner fa-spin fa-fw text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin fa-fw text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</small> </small>
</h2> </h2>
<ul class="list-group list-group-2fa"> <ul class="list-group list-group-2fa">
@ -22,8 +23,10 @@
<div class="mx-4"> <div class="mx-4">
<h3 class="mb-0"> <h3 class="mb-0">
{{p.name}} {{p.name}}
<i class="fa fa-check text-success fa-fw" *ngIf="p.enabled && canAccessPremium" <ng-container *ngIf="p.enabled && canAccessPremium">
title="{{'enabled' | i18n}}"></i> <i class="fa fa-check text-success fa-fw" title="{{'enabled' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'enabled' | i18n}}</span>
</ng-container>
<a href="#" appStopClick class="badge badge-primary" *ngIf="!canAccessPremium && p.premium" <a href="#" appStopClick class="badge badge-primary" *ngIf="!canAccessPremium && p.premium"
(click)="premiumRequired()"> (click)="premiumRequired()">
{{'premium' | i18n}} {{'premium' | i18n}}

View File

@ -30,13 +30,21 @@
<i class="fa-li fa fa-key"></i> <i class="fa-li fa fa-key"></i>
<strong *ngIf="!k.configured || !k.name">{{'u2fkeyX' | i18n : i + 1}}</strong> <strong *ngIf="!k.configured || !k.name">{{'u2fkeyX' | i18n : i + 1}}</strong>
<strong *ngIf="k.configured && k.name">{{k.name}}</strong> <strong *ngIf="k.configured && k.name">{{k.name}}</strong>
<i class="fa fa-fw" <ng-container *ngIf="k.configured && !removeKeyBtn.loading">
[ngClass]="{'fa-check text-success': !k.compromised, 'fa-exclamation-triangle text-warning': k.compromised}" <ng-container *ngIf="k.compromised">
*ngIf="k.configured && !removeKeyBtn.loading" <i class="fa fa-fw fa-exclamation-triangle text-warning" aria-hidden="true"
title="{{(k.compromised ? 'keyCompromised' : 'enabled') | i18n}}"></i> title="{{'keyCompromised' | i18n}}"></i>
<span class="sr-only">{{'keyCompromised' | i18n}}</span>
</ng-container>
<ng-container *ngIf="!k.compromised">
<i class="fa fa-fw fa-check text-success" aria-hidden="true"
title="{{'enabled' | i18n}}"></i>
<span class="sr-only">{{'enabled' | i18n}}</span>
</ng-container>
</ng-container>
<ng-container *ngIf="keysConfiguredCount > 1 && k.configured"> <ng-container *ngIf="keysConfiguredCount > 1 && k.configured">
<i class="fa fa-spin fa-spinner text-muted fa-fw" title="{{'loading' | i18n}}" <i class="fa fa-spin fa-spinner text-muted fa-fw" title="{{'loading' | i18n}}"
*ngIf="removeKeyBtn.loading"></i> *ngIf="removeKeyBtn.loading" aria-hidden="true"></i>
- -
<a href="#" appStopClick (click)="remove(k)">{{'remove' | i18n}}</a> <a href="#" appStopClick (click)="remove(k)">{{'remove' | i18n}}</a>
</ng-container> </ng-container>
@ -82,13 +90,14 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary" [disabled]="form.loading || !u2fResponse"> <button type="submit" class="btn btn-primary" [disabled]="form.loading || !u2fResponse">
<i class="fa fa-spinner fa-spin" *ngIf="form.loading" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" *ngIf="form.loading" title="{{'loading' | i18n}}"
aria-hidden="true"></i>
<span *ngIf="!form.loading">{{'save' | i18n}}</span> <span *ngIf="!form.loading">{{'save' | i18n}}</span>
</button> </button>
<button #disableBtn type="button" class="btn btn-outline-secondary btn-submit" <button #disableBtn type="button" class="btn btn-outline-secondary btn-submit"
[appApiAction]="disablePromise" [disabled]="disableBtn.loading" (click)="disable()" [appApiAction]="disablePromise" [disabled]="disableBtn.loading" (click)="disable()"
*ngIf="enabled"> *ngIf="enabled">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'disableAllKeys' | i18n}}</span> <span>{{'disableAllKeys' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" <button type="button" class="btn btn-outline-secondary"

View File

@ -7,7 +7,7 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'continue' | i18n}}</span> <span>{{'continue' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{'close' | i18n}}</button> <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{'close' | i18n}}</button>

View File

@ -43,8 +43,8 @@
<div class="d-flex" *ngIf="k.existingKey"> <div class="d-flex" *ngIf="k.existingKey">
<span class="mr-2">{{k.existingKey}}</span> <span class="mr-2">{{k.existingKey}}</span>
<button type="button" class="btn btn-link text-danger ml-auto" (click)="remove(k)" <button type="button" class="btn btn-link text-danger ml-auto" (click)="remove(k)"
title="{{'remove' | i18n}}"> appA11yTitle="{{'remove' | i18n}}">
<i class="fa fa-minus-circle fa-lg"></i> <i class="fa fa-minus-circle fa-lg" aria-hidden="true"></i>
</button> </button>
</div> </div>
</div> </div>
@ -58,13 +58,13 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'save' | i18n}}</span> <span>{{'save' | i18n}}</span>
</button> </button>
<button #disableBtn type="button" class="btn btn-outline-secondary btn-submit" <button #disableBtn type="button" class="btn btn-outline-secondary btn-submit"
[appApiAction]="disablePromise" [disabled]="disableBtn.loading" (click)="disable()" [appApiAction]="disablePromise" [disabled]="disableBtn.loading" (click)="disable()"
*ngIf="enabled"> *ngIf="enabled">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'disableAllKeys' | i18n}}</span> <span>{{'disableAllKeys' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" <button type="button" class="btn btn-outline-secondary"

View File

@ -19,7 +19,7 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'updateEncryptionKey' | i18n}}</span> <span>{{'updateEncryptionKey' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{'close' | i18n}}</button> <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{'close' | i18n}}</button>

View File

@ -6,7 +6,7 @@
class="form-text text-muted">{{'licenseFileDesc' | i18n : (!organizationId ? 'bitwarden_premium_license.json' : 'bitwarden_organization_license.json')}}</small> class="form-text text-muted">{{'licenseFileDesc' | i18n : (!organizationId ? 'bitwarden_premium_license.json' : 'bitwarden_organization_license.json')}}</small>
</div> </div>
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'submit' | i18n}}</span> <span>{{'submit' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" (click)="cancel()"> <button type="button" class="btn btn-outline-secondary" (click)="cancel()">

View File

@ -7,7 +7,10 @@
{{'refresh' | i18n}} {{'refresh' | i18n}}
</button> </button>
</div> </div>
<i class="fa fa-spinner fa-spin text-muted" *ngIf="!firstLoaded && loading" title="{{'loading' | i18n}}"></i> <ng-container *ngIf="!firstLoaded && loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</ng-container>
<ng-container *ngIf="billing"> <ng-container *ngIf="billing">
<h2>{{(isCreditBalance ? 'accountCredit' : 'accountBalance') | i18n}}</h2> <h2>{{(isCreditBalance ? 'accountCredit' : 'accountBalance') | i18n}}</h2>
<p class="text-lg"><strong>{{creditOrBalance | currency:'$'}}</strong></p> <p class="text-lg"><strong>{{creditOrBalance | currency:'$'}}</strong></p>
@ -43,7 +46,7 @@
[(ngModel)]="verifyAmount2" min="1" max="99" step="1" required> [(ngModel)]="verifyAmount2" min="1" max="99" step="1" required>
</div> </div>
<button type="submit" class="btn btn-outline-primary btn-submit" [disabled]="verifyForm.loading"> <button type="submit" class="btn btn-outline-primary btn-submit" [disabled]="verifyForm.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'verifyBankAccount' | i18n}}</span> <span>{{'verifyBankAccount' | i18n}}</span>
</button> </button>
</form> </form>
@ -73,8 +76,8 @@
<td>{{i.date | date:'mediumDate'}}</td> <td>{{i.date | date:'mediumDate'}}</td>
<td> <td>
<a href="{{i.pdfUrl}}" target="_blank" rel="noopener" class="mr-2" <a href="{{i.pdfUrl}}" target="_blank" rel="noopener" class="mr-2"
title="{{'downloadInvoice' | i18n}}"> appA11yTitle="{{'downloadInvoice' | i18n}}">
<i class="fa fa-file-pdf-o"></i></a> <i class="fa fa-file-pdf-o" aria-hidden="true"></i></a>
<a href="{{i.url}}" target="_blank" rel="noopener" title="{{'viewInvoice' | i18n}}"> <a href="{{i.url}}" target="_blank" rel="noopener" title="{{'viewInvoice' | i18n}}">
{{'invoiceNumber' | i18n : i.number}}</a> {{'invoiceNumber' | i18n : i.number}}</a>
</td> </td>

View File

@ -1,12 +1,16 @@
<div class="page-header"> <div class="page-header">
<h1> <h1>
{{'premiumMembership' | i18n}} {{'premiumMembership' | i18n}}
<small> <small *ngIf="firstLoaded && loading">
<i class="fa fa-spinner fa-spin text-muted" *ngIf="firstLoaded && loading" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</small> </small>
</h1> </h1>
</div> </div>
<i class="fa fa-spinner fa-spin text-muted" *ngIf="!firstLoaded && loading" title="{{'loading' | i18n}}"></i> <ng-container *ngIf="!firstLoaded && loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</ng-container>
<ng-container *ngIf="sub"> <ng-container *ngIf="sub">
<app-callout type="warning" title="{{'canceled' | i18n}}" *ngIf="subscription && subscription.cancelled"> <app-callout type="warning" title="{{'canceled' | i18n}}" *ngIf="subscription && subscription.cancelled">
{{'subscriptionCanceled' | i18n}}</app-callout> {{'subscriptionCanceled' | i18n}}</app-callout>
@ -14,7 +18,7 @@
<p>{{'subscriptionPendingCanceled' | i18n}}</p> <p>{{'subscriptionPendingCanceled' | i18n}}</p>
<button #reinstateBtn type="button" class="btn btn-outline-secondary btn-submit" (click)="reinstate()" <button #reinstateBtn type="button" class="btn btn-outline-secondary btn-submit" (click)="reinstate()"
[appApiAction]="reinstatePromise" [disabled]="reinstateBtn.loading"> [appApiAction]="reinstatePromise" [disabled]="reinstateBtn.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'reinstateSubscription' | i18n}}</span> <span>{{'reinstateSubscription' | i18n}}</span>
</button> </button>
</app-callout> </app-callout>
@ -66,7 +70,7 @@
</div> </div>
<div class="card mt-3" *ngIf="showUpdateLicense"> <div class="card mt-3" *ngIf="showUpdateLicense">
<div class="card-body"> <div class="card-body">
<button type="button" class="close" attr.aria-label="{{'cancel' | i18n}}" title="{{'cancel' | i18n}}" <button type="button" class="close" appA11yTitle="{{'cancel' | i18n}}"
(click)="closeUpdateLicense(false)"><span aria-hidden="true">&times;</span></button> (click)="closeUpdateLicense(false)"><span aria-hidden="true">&times;</span></button>
<h3 class="card-body-header">{{'updateLicense' | i18n}}</h3> <h3 class="card-body-header">{{'updateLicense' | i18n}}</h3>
<app-update-license (onUpdated)="closeUpdateLicense(true)" (onCanceled)="closeUpdateLicense(false)"> <app-update-license (onUpdated)="closeUpdateLicense(true)" (onCanceled)="closeUpdateLicense(false)">
@ -83,7 +87,7 @@
<button #cancelBtn type="button" class="btn btn-outline-danger btn-submit ml-auto" (click)="cancel()" <button #cancelBtn type="button" class="btn btn-outline-danger btn-submit ml-auto" (click)="cancel()"
[appApiAction]="cancelPromise" [disabled]="cancelBtn.loading" [appApiAction]="cancelPromise" [disabled]="cancelBtn.loading"
*ngIf="subscription && !subscription.cancelled && !subscriptionMarkedForCancel"> *ngIf="subscription && !subscription.cancelled && !subscriptionMarkedForCancel">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'cancelSubscription' | i18n}}</span> <span>{{'cancelSubscription' | i18n}}</span>
</button> </button>
</div> </div>

View File

@ -1,12 +1,12 @@
<div class="card border-warning"> <div class="card border-warning">
<div class="card-header bg-warning text-white"> <div class="card-header bg-warning text-white">
<i class="fa fa-envelope-o fa-fw"></i> {{'verifyEmail' | i18n}} <i class="fa fa-envelope-o fa-fw" aria-hidden="true"></i> {{'verifyEmail' | i18n}}
</div> </div>
<div class="card-body"> <div class="card-body">
<p>{{'verifyEmailDesc' | i18n}}</p> <p>{{'verifyEmailDesc' | i18n}}</p>
<button type="button" class="btn btn-block btn-outline-secondary btn-submit" #sendBtn <button type="button" class="btn btn-block btn-outline-secondary btn-submit" #sendBtn
[appApiAction]="actionPromise" [disabled]="sendBtn.loading" (click)="send()"> [appApiAction]="actionPromise" [disabled]="sendBtn.loading" (click)="send()">
<i class="fa fa-spin fa-spinner" title="{{'loading' | i18n}}"></i> <i class="fa fa-spin fa-spinner" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span> <span>
{{'sendEmail' | i18n}} {{'sendEmail' | i18n}}
</span> </span>

View File

@ -11,7 +11,7 @@
</div> </div>
</div> </div>
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'checkBreaches' | i18n}}</span> <span>{{'checkBreaches' | i18n}}</span>
</button> </button>
</form> </form>

View File

@ -21,7 +21,7 @@
</div> </div>
</div> </div>
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'exportVault' | i18n}}</span> <span>{{'exportVault' | i18n}}</span>
</button> </button>
</form> </form>

View File

@ -3,7 +3,7 @@
</div> </div>
<p>{{'exposedPasswordsReportDesc' | i18n}}</p> <p>{{'exposedPasswordsReportDesc' | i18n}}</p>
<button type="button" class="btn btn-primary btn-submit" [disabled]="loading" (click)="load()"> <button type="button" class="btn btn-primary btn-submit" [disabled]="loading" (click)="load()">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'checkExposedPasswords' | i18n}}</span> <span>{{'checkExposedPasswords' | i18n}}</span>
</button> </button>
<div class="mt-4" *ngIf="hasLoaded"> <div class="mt-4" *ngIf="hasLoaded">
@ -22,9 +22,15 @@
</td> </td>
<td class="reduced-lh wrap"> <td class="reduced-lh wrap">
<a href="#" appStopClick (click)="selectCipher(c)" title="{{'editItem' | i18n}}">{{c.name}}</a> <a href="#" appStopClick (click)="selectCipher(c)" title="{{'editItem' | i18n}}">{{c.name}}</a>
<i class="fa fa-share-alt" *ngIf="!organization && c.organizationId" <ng-container *ngIf="!organization && c.organizationId">
title="{{'shared' | i18n}}"></i> <i class="fa fa-share-alt" appStopProp title="{{'shared' | i18n}}" aria-hidden="true"></i>
<i class="fa fa-paperclip" title="{{'attachments' | i18n}}" *ngIf="c.hasAttachments"></i> <span class="sr-only">{{'shared' | i18n}}</span>
</ng-container>
<ng-container *ngIf="c.hasAttachments">
<i class="fa fa-paperclip" appStopProp title="{{'attachments' | i18n}}"
aria-hidden="true"></i>
<span class="sr-only">{{'attachments' | i18n}}</span>
</ng-container>
<br> <br>
<small>{{c.subTitle}}</small> <small>{{c.subTitle}}</small>
</td> </td>

View File

@ -261,7 +261,7 @@
<textarea id="fileContents" class="form-control" name="FileContents" [(ngModel)]="fileContents"></textarea> <textarea id="fileContents" class="form-control" name="FileContents" [(ngModel)]="fileContents"></textarea>
</div> </div>
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'importData' | i18n}}</span> <span>{{'importData' | i18n}}</span>
</button> </button>
</form> </form>

View File

@ -2,13 +2,15 @@
<h1> <h1>
{{'inactive2faReport' | i18n}} {{'inactive2faReport' | i18n}}
<small *ngIf="hasLoaded && loading"> <small *ngIf="hasLoaded && loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</small> </small>
</h1> </h1>
</div> </div>
<p>{{'inactive2faReportDesc' | i18n}}</p> <p>{{'inactive2faReportDesc' | i18n}}</p>
<div *ngIf="!hasLoaded && loading"> <div *ngIf="!hasLoaded && loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</div> </div>
<div class="mt-4" *ngIf="hasLoaded"> <div class="mt-4" *ngIf="hasLoaded">
<app-callout type="success" title="{{'goodNews' | i18n}}" *ngIf="!ciphers.length"> <app-callout type="success" title="{{'goodNews' | i18n}}" *ngIf="!ciphers.length">
@ -26,9 +28,15 @@
</td> </td>
<td class="reduced-lh wrap"> <td class="reduced-lh wrap">
<a href="#" appStopClick (click)="selectCipher(c)" title="{{'editItem' | i18n}}">{{c.name}}</a> <a href="#" appStopClick (click)="selectCipher(c)" title="{{'editItem' | i18n}}">{{c.name}}</a>
<i class="fa fa-share-alt" *ngIf="!organization && c.organizationId" <ng-container *ngIf="!organization && c.organizationId">
title="{{'shared' | i18n}}"></i> <i class="fa fa-share-alt" appStopProp title="{{'shared' | i18n}}" aria-hidden="true"></i>
<i class="fa fa-paperclip" title="{{'attachments' | i18n}}" *ngIf="c.hasAttachments"></i> <span class="sr-only">{{'shared' | i18n}}</span>
</ng-container>
<ng-container *ngIf="c.hasAttachments">
<i class="fa fa-paperclip" appStopProp title="{{'attachments' | i18n}}"
aria-hidden="true"></i>
<span class="sr-only">{{'attachments' | i18n}}</span>
</ng-container>
<br> <br>
<small>{{c.subTitle}}</small> <small>{{c.subTitle}}</small>
</td> </td>

View File

@ -15,8 +15,9 @@
<small class="text-muted">{{h.date | date:'medium'}}</small> <small class="text-muted">{{h.date | date:'medium'}}</small>
</div> </div>
<div class="ml-auto"> <div class="ml-auto">
<button class="btn btn-link" title="{{'copyPassword' | i18n}}" (click)="copy(h.password)"> <button class="btn btn-link" appA11yTitle="{{'copyPassword' | i18n}}"
<i class="fa fa-lg fa-clipboard"></i> (click)="copy(h.password)">
<i class="fa fa-lg fa-clipboard" aria-hidden="true"></i>
</button> </button>
</div> </div>
</li> </li>
@ -25,12 +26,13 @@
{{'noPasswordsInList' | i18n}} {{'noPasswordsInList' | i18n}}
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal" title="{{'close' | i18n}}"> <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">
{{'close' | i18n}} {{'close' | i18n}}
</button> </button>
<div class="ml-auto"> <div class="ml-auto">
<button type="button" (click)="clear()" class="btn btn-outline-danger" title="{{'clear' | i18n}}"> <button type="button" (click)="clear()" class="btn btn-outline-danger"
<i class="fa fa-trash-o fa-lg fa-fw"></i> appA11yTitle="{{'clear' | i18n}}">
<i class="fa fa-trash-o fa-lg fa-fw" aria-hidden="true"></i>
</button> </button>
</div> </div>
</div> </div>

View File

@ -101,8 +101,8 @@
</div> </div>
<div class="ml-auto"> <div class="ml-auto">
<button type="button" class="btn btn-outline-secondary" (click)="history()" <button type="button" class="btn btn-outline-secondary" (click)="history()"
title="{{'passwordHistory' | i18n}}"> appA11yTitle="{{'passwordHistory' | i18n}}">
<i class="fa fa-clock-o fa-lg"></i> <i class="fa fa-clock-o fa-lg" aria-hidden="true"></i>
</button> </button>
</div> </div>
</div> </div>

View File

@ -2,13 +2,15 @@
<h1> <h1>
{{'reusedPasswordsReport' | i18n}} {{'reusedPasswordsReport' | i18n}}
<small *ngIf="hasLoaded && loading"> <small *ngIf="hasLoaded && loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</small> </small>
</h1> </h1>
</div> </div>
<p>{{'reusedPasswordsReportDesc' | i18n}}</p> <p>{{'reusedPasswordsReportDesc' | i18n}}</p>
<div *ngIf="!hasLoaded && loading"> <div *ngIf="!hasLoaded && loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</div> </div>
<div class="mt-4" *ngIf="hasLoaded"> <div class="mt-4" *ngIf="hasLoaded">
<app-callout type="success" title="{{'goodNews' | i18n}}" *ngIf="!ciphers.length"> <app-callout type="success" title="{{'goodNews' | i18n}}" *ngIf="!ciphers.length">
@ -26,9 +28,15 @@
</td> </td>
<td class="reduced-lh wrap"> <td class="reduced-lh wrap">
<a href="#" appStopClick (click)="selectCipher(c)" title="{{'editItem' | i18n}}">{{c.name}}</a> <a href="#" appStopClick (click)="selectCipher(c)" title="{{'editItem' | i18n}}">{{c.name}}</a>
<i class="fa fa-share-alt" *ngIf="!organization && c.organizationId" <ng-container *ngIf="!organization && c.organizationId">
title="{{'shared' | i18n}}"></i> <i class="fa fa-share-alt" appStopProp title="{{'shared' | i18n}}" aria-hidden="true"></i>
<i class="fa fa-paperclip" title="{{'attachments' | i18n}}" *ngIf="c.hasAttachments"></i> <span class="sr-only">{{'shared' | i18n}}</span>
</ng-container>
<ng-container *ngIf="c.hasAttachments">
<i class="fa fa-paperclip" appStopProp title="{{'attachments' | i18n}}"
aria-hidden="true"></i>
<span class="sr-only">{{'attachments' | i18n}}</span>
</ng-container>
<br> <br>
<small>{{c.subTitle}}</small> <small>{{c.subTitle}}</small>
</td> </td>

View File

@ -2,13 +2,15 @@
<h1> <h1>
{{'unsecuredWebsitesReport' | i18n}} {{'unsecuredWebsitesReport' | i18n}}
<small *ngIf="hasLoaded && loading"> <small *ngIf="hasLoaded && loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</small> </small>
</h1> </h1>
</div> </div>
<p>{{'unsecuredWebsitesReportDesc' | i18n}}</p> <p>{{'unsecuredWebsitesReportDesc' | i18n}}</p>
<div *ngIf="!hasLoaded && loading"> <div *ngIf="!hasLoaded && loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</div> </div>
<div class="mt-4" *ngIf="hasLoaded"> <div class="mt-4" *ngIf="hasLoaded">
<app-callout type="success" title="{{'goodNews' | i18n}}" *ngIf="!ciphers.length"> <app-callout type="success" title="{{'goodNews' | i18n}}" *ngIf="!ciphers.length">
@ -26,9 +28,15 @@
</td> </td>
<td class="reduced-lh wrap"> <td class="reduced-lh wrap">
<a href="#" appStopClick (click)="selectCipher(c)" title="{{'editItem' | i18n}}">{{c.name}}</a> <a href="#" appStopClick (click)="selectCipher(c)" title="{{'editItem' | i18n}}">{{c.name}}</a>
<i class="fa fa-share-alt" *ngIf="!organization && c.organizationId" <ng-container *ngIf="!organization && c.organizationId">
title="{{'shared' | i18n}}"></i> <i class="fa fa-share-alt" appStopProp title="{{'shared' | i18n}}" aria-hidden="true"></i>
<i class="fa fa-paperclip" title="{{'attachments' | i18n}}" *ngIf="c.hasAttachments"></i> <span class="sr-only">{{'shared' | i18n}}</span>
</ng-container>
<ng-container *ngIf="c.hasAttachments">
<i class="fa fa-paperclip" appStopProp title="{{'attachments' | i18n}}"
aria-hidden="true"></i>
<span class="sr-only">{{'attachments' | i18n}}</span>
</ng-container>
<br> <br>
<small>{{c.subTitle}}</small> <small>{{c.subTitle}}</small>
</td> </td>

View File

@ -2,13 +2,15 @@
<h1> <h1>
{{'weakPasswordsReport' | i18n}} {{'weakPasswordsReport' | i18n}}
<small *ngIf="hasLoaded && loading"> <small *ngIf="hasLoaded && loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</small> </small>
</h1> </h1>
</div> </div>
<p>{{'weakPasswordsReportDesc' | i18n}}</p> <p>{{'weakPasswordsReportDesc' | i18n}}</p>
<div *ngIf="!hasLoaded && loading"> <div *ngIf="!hasLoaded && loading">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</div> </div>
<div class="mt-4" *ngIf="hasLoaded"> <div class="mt-4" *ngIf="hasLoaded">
<app-callout type="success" title="{{'goodNews' | i18n}}" *ngIf="!ciphers.length"> <app-callout type="success" title="{{'goodNews' | i18n}}" *ngIf="!ciphers.length">
@ -26,9 +28,15 @@
</td> </td>
<td class="reduced-lh wrap"> <td class="reduced-lh wrap">
<a href="#" appStopClick (click)="selectCipher(c)" title="{{'editItem' | i18n}}">{{c.name}}</a> <a href="#" appStopClick (click)="selectCipher(c)" title="{{'editItem' | i18n}}">{{c.name}}</a>
<i class="fa fa-share-alt" *ngIf="!organization && c.organizationId" <ng-container *ngIf="!organization && c.organizationId">
title="{{'shared' | i18n}}"></i> <i class="fa fa-share-alt" appStopProp title="{{'shared' | i18n}}" aria-hidden="true"></i>
<i class="fa fa-paperclip" title="{{'attachments' | i18n}}" *ngIf="c.hasAttachments"></i> <span class="sr-only">{{'shared' | i18n}}</span>
</ng-container>
<ng-container *ngIf="c.hasAttachments">
<i class="fa fa-paperclip" appStopProp title="{{'attachments' | i18n}}"
aria-hidden="true"></i>
<span class="sr-only">{{'attachments' | i18n}}</span>
</ng-container>
<br> <br>
<small>{{c.subTitle}}</small> <small>{{c.subTitle}}</small>
</td> </td>

View File

@ -40,9 +40,9 @@
[(ngModel)]="cipher.login.username" appInputVerbatim> [(ngModel)]="cipher.login.username" appInputVerbatim>
<div class="input-group-append"> <div class="input-group-append">
<button type="button" class="btn btn-outline-secondary" <button type="button" class="btn btn-outline-secondary"
title="{{'copyUsername' | i18n}}" appA11yTitle="{{'copyUsername' | i18n}}"
(click)="copy(cipher.login.username, 'username', 'Username')" tabindex="-1"> (click)="copy(cipher.login.username, 'username', 'Username')" tabindex="-1">
<i class="fa fa-lg fa-clipboard"></i> <i class="fa fa-lg fa-clipboard" aria-hidden="true"></i>
</button> </button>
</div> </div>
</div> </div>
@ -51,16 +51,16 @@
<div class="d-flex"> <div class="d-flex">
<label for="loginPassword">{{'password' | i18n}}</label> <label for="loginPassword">{{'password' | i18n}}</label>
<div class="ml-auto d-flex"> <div class="ml-auto d-flex">
<a href="#" class="d-block mr-2" appStopClick title="{{'generatePassword' | i18n}}" <a href="#" class="d-block mr-2" appStopClick
(click)="generatePassword()"> appA11yTitle="{{'generatePassword' | i18n}}" (click)="generatePassword()">
<i class="fa fa-lg fa-fw fa-refresh"></i> <i class="fa fa-lg fa-fw fa-refresh" aria-hidden="true"></i>
</a> </a>
<a href="#" class="d-block" #checkPasswordBtn appStopClick <a href="#" class="d-block" #checkPasswordBtn appStopClick
title="{{'checkPassword' | i18n}}" (click)="checkPassword()" appA11yTitle="{{'checkPassword' | i18n}}" (click)="checkPassword()"
[appApiAction]="checkPasswordPromise"> [appApiAction]="checkPasswordPromise">
<i class="fa fa-lg fa-fw fa-check-circle" <i class="fa fa-lg fa-fw fa-check-circle" [hidden]="checkPasswordBtn.loading"
[hidden]="checkPasswordBtn.loading"></i> aria-hidden="true"></i>
<i class="fa fa-lg fa-fw fa-spinner fa-spin" <i class="fa fa-lg fa-fw fa-spinner fa-spin" aria-hidden="true"
[hidden]="!checkPasswordBtn.loading" title="{{'loading' | i18n}}"></i> [hidden]="!checkPasswordBtn.loading" title="{{'loading' | i18n}}"></i>
</a> </a>
</div> </div>
@ -71,14 +71,15 @@
[(ngModel)]="cipher.login.password" appInputVerbatim autocomplete="new-password"> [(ngModel)]="cipher.login.password" appInputVerbatim autocomplete="new-password">
<div class="input-group-append"> <div class="input-group-append">
<button type="button" class="btn btn-outline-secondary" <button type="button" class="btn btn-outline-secondary"
title="{{'toggleVisibility' | i18n}}" (click)="togglePassword()" tabindex="-1"> appA11yTitle="{{'toggleVisibility' | i18n}}" (click)="togglePassword()"
<i class="fa fa-lg" tabindex="-1">
<i class="fa fa-lg" aria-hidden="true"
[ngClass]="{'fa-eye': !showPassword, 'fa-eye-slash': showPassword}"></i> [ngClass]="{'fa-eye': !showPassword, 'fa-eye-slash': showPassword}"></i>
</button> </button>
<button type="button" class="btn btn-outline-secondary" <button type="button" class="btn btn-outline-secondary"
title="{{'copyPassword' | i18n}}" appA11yTitle="{{'copyPassword' | i18n}}"
(click)="copy(cipher.login.password, 'password', 'Password')" tabindex="-1"> (click)="copy(cipher.login.password, 'password', 'Password')" tabindex="-1">
<i class="fa fa-lg fa-clipboard"></i> <i class="fa fa-lg fa-clipboard" aria-hidden="true"></i>
</button> </button>
</div> </div>
</div> </div>
@ -117,9 +118,10 @@
</span> </span>
<span class="totp-code mr-2" <span class="totp-code mr-2"
title="{{'verificationCodeTotp' | i18n}}">{{totpCodeFormatted}}</span> title="{{'verificationCodeTotp' | i18n}}">{{totpCodeFormatted}}</span>
<button type="button" class="btn btn-link" title="{{'copyVerificationCode' | i18n}}" <button type="button" class="btn btn-link"
appA11yTitle="{{'copyVerificationCode' | i18n}}"
(click)="copy(totpCode, 'verificationCodeTotp', 'TOTP')"> (click)="copy(totpCode, 'verificationCodeTotp', 'TOTP')">
<i class="fa fa-clipboard"></i> <i class="fa fa-clipboard" aria-hidden="true"></i>
</button> </button>
</div> </div>
</div> </div>
@ -134,14 +136,14 @@
placeholder="{{'ex' | i18n}} https://google.com" appInputVerbatim> placeholder="{{'ex' | i18n}} https://google.com" appInputVerbatim>
<div class="input-group-append"> <div class="input-group-append">
<button type="button" class="btn btn-outline-secondary" <button type="button" class="btn btn-outline-secondary"
title="{{'launch' | i18n}}" (click)="launch(u)" [disabled]="!u.canLaunch" appA11yTitle="{{'launch' | i18n}}" (click)="launch(u)"
tabindex="-1"> [disabled]="!u.canLaunch" tabindex="-1">
<i class="fa fa-lg fa-share"></i> <i class="fa fa-lg fa-share" aria-hidden="true"></i>
</button> </button>
<button type="button" class="btn btn-outline-secondary" <button type="button" class="btn btn-outline-secondary"
title="{{'copyUri' | i18n}}" (click)="copy(u.uri, 'uri', 'URI')" appA11yTitle="{{'copyUri' | i18n}}" (click)="copy(u.uri, 'uri', 'URI')"
tabindex="-1"> tabindex="-1">
<i class="fa fa-lg fa-clipboard"></i> <i class="fa fa-lg fa-clipboard" aria-hidden="true"></i>
</button> </button>
</div> </div>
</div> </div>
@ -152,8 +154,8 @@
{{'matchDetection' | i18n}} {{'matchDetection' | i18n}}
</label> </label>
<a class="ml-auto" href="https://help.bitwarden.com/article/uri-match-detection/" <a class="ml-auto" href="https://help.bitwarden.com/article/uri-match-detection/"
target="_blank" rel="noopener" title="{{'learnMore' | i18n}}"> target="_blank" rel="noopener" appA11yTitle="{{'learnMore' | i18n}}">
<i class="fa fa-question-circle-o"></i> <i class="fa fa-question-circle-o" aria-hidden="true"></i>
</a> </a>
</div> </div>
<div class="d-flex"> <div class="d-flex">
@ -163,8 +165,8 @@
</option> </option>
</select> </select>
<button type="button" class="btn btn-link text-danger ml-2" (click)="removeUri(u)" <button type="button" class="btn btn-link text-danger ml-2" (click)="removeUri(u)"
title="{{'remove' | i18n}}"> appA11yTitle="{{'remove' | i18n}}">
<i class="fa fa-minus-circle fa-lg"></i> <i class="fa fa-minus-circle fa-lg" aria-hidden="true"></i>
</button> </button>
</div> </div>
</div> </div>
@ -198,9 +200,9 @@
[(ngModel)]="cipher.card.number" appInputVerbatim> [(ngModel)]="cipher.card.number" appInputVerbatim>
<div class="input-group-append"> <div class="input-group-append">
<button type="button" class="btn btn-outline-secondary" <button type="button" class="btn btn-outline-secondary"
title="{{'copyNumber' | i18n}}" appA11yTitle="{{'copyNumber' | i18n}}"
(click)="copy(cipher.card.number, 'number', 'Number')" tabindex="-1"> (click)="copy(cipher.card.number, 'number', 'Number')" tabindex="-1">
<i class="fa fa-lg fa-clipboard"></i> <i class="fa fa-lg fa-clipboard" aria-hidden="true"></i>
</button> </button>
</div> </div>
</div> </div>
@ -227,14 +229,15 @@
[(ngModel)]="cipher.card.code" appInputVerbatim autocomplete="new-password"> [(ngModel)]="cipher.card.code" appInputVerbatim autocomplete="new-password">
<div class="input-group-append"> <div class="input-group-append">
<button type="button" class="btn btn-outline-secondary" <button type="button" class="btn btn-outline-secondary"
title="{{'toggleVisibility' | i18n}}" (click)="toggleCardCode()" tabindex="-1"> appA11yTitle="{{'toggleVisibility' | i18n}}" (click)="toggleCardCode()"
<i class="fa fa-lg" tabindex="-1">
<i class="fa fa-lg" aria-hidden="true"
[ngClass]="{'fa-eye': !showCardCode, 'fa-eye-slash': showCardCode}"></i> [ngClass]="{'fa-eye': !showCardCode, 'fa-eye-slash': showCardCode}"></i>
</button> </button>
<button type="button" class="btn btn-outline-secondary" <button type="button" class="btn btn-outline-secondary"
title="{{'securityCode' | i18n}}" appA11yTitle="{{'securityCode' | i18n}}"
(click)="copy(cipher.card.code, 'securityCode', 'Security Code')" tabindex="-1"> (click)="copy(cipher.card.code, 'securityCode', 'Security Code')" tabindex="-1">
<i class="fa fa-lg fa-clipboard"></i> <i class="fa fa-lg fa-clipboard" aria-hidden="true"></i>
</button> </button>
</div> </div>
</div> </div>
@ -366,8 +369,8 @@
<div class="d-flex"> <div class="d-flex">
<label for="fieldName{{i}}">{{'name' | i18n}}</label> <label for="fieldName{{i}}">{{'name' | i18n}}</label>
<a class="ml-auto" href="https://help.bitwarden.com/article/custom-fields/" <a class="ml-auto" href="https://help.bitwarden.com/article/custom-fields/"
target="_blank" rel="noopener" title="{{'learnMore' | i18n}}"> target="_blank" rel="noopener" appA11yTitle="{{'learnMore' | i18n}}">
<i class="fa fa-question-circle-o"></i> <i class="fa fa-question-circle-o" aria-hidden="true"></i>
</a> </a>
</div> </div>
<input id="fieldName{{i}}" type="text" name="Field.Name{{i}}" [(ngModel)]="f.name" <input id="fieldName{{i}}" type="text" name="Field.Name{{i}}" [(ngModel)]="f.name"
@ -381,9 +384,9 @@
[(ngModel)]="f.value" appInputVerbatim> [(ngModel)]="f.value" appInputVerbatim>
<div class="input-group-append"> <div class="input-group-append">
<button type="button" class="btn btn-outline-secondary" <button type="button" class="btn btn-outline-secondary"
title="{{'copyValue' | i18n}}" (click)="copy(f.value, 'value', 'Field')" appA11yTitle="{{'copyValue' | i18n}}"
tabindex="-1"> (click)="copy(f.value, 'value', 'Field')" tabindex="-1">
<i class="fa fa-lg fa-clipboard"></i> <i class="fa fa-lg fa-clipboard" aria-hidden="true"></i>
</button> </button>
</div> </div>
</div> </div>
@ -394,17 +397,17 @@
autocomplete="new-password"> autocomplete="new-password">
<div class="input-group-append"> <div class="input-group-append">
<button type="button" class="btn btn-outline-secondary" <button type="button" class="btn btn-outline-secondary"
title="{{'toggleVisibility' | i18n}}" (click)="toggleFieldValue(f)" appA11yTitle="{{'toggleVisibility' | i18n}}" (click)="toggleFieldValue(f)"
tabindex="-1"> tabindex="-1">
<i class="fa fa-lg" <i class="fa fa-lg" aria-hidden="true"
[ngClass]="{'fa-eye': !f.showValue, 'fa-eye-slash': f.showValue}"> [ngClass]="{'fa-eye': !f.showValue, 'fa-eye-slash': f.showValue}">
</i> </i>
</button> </button>
<button type="button" class="btn btn-outline-secondary" <button type="button" class="btn btn-outline-secondary"
title="{{'copyValue' | i18n}}" appA11yTitle="{{'copyValue' | i18n}}"
(click)="copy(f.value, 'value', f.type === fieldType.Hidden ? 'H_Field' : 'Field')" (click)="copy(f.value, 'value', f.type === fieldType.Hidden ? 'H_Field' : 'Field')"
tabindex="-1"> tabindex="-1">
<i class="fa fa-lg fa-clipboard"></i> <i class="fa fa-lg fa-clipboard" aria-hidden="true"></i>
</button> </button>
</div> </div>
</div> </div>
@ -414,12 +417,12 @@
trueValue="true" falseValue="false"> trueValue="true" falseValue="false">
</div> </div>
<button type="button" class="btn btn-link text-danger ml-2" (click)="removeField(f)" <button type="button" class="btn btn-link text-danger ml-2" (click)="removeField(f)"
title="{{'remove' | i18n}}"> appA11yTitle="{{'remove' | i18n}}">
<i class="fa fa-minus-circle fa-lg"></i> <i class="fa fa-minus-circle fa-lg" aria-hidden="true"></i>
</button> </button>
<button type="button" class="btn btn-link text-muted cursor-move" <button type="button" class="btn btn-link text-muted cursor-move"
title="{{'dragToSort' | i18n}}"> appA11yTitle="{{'dragToSort' | i18n}}">
<i class="fa fa-bars fa-lg"></i> <i class="fa fa-bars fa-lg" aria-hidden="true"></i>
</button> </button>
</div> </div>
</div> </div>
@ -488,7 +491,7 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'save' | i18n}}</span> <span>{{'save' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal"> <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">
@ -496,15 +499,16 @@
</button> </button>
<div class="ml-auto" *ngIf="cipher"> <div class="ml-auto" *ngIf="cipher">
<button *ngIf="!organization" type="button" (click)="toggleFavorite()" class="btn btn-link" <button *ngIf="!organization" type="button" (click)="toggleFavorite()" class="btn btn-link"
title="{{(cipher.favorite ? 'unfavorite' : 'favorite') | i18n}}"> appA11yTitle="{{(cipher.favorite ? 'unfavorite' : 'favorite') | i18n}}">
<i class="fa fa-lg" [ngClass]="{'fa-star': cipher.favorite, 'fa-star-o': !cipher.favorite}"></i> <i class="fa fa-lg" [ngClass]="{'fa-star': cipher.favorite, 'fa-star-o': !cipher.favorite}"
aria-hidden="true"></i>
</button> </button>
<button #deleteBtn type="button" (click)="delete()" class="btn btn-outline-danger" <button #deleteBtn type="button" (click)="delete()" class="btn btn-outline-danger"
title="{{'delete' | i18n}}" *ngIf="editMode" [disabled]="deleteBtn.loading" appA11yTitle="{{'delete' | i18n}}" *ngIf="editMode" [disabled]="deleteBtn.loading"
[appApiAction]="deletePromise"> [appApiAction]="deletePromise">
<i class="fa fa-trash-o fa-lg fa-fw" [hidden]="deleteBtn.loading"></i> <i class="fa fa-trash-o fa-lg fa-fw" [hidden]="deleteBtn.loading" aria-hidden="true"></i>
<i class="fa fa-spinner fa-spin fa-lg fa-fw" [hidden]="!deleteBtn.loading" <i class="fa fa-spinner fa-spin fa-lg fa-fw" [hidden]="!deleteBtn.loading"
title="{{'loading' | i18n}}"></i> title="{{'loading' | i18n}}" aria-hidden="true"></i>
</button> </button>
</div> </div>
</div> </div>

View File

@ -25,7 +25,8 @@
<a href="https://help.bitwarden.com/article/attachments/#fixing-old-attachments" <a href="https://help.bitwarden.com/article/attachments/#fixing-old-attachments"
target="_blank" rel="noopener"> target="_blank" rel="noopener">
<i class="fa fa-exclamation-triangle text-warning" <i class="fa fa-exclamation-triangle text-warning"
title="{{'attachmentFixDesc' | i18n}}"></i></a> title="{{'attachmentFixDesc' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'attachmentFixDesc' | i18n}}</span></a>
<button type="button" class="btn btn-outline-primary btn-sm m-0 py-0 px-2" <button type="button" class="btn btn-outline-primary btn-sm m-0 py-0 px-2"
(click)="reupload(a)" #reuploadBtn [appApiAction]="reuploadPromises[a.id]" (click)="reupload(a)" #reuploadBtn [appApiAction]="reuploadPromises[a.id]"
[disabled]="reuploadBtn.loading">{{'fix' | i18n}}</button> [disabled]="reuploadBtn.loading">{{'fix' | i18n}}</button>
@ -35,11 +36,12 @@
</td> </td>
<td class="table-list-options"> <td class="table-list-options">
<button class="btn btn-outline-danger" type="button" appStopClick <button class="btn btn-outline-danger" type="button" appStopClick
title="{{'delete' | i18n}}" (click)="delete(a)" #deleteBtn appA11yTitle="{{'delete' | i18n}}" (click)="delete(a)" #deleteBtn
[appApiAction]="deletePromises[a.id]" [disabled]="deleteBtn.loading"> [appApiAction]="deletePromises[a.id]" [disabled]="deleteBtn.loading">
<i class="fa fa-trash-o fa-lg fa-fw" [hidden]="deleteBtn.loading"></i> <i class="fa fa-trash-o fa-lg fa-fw" [hidden]="deleteBtn.loading"
aria-hidden="true"></i>
<i class="fa fa-spinner fa-spin fa-lg fa-fw" [hidden]="!deleteBtn.loading" <i class="fa fa-spinner fa-spin fa-lg fa-fw" [hidden]="!deleteBtn.loading"
title="{{'loading' | i18n}}"></i> title="{{'loading' | i18n}}" aria-hidden="true"></i>
</button> </button>
</td> </td>
</tr> </tr>
@ -52,10 +54,10 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'save' | i18n}}</span> <span>{{'save' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal" title="{{'close' | i18n}}">{{'close' <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{'close'
| i18n}}</button> | i18n}}</button>
</div> </div>
</form> </form>

View File

@ -14,11 +14,11 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button appAutoFocus type="submit" class="btn btn-danger btn-submit" [disabled]="form.loading"> <button appAutoFocus type="submit" class="btn btn-danger btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'delete' | i18n}}</span> <span>{{'delete' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal" <button type="button" class="btn btn-outline-secondary"
title="{{'cancel' | i18n}}">{{'cancel' | i18n}}</button> data-dismiss="modal">{{'cancel' | i18n}}</button>
</div> </div>
</form> </form>
</div> </div>

View File

@ -20,11 +20,11 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'save' | i18n}}</span> <span>{{'save' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal" <button type="button" class="btn btn-outline-secondary"
title="{{'cancel' | i18n}}">{{'cancel' | i18n}}</button> data-dismiss="modal">{{'cancel' | i18n}}</button>
</div> </div>
</form> </form>
</div> </div>

View File

@ -51,11 +51,11 @@
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit manual" [disabled]="form.loading || !canSave" <button type="submit" class="btn btn-primary btn-submit manual" [disabled]="form.loading || !canSave"
[ngClass]="{loading:form.loading}"> [ngClass]="{loading:form.loading}">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'save' | i18n}}</span> <span>{{'save' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal" <button type="button" class="btn btn-outline-secondary"
title="{{'cancel' | i18n}}">{{'cancel' | i18n}}</button> data-dismiss="modal">{{'cancel' | i18n}}</button>
</div> </div>
</form> </form>
</div> </div>

View File

@ -77,7 +77,10 @@
</tbody> </tbody>
</table> </table>
<div class="no-items" *ngIf="!filteredCiphers.length"> <div class="no-items" *ngIf="!filteredCiphers.length">
<i class="fa fa-spinner fa-spin text-muted" *ngIf="!loaded" title="{{'loading' | i18n}}"></i> <ng-container *ngIf="!loaded">
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</ng-container>
<ng-container *ngIf="loaded"> <ng-container *ngIf="loaded">
<p>{{'noItemsInList' | i18n}}</p> <p>{{'noItemsInList' | i18n}}</p>
<button (click)="addCipher()" class="btn btn-outline-primary" *ngIf="showAddNew"> <button (click)="addCipher()" class="btn btn-outline-primary" *ngIf="showAddNew">

View File

@ -42,7 +42,7 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'save' | i18n}}</span> <span>{{'save' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" <button type="button" class="btn btn-outline-secondary"

View File

@ -13,18 +13,18 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading"> <button type="submit" class="btn btn-primary btn-submit" [disabled]="form.loading">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'save' | i18n}}</span> <span>{{'save' | i18n}}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal" <button type="button" class="btn btn-outline-secondary"
title="{{'cancel' | i18n}}">{{'cancel' | i18n}}</button> data-dismiss="modal">{{'cancel' | i18n}}</button>
<div class="ml-auto"> <div class="ml-auto">
<button #deleteBtn type="button" (click)="delete()" class="btn btn-outline-danger" <button #deleteBtn type="button" (click)="delete()" class="btn btn-outline-danger"
title="{{'delete' | i18n}}" *ngIf="editMode" [disabled]="deleteBtn.loading" appA11yTitle="{{'delete' | i18n}}" *ngIf="editMode" [disabled]="deleteBtn.loading"
[appApiAction]="deletePromise"> [appApiAction]="deletePromise">
<i class="fa fa-trash-o fa-lg fa-fw" [hidden]="deleteBtn.loading"></i> <i class="fa fa-trash-o fa-lg fa-fw" [hidden]="deleteBtn.loading" aria-hidden="true"></i>
<i class="fa fa-spinner fa-spin fa-lg fa-fw" [hidden]="!deleteBtn.loading" <i class="fa fa-spinner fa-spin fa-lg fa-fw" [hidden]="!deleteBtn.loading"
title="{{'loading' | i18n}}"></i> title="{{'loading' | i18n}}" aria-hidden="true"></i>
</button> </button>
</div> </div>
</div> </div>

View File

@ -2,8 +2,8 @@
<div class="card-header d-flex"> <div class="card-header d-flex">
{{'filters' | i18n}} {{'filters' | i18n}}
<a class="ml-auto" href="https://help.bitwarden.com/article/searching-vault/" target="_blank" rel="noopener" <a class="ml-auto" href="https://help.bitwarden.com/article/searching-vault/" target="_blank" rel="noopener"
title="{{'learnMore' | i18n}}"> appA11yTitle="{{'learnMore' | i18n}}">
<i class="fa fa-question-circle-o"></i> <i class="fa fa-question-circle-o" aria-hidden="true"></i>
</a> </a>
</div> </div>
<div class="card-body"> <div class="card-body">
@ -45,15 +45,16 @@
</li> </li>
</ul> </ul>
<p *ngIf="!loaded" class="text-muted"> <p *ngIf="!loaded" class="text-muted">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</p> </p>
<ng-container *ngIf="loaded"> <ng-container *ngIf="loaded">
<ng-container *ngIf="showFolders"> <ng-container *ngIf="showFolders">
<h3 class="d-flex"> <h3 class="d-flex">
{{'folders' | i18n}} {{'folders' | i18n}}
<a href="#" class="text-muted ml-auto" appStopClick (click)="addFolder()" <a href="#" class="text-muted ml-auto" appStopClick (click)="addFolder()"
title="{{'addFolder' | i18n}}"> appA11yTitle="{{'addFolder' | i18n}}">
<i class="fa fa-plus fa-fw"></i> <i class="fa fa-plus fa-fw" aria-hidden="true"></i>
</a> </a>
</h3> </h3>
<ul class="fa-ul card-ul carets"> <ul class="fa-ul card-ul carets">
@ -66,8 +67,9 @@
(click)="collapse(f.node)"></i> (click)="collapse(f.node)"></i>
<a href="#" appStopClick (click)="selectFolder(f.node)">{{f.node.name}}</a> <a href="#" appStopClick (click)="selectFolder(f.node)">{{f.node.name}}</a>
<a href="#" class="text-muted ml-auto show-active" appStopClick <a href="#" class="text-muted ml-auto show-active" appStopClick
(click)="editFolder(f.node)" title="{{'editFolder' | i18n}}" *ngIf="f.node.id"> (click)="editFolder(f.node)" appA11yTitle="{{'editFolder' | i18n}}"
<i class="fa fa-pencil fa-fw"></i> *ngIf="f.node.id">
<i class="fa fa-pencil fa-fw" aria-hidden="true"></i>
</a> </a>
</div> </div>
<ul class="fa-ul card-ul carets" *ngIf="f.children.length && !isCollapsed(f.node)"> <ul class="fa-ul card-ul carets" *ngIf="f.children.length && !isCollapsed(f.node)">

View File

@ -53,15 +53,15 @@
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit manual" [disabled]="form.loading || !canSave" <button type="submit" class="btn btn-primary btn-submit manual" [disabled]="form.loading || !canSave"
[ngClass]="{loading:form.loading}" *ngIf="organizations && organizations.length"> [ngClass]="{loading:form.loading}" *ngIf="organizations && organizations.length">
<i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin" title="{{'loading' | i18n}}" aria-hidden="true"></i>
<span>{{'save' | i18n}}</span> <span>{{'save' | i18n}}</span>
</button> </button>
<a href="#" routerLink="/settings/create-organization" class="btn btn-primary" <a href="#" routerLink="/settings/create-organization" class="btn btn-primary"
*ngIf="!organizations || !organizations.length"> *ngIf="!organizations || !organizations.length">
{{'newOrganization' | i18n}} {{'newOrganization' | i18n}}
</a> </a>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal" <button type="button" class="btn btn-outline-secondary"
title="{{'cancel' | i18n}}">{{'cancel' | i18n}}</button> data-dismiss="modal">{{'cancel' | i18n}}</button>
</div> </div>
</form> </form>
</div> </div>

View File

@ -12,8 +12,11 @@
<h1> <h1>
{{'myVault' | i18n}} {{'myVault' | i18n}}
<small #actionSpinner [appApiAction]="ciphersComponent.actionPromise"> <small #actionSpinner [appApiAction]="ciphersComponent.actionPromise">
<i *ngIf="actionSpinner.loading" class="fa fa-spinner fa-spin text-muted" <ng-container *ngIf="actionSpinner.loading">
title="{{'loading' | i18n}}"></i> <i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}"
aria-hidden="true"></i>
<span class="sr-only">{{'loading' | i18n}}</span>
</ng-container>
</small> </small>
</h1> </h1>
<div class="ml-auto d-flex"> <div class="ml-auto d-flex">
@ -96,8 +99,8 @@
<div class="card-header d-flex"> <div class="card-header d-flex">
{{'organizations' | i18n}} {{'organizations' | i18n}}
<a class="ml-auto" href="https://help.bitwarden.com/article/what-is-an-organization/" <a class="ml-auto" href="https://help.bitwarden.com/article/what-is-an-organization/"
target="_blank" rel="noopener" title="{{'learnMore' | i18n}}"> target="_blank" rel="noopener" appA11yTitle="{{'learnMore' | i18n}}">
<i class="fa fa-question-circle-o"></i> <i class="fa fa-question-circle-o" aria-hidden="true"></i>
</a> </a>
</div> </div>
<div class="card-body"> <div class="card-body">

View File

@ -21,7 +21,7 @@
<div> <div>
<img src="./images/logo-dark@2x.png" class="mb-4 logo" alt="Bitwarden"> <img src="./images/logo-dark@2x.png" class="mb-4 logo" alt="Bitwarden">
<p class="text-center"> <p class="text-center">
<i class="fa fa-spinner fa-spin fa-2x text-muted" title="Loading"></i> <i class="fa fa-spinner fa-spin fa-2x text-muted" title="Loading" aria-hidden="true"></i>
</p> </p>
</div> </div>
</div> </div>