1 <div class="container">
2 <div class="col-lg-6 offset-lg-3">
4 <legend class="mb-0" i18n><h1>Sign In</h1></legend>
6 <form (ngSubmit)="handleSubmit()" #loginForm="ngForm" class="form-validated">
8 <div *ngIf="loginFailed" id="form-error-summary" class="row">
10 <p class="alert alert-danger label-with-material-icon w-100">
11 <span class="material-icons" aria-hidden="true"
12 title="Error" i18n-title>report</span>
13 <span class="ms-1" i18n>Login Failed</span>
18 <div class="row row-cols-auto">
19 <label class="form-label col-form-label fw-bold col-4 text-end" for="username" i18n>Username</label>
27 aria-describedby="form-error-summary"
28 autocomplete="username"
30 placeholder="Username"
31 [(ngModel)]="args.username"/>
35 <div class="row row-cols-auto mt-3">
36 <label class="form-label col-form-label col-4 text-end fw-bold" for="password" i18n>Password</label>
38 <div class="input-group p-0">
40 [type]="passwordVisible ? 'text' : 'password'"
46 autocomplete="current-password"
48 placeholder="Password"
50 aria-describedby="form-error-summary password-visibility"
51 [(ngModel)]="args.password"/>
52 <button id="show_password" class="input-group-text pointer"
54 [attr.title]="passwordVisible ? 'Hide Password' : 'Show Password'"
55 [attr.aria-label]="passwordVisible ? 'Hide Password' : 'Show Password'"
56 i18n-aria-label i18n-title (click)="togglePasswordVisibility()" >
57 <span class="material-icons" aria-hidden="true">{{ passwordVisible ? 'visibility' : 'visibility_off' }}</span>
59 <p id="password-visibility" class="visually-hidden" *ngIf="!passwordVisible" i18n>Your password is not visible.</p>
60 <p id="password-visibility" class="visually-hidden" *ngIf="passwordVisible" i18n>Your password is visible.</p>
65 <div class="row row-cols-auto mt-3" *ngIf="workstations && workstations.length">
66 <label class="form-label col-form-label col-4 text-end fw-bold" for="workstation" i18n>Workstation</label>
72 aria-describedby="form-error-summary"
74 [(ngModel)]="args.workstation">
75 <option *ngFor="let ws of workstations" [value]="ws.name">
82 <div class="row row-cols-auto mt-3">
83 <div class="col-2 offset-4">
84 <button type="submit" class="btn btn-outline-dark" i18n>Sign In</button>
88 <div class="row" *ngIf="pendingXactsDate">
89 <div class="col-lg-8 offset-lg-4 alert alert-warning mt-2" i18n>
90 Unprocessed offline transactions waiting for upload.
91 Last transaction added at {{pendingXactsDate | date:'short'}}.