2021-10-21 23:30:25 +02:00
|
|
|
<div class="modal fade" role="dialog" aria-modal="true" aria-labelledby="cipherAddEditTitle">
|
2021-05-07 09:43:41 +02:00
|
|
|
<div class="modal-dialog modal-dialog-scrollable modal-lg" role="document">
|
2019-02-21 22:50:37 +01:00
|
|
|
<form
|
|
|
|
class="modal-content"
|
|
|
|
#form
|
|
|
|
(ngSubmit)="submit()"
|
|
|
|
[appApiAction]="formPromise"
|
|
|
|
ngNativeValidate
|
|
|
|
autocomplete="off"
|
|
|
|
>
|
2018-06-07 23:12:11 +02:00
|
|
|
<div class="modal-header">
|
2019-10-11 17:47:41 +02:00
|
|
|
<h2 class="modal-title" id="cipherAddEditTitle">{{ title }}</h2>
|
2019-10-11 17:22:21 +02:00
|
|
|
<button
|
|
|
|
type="button"
|
|
|
|
class="close"
|
|
|
|
data-dismiss="modal"
|
|
|
|
appA11yTitle="{{ 'close' | i18n }}"
|
|
|
|
>
|
2018-06-07 23:12:11 +02:00
|
|
|
<span aria-hidden="true">×</span>
|
|
|
|
</button>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="modal-body" *ngIf="cipher">
|
2021-01-06 17:01:34 +01:00
|
|
|
<app-callout type="info" *ngIf="allowOwnershipAssignment() && !allowPersonal">
|
|
|
|
{{ "personalOwnershipPolicyInEffect" | i18n }}
|
|
|
|
</app-callout>
|
2020-12-22 16:57:44 +01:00
|
|
|
<div class="row" *ngIf="!editMode && !viewOnly">
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="col-6 form-group">
|
|
|
|
<label for="type">{{ "whatTypeOfItem" | i18n }}</label>
|
2020-10-06 15:06:44 +02:00
|
|
|
<select
|
|
|
|
id="type"
|
|
|
|
name="Type"
|
|
|
|
[(ngModel)]="cipher.type"
|
|
|
|
class="form-control"
|
|
|
|
[disabled]="cipher.isDeleted"
|
|
|
|
appAutofocus
|
|
|
|
>
|
2018-06-07 16:21:28 +02:00
|
|
|
<option *ngFor="let o of typeOptions" [ngValue]="o.value">{{ o.name }}</option>
|
|
|
|
</select>
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="row">
|
|
|
|
<div class="col-6 form-group">
|
|
|
|
<label for="name">{{ "name" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2021-01-06 17:01:34 +01:00
|
|
|
id="name"
|
2019-02-21 22:50:37 +01:00
|
|
|
class="form-control"
|
|
|
|
type="text"
|
2021-01-06 17:01:34 +01:00
|
|
|
name="Name"
|
|
|
|
[(ngModel)]="cipher.name"
|
2021-12-17 15:57:11 +01:00
|
|
|
required
|
2021-01-06 17:01:34 +01:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
|
|
|
</div>
|
2018-07-05 15:42:50 +02:00
|
|
|
<div class="col-6 form-group" *ngIf="!organization">
|
2018-06-07 16:21:28 +02:00
|
|
|
<label for="folder">{{ "folder" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<select
|
2021-01-06 17:01:34 +01:00
|
|
|
id="folder"
|
|
|
|
name="FolderId"
|
|
|
|
[(ngModel)]="cipher.folderId"
|
2019-02-21 22:50:37 +01:00
|
|
|
class="form-control"
|
2021-01-06 17:01:34 +01:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
2018-06-07 16:21:28 +02:00
|
|
|
<option *ngFor="let f of folders" [ngValue]="f.id">{{ f.name }}</option>
|
|
|
|
</select>
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
2018-06-07 15:05:25 +02:00
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<!-- Login -->
|
2018-06-07 23:12:11 +02:00
|
|
|
<ng-container *ngIf="cipher.type === cipherType.Login">
|
2020-04-10 19:42:37 +02:00
|
|
|
<div class="row">
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="col-6 form-group">
|
|
|
|
<label for="loginUsername">{{ "username" | i18n }}</label>
|
|
|
|
<div class="input-group">
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="loginUsername"
|
|
|
|
class="form-control"
|
|
|
|
type="text"
|
|
|
|
name="Login.Username"
|
2021-01-06 17:01:34 +01:00
|
|
|
[(ngModel)]="cipher.login.username"
|
2020-04-08 22:48:30 +02:00
|
|
|
appInputVerbatim
|
2021-01-06 17:01:34 +01:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
2020-04-08 22:48:30 +02:00
|
|
|
<div class="input-group-append" *ngIf="!cipher.isDeleted">
|
2021-12-17 15:57:11 +01:00
|
|
|
<button
|
2019-02-21 22:50:37 +01:00
|
|
|
type="button"
|
|
|
|
class="btn btn-outline-secondary"
|
2019-10-11 16:35:24 +02:00
|
|
|
appA11yTitle="{{ 'copyUsername' | i18n }}"
|
2021-01-22 00:00:03 +01:00
|
|
|
(click)="copy(cipher.login.username, 'username', 'Username')"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
2022-01-27 18:25:58 +01:00
|
|
|
<i class="bwi bwi-lg bwi-clone" aria-hidden="true"></i>
|
2018-06-07 16:21:28 +02:00
|
|
|
</button>
|
2018-06-07 15:05:25 +02:00
|
|
|
</div>
|
|
|
|
</div>
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="col-6 form-group">
|
2018-06-07 23:12:11 +02:00
|
|
|
<div class="d-flex">
|
2018-06-07 16:21:28 +02:00
|
|
|
<label for="loginPassword">{{ "password" | i18n }}</label>
|
2021-01-06 17:01:34 +01:00
|
|
|
<div class="ml-auto d-flex" *ngIf="!cipher.isDeleted && !viewOnly">
|
2021-12-17 15:57:11 +01:00
|
|
|
<a
|
|
|
|
href="#"
|
2022-01-27 18:25:58 +01:00
|
|
|
class="d-block mr-2 bwi-icon-above-input"
|
2019-02-21 22:50:37 +01:00
|
|
|
appStopClick
|
2021-01-06 17:01:34 +01:00
|
|
|
appA11yTitle="{{ 'generatePassword' | i18n }}"
|
2018-07-05 15:42:50 +02:00
|
|
|
(click)="generatePassword()"
|
|
|
|
*ngIf="cipher.viewPassword"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
2022-01-27 18:25:58 +01:00
|
|
|
<i class="bwi bwi-lg bwi-fw bwi-refresh" aria-hidden="true"></i>
|
2021-12-17 15:57:11 +01:00
|
|
|
</a>
|
|
|
|
<a
|
|
|
|
href="#"
|
2022-01-27 18:25:58 +01:00
|
|
|
class="d-block bwi-icon-above-input"
|
2021-01-24 21:24:09 +01:00
|
|
|
#checkPasswordBtn
|
2019-02-21 22:50:37 +01:00
|
|
|
appStopClick
|
2018-06-07 16:21:28 +02:00
|
|
|
appA11yTitle="{{ 'checkPassword' | i18n }}"
|
2021-01-06 17:01:34 +01:00
|
|
|
(click)="checkPassword()"
|
|
|
|
[appApiAction]="checkPasswordPromise"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
2021-01-06 17:01:34 +01:00
|
|
|
<i
|
2022-01-27 18:25:58 +01:00
|
|
|
class="bwi bwi-lg bwi-fw bwi-check-circle"
|
2020-12-22 16:57:44 +01:00
|
|
|
[hidden]="checkPasswordBtn.loading"
|
2018-06-07 16:21:28 +02:00
|
|
|
aria-hidden="true"
|
|
|
|
></i>
|
|
|
|
<i
|
2022-01-27 18:25:58 +01:00
|
|
|
class="bwi bwi-lg bwi-fw bwi-spinner bwi-spin"
|
2020-07-27 19:21:11 +02:00
|
|
|
aria-hidden="true"
|
2018-06-07 16:21:28 +02:00
|
|
|
[hidden]="!checkPasswordBtn.loading"
|
|
|
|
title="{{ 'loading' | i18n }}"
|
|
|
|
></i>
|
2018-06-07 15:05:25 +02:00
|
|
|
</a>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
</div>
|
2018-06-07 23:12:11 +02:00
|
|
|
<div class="input-group">
|
2021-01-24 21:24:09 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="loginPassword"
|
|
|
|
class="form-control text-monospace"
|
2021-01-06 17:01:34 +01:00
|
|
|
type="{{ showPassword ? 'text' : 'password' }}"
|
|
|
|
name="Login.Password"
|
2018-06-20 05:40:51 +02:00
|
|
|
[(ngModel)]="cipher.login.password"
|
2019-02-21 22:50:37 +01:00
|
|
|
appInputVerbatim
|
|
|
|
autocomplete="new-password"
|
2021-01-06 17:01:34 +01:00
|
|
|
[disabled]="cipher.isDeleted || !cipher.viewPassword || viewOnly"
|
2018-06-07 23:12:11 +02:00
|
|
|
/>
|
2018-06-09 06:39:14 +02:00
|
|
|
<div class="input-group-append">
|
2019-02-21 22:50:37 +01:00
|
|
|
<button
|
|
|
|
type="button"
|
|
|
|
class="btn btn-outline-secondary"
|
2021-05-03 20:55:42 +02:00
|
|
|
appA11yTitle="{{ 'toggleVisibility' | i18n }}"
|
|
|
|
(click)="togglePassword()"
|
2020-12-22 16:57:44 +01:00
|
|
|
[disabled]="!cipher.viewPassword"
|
2018-06-07 16:21:28 +02:00
|
|
|
>
|
2019-02-21 22:50:37 +01:00
|
|
|
<i
|
2022-01-27 18:25:58 +01:00
|
|
|
class="bwi bwi-lg"
|
2020-07-27 19:21:11 +02:00
|
|
|
aria-hidden="true"
|
2022-01-27 18:25:58 +01:00
|
|
|
[ngClass]="{ 'bwi-eye': !showPassword, 'bwi-eye-slash': showPassword }"
|
2018-06-07 16:21:28 +02:00
|
|
|
></i>
|
2018-06-06 23:25:57 +02:00
|
|
|
</button>
|
2019-02-21 22:50:37 +01:00
|
|
|
<button
|
|
|
|
type="button"
|
|
|
|
class="btn btn-outline-secondary"
|
2018-06-07 16:21:28 +02:00
|
|
|
appA11yTitle="{{ 'copyPassword' | i18n }}"
|
2020-12-22 16:57:44 +01:00
|
|
|
(click)="copy(cipher.login.password, 'password', 'Password')"
|
|
|
|
[disabled]="!cipher.viewPassword"
|
2018-06-07 16:21:28 +02:00
|
|
|
>
|
2022-01-27 18:25:58 +01:00
|
|
|
<i class="bwi bwi-lg bwi-clone" aria-hidden="true"></i>
|
2018-06-07 23:12:11 +02:00
|
|
|
</button>
|
2018-06-07 16:21:28 +02:00
|
|
|
</div>
|
2021-11-03 22:41:04 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
2018-10-19 18:44:52 +02:00
|
|
|
</div>
|
|
|
|
<div class="row">
|
|
|
|
<div class="col-6 form-group">
|
|
|
|
<label for="loginTotp">{{ "authenticatorKeyTotp" | i18n }}</label>
|
2019-02-21 22:50:37 +01:00
|
|
|
<input
|
|
|
|
id="loginTotp"
|
|
|
|
type="{{ cipher.viewPassword ? 'text' : 'password' }}"
|
|
|
|
name="Login.Totp"
|
|
|
|
class="form-control text-monospace"
|
2020-04-08 22:48:30 +02:00
|
|
|
[(ngModel)]="cipher.login.totp"
|
|
|
|
appInputVerbatim
|
2020-12-22 16:57:44 +01:00
|
|
|
[disabled]="cipher.isDeleted || !cipher.viewPassword || viewOnly"
|
2018-10-19 18:44:52 +02:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<div class="col-6 form-group totp d-flex align-items-end" [ngClass]="{ low: totpLow }">
|
2021-01-06 17:01:34 +01:00
|
|
|
<div *ngIf="!cipher.login.totp || !totpCode">
|
2018-10-19 18:44:52 +02:00
|
|
|
<img
|
|
|
|
src="../../images/totp-countdown.png"
|
2021-09-30 00:06:20 +02:00
|
|
|
id="totpImage"
|
2018-10-19 18:44:52 +02:00
|
|
|
title="{{ 'verificationCodeTotp' | i18n }}"
|
|
|
|
class="ml-2"
|
|
|
|
/>
|
|
|
|
<a
|
2018-07-28 05:38:12 +02:00
|
|
|
href="#"
|
2021-01-06 17:01:34 +01:00
|
|
|
appStopClick
|
2018-07-31 04:02:01 +02:00
|
|
|
class="badge badge-primary ml-3"
|
2018-07-28 05:38:12 +02:00
|
|
|
(click)="premiumRequired()"
|
2018-07-31 04:02:01 +02:00
|
|
|
*ngIf="!organization && !cipher.organizationId && !canAccessPremium"
|
2018-07-28 05:38:12 +02:00
|
|
|
>
|
2018-07-30 14:48:48 +02:00
|
|
|
{{ "premium" | i18n }}
|
|
|
|
</a>
|
|
|
|
<a
|
|
|
|
href="#"
|
|
|
|
appStopClick
|
|
|
|
class="badge badge-primary ml-3"
|
|
|
|
(click)="upgradeOrganization()"
|
2021-12-17 15:57:11 +01:00
|
|
|
*ngIf="
|
2018-07-30 14:48:48 +02:00
|
|
|
(organization && !organization.useTotp) ||
|
2019-02-21 22:50:37 +01:00
|
|
|
(!organization &&
|
2018-07-30 14:48:48 +02:00
|
|
|
!canAccessPremium &&
|
|
|
|
cipher.organizationId &&
|
|
|
|
!cipher.organizationUseTotp)
|
2021-12-17 15:57:11 +01:00
|
|
|
"
|
|
|
|
>
|
2018-07-30 14:48:48 +02:00
|
|
|
{{ "upgrade" | i18n }}
|
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
<div *ngIf="cipher.login.totp && totpCode" class="d-flex align-items-center">
|
2020-12-16 21:47:37 +01:00
|
|
|
<span class="totp-countdown mr-3 ml-2">
|
|
|
|
<span class="totp-sec">{{ totpSec }}</span>
|
2018-07-28 05:38:12 +02:00
|
|
|
<svg>
|
|
|
|
<g>
|
2021-11-09 19:24:26 +01:00
|
|
|
<circle
|
2021-05-03 20:55:42 +02:00
|
|
|
class="totp-circle inner"
|
2021-12-17 15:57:11 +01:00
|
|
|
r="12.6"
|
2021-05-03 20:55:42 +02:00
|
|
|
cy="16"
|
2021-12-17 15:57:11 +01:00
|
|
|
cx="16"
|
2021-05-03 20:55:42 +02:00
|
|
|
[ngStyle]="{ 'stroke-dashoffset.px': totpDash }"
|
2018-06-20 05:40:51 +02:00
|
|
|
></circle>
|
2021-05-03 20:55:42 +02:00
|
|
|
<circle class="totp-circle outer" r="14" cy="16" cx="16"></circle>
|
|
|
|
</g>
|
2021-12-17 15:57:11 +01:00
|
|
|
</svg>
|
2021-06-21 20:52:34 +02:00
|
|
|
</span>
|
|
|
|
<span class="totp-code mr-2" title="{{ 'verificationCodeTotp' | i18n }}">{{
|
|
|
|
totpCodeFormatted
|
|
|
|
}}</span>
|
|
|
|
<button
|
|
|
|
type="button"
|
|
|
|
class="btn btn-link"
|
|
|
|
appA11yTitle="{{ 'copyVerificationCode' | i18n }}"
|
|
|
|
(click)="copy(totpCode, 'verificationCodeTotp', 'TOTP')"
|
2020-12-22 16:57:44 +01:00
|
|
|
>
|
2022-01-27 18:25:58 +01:00
|
|
|
<i class="bwi bwi-clone" aria-hidden="true"></i>
|
2018-06-07 15:05:25 +02:00
|
|
|
</button>
|
2020-12-22 16:57:44 +01:00
|
|
|
</div>
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
2020-12-22 16:57:44 +01:00
|
|
|
<ng-container *ngIf="cipher.login.hasUris">
|
|
|
|
<div
|
|
|
|
class="row"
|
2021-01-06 17:01:34 +01:00
|
|
|
*ngFor="let u of cipher.login.uris; let i = index; trackBy: trackByFunction"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
2021-01-06 17:01:34 +01:00
|
|
|
<div class="col-7 form-group">
|
|
|
|
<label for="loginUri{{ i }}">{{ "uriPosition" | i18n: i + 1 }}</label>
|
|
|
|
<div class="input-group">
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
class="form-control"
|
|
|
|
id="loginUri{{ i }}"
|
2021-01-06 17:01:34 +01:00
|
|
|
type="text"
|
|
|
|
name="Login.Uris[{{ i }}].Uri"
|
|
|
|
[(ngModel)]="u.uri"
|
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
|
|
|
placeholder="{{ 'ex' | i18n }} https://google.com"
|
|
|
|
appInputVerbatim
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
2021-01-06 17:01:34 +01:00
|
|
|
<div class="input-group-append">
|
|
|
|
<button
|
|
|
|
type="button"
|
|
|
|
class="btn btn-outline-secondary"
|
|
|
|
appA11yTitle="{{ 'launch' | i18n }}"
|
2019-10-11 16:35:24 +02:00
|
|
|
(click)="launch(u)"
|
|
|
|
[disabled]="!u.canLaunch"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
2022-01-27 18:25:58 +01:00
|
|
|
<i class="bwi bwi-lg bwi-share" aria-hidden="true"></i>
|
2018-06-07 23:12:11 +02:00
|
|
|
</button>
|
2019-02-21 22:50:37 +01:00
|
|
|
<button
|
|
|
|
type="button"
|
|
|
|
class="btn btn-outline-secondary"
|
2020-04-08 22:48:30 +02:00
|
|
|
appA11yTitle="{{ 'copyUri' | i18n }}"
|
2021-01-06 17:01:34 +01:00
|
|
|
(click)="copy(u.uri, 'uri', 'URI')"
|
|
|
|
>
|
2022-01-27 18:25:58 +01:00
|
|
|
<i class="bwi bwi-lg bwi-clone" aria-hidden="true"></i>
|
2018-06-07 05:23:14 +02:00
|
|
|
</button>
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="col-5 form-group">
|
2018-06-09 06:39:14 +02:00
|
|
|
<div class="d-flex">
|
2018-07-19 19:56:44 +02:00
|
|
|
<label for="loginUriMatch{{ i }}">
|
|
|
|
{{ "matchDetection" | i18n }}
|
2021-12-17 15:57:11 +01:00
|
|
|
</label>
|
|
|
|
<a
|
2019-02-21 22:50:37 +01:00
|
|
|
class="ml-auto"
|
2022-01-31 20:11:27 +01:00
|
|
|
href="https://bitwarden.com/help/uri-match-detection/"
|
2019-10-11 16:35:24 +02:00
|
|
|
target="_blank"
|
|
|
|
rel="noopener"
|
|
|
|
appA11yTitle="{{ 'learnMore' | i18n }}"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
2022-01-27 18:25:58 +01:00
|
|
|
<i class="bwi bwi-question-circle" aria-hidden="true"></i>
|
2021-12-17 15:57:11 +01:00
|
|
|
</a>
|
|
|
|
</div>
|
2018-06-09 06:39:14 +02:00
|
|
|
<div class="d-flex">
|
2021-12-17 15:57:11 +01:00
|
|
|
<select
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control overflow-hidden"
|
|
|
|
id="loginUriMatch{{ i }}"
|
|
|
|
name="Login.Uris[{{ i }}].Match"
|
|
|
|
[(ngModel)]="u.match"
|
|
|
|
(change)="loginUriMatchChanged(u)"
|
2020-12-22 16:57:44 +01:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
2019-02-21 22:50:37 +01:00
|
|
|
<option *ngFor="let o of uriMatchOptions" [ngValue]="o.value">
|
2021-12-17 15:57:11 +01:00
|
|
|
{{ o.name }}
|
2018-06-07 16:21:28 +02:00
|
|
|
</option>
|
2018-06-07 15:05:25 +02:00
|
|
|
</select>
|
2021-12-17 15:57:11 +01:00
|
|
|
<button
|
2019-02-21 22:50:37 +01:00
|
|
|
type="button"
|
|
|
|
class="btn btn-link text-danger ml-2"
|
|
|
|
(click)="removeUri(u)"
|
2020-12-22 16:57:44 +01:00
|
|
|
appA11yTitle="{{ 'remove' | i18n }}"
|
|
|
|
*ngIf="!cipher.isDeleted && !viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
2022-01-27 18:25:58 +01:00
|
|
|
<i class="bwi bwi-minus-circle bwi-lg" aria-hidden="true"></i>
|
2018-06-07 23:12:11 +02:00
|
|
|
</button>
|
2018-06-06 23:25:57 +02:00
|
|
|
</div>
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
2018-06-07 23:12:11 +02:00
|
|
|
</ng-container>
|
2021-12-17 15:57:11 +01:00
|
|
|
<a
|
|
|
|
href="#"
|
2021-01-06 17:01:34 +01:00
|
|
|
appStopClick
|
|
|
|
(click)="addUri()"
|
|
|
|
class="d-inline-block mb-3"
|
2020-12-22 16:57:44 +01:00
|
|
|
*ngIf="!cipher.isDeleted && !viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
2022-01-27 18:25:58 +01:00
|
|
|
<i class="bwi bwi-plus-circle bwi-fw" aria-hidden="true"></i> {{ "newUri" | i18n }}
|
2021-12-17 15:57:11 +01:00
|
|
|
</a>
|
2018-06-07 23:12:11 +02:00
|
|
|
</ng-container>
|
2018-06-07 16:21:28 +02:00
|
|
|
<!-- Card -->
|
2018-06-07 23:12:11 +02:00
|
|
|
<ng-container *ngIf="cipher.type === cipherType.Card">
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="row">
|
|
|
|
<div class="col-6 form-group">
|
|
|
|
<label for="cardCardholderName">{{ "cardholderName" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="cardCardholderName"
|
|
|
|
class="form-control"
|
|
|
|
type="text"
|
2020-04-08 22:48:30 +02:00
|
|
|
name="Card.CardCardholderName"
|
|
|
|
[(ngModel)]="cipher.card.cardholderName"
|
2020-12-22 16:57:44 +01:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="col-6 form-group">
|
|
|
|
<label for="cardBrand">{{ "brand" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<select
|
2019-02-21 22:50:37 +01:00
|
|
|
id="cardBrand"
|
|
|
|
class="form-control"
|
|
|
|
name="Card.Brand"
|
2020-12-22 16:57:44 +01:00
|
|
|
[(ngModel)]="cipher.card.brand"
|
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
2018-06-07 16:21:28 +02:00
|
|
|
<option *ngFor="let o of cardBrandOptions" [ngValue]="o.value">{{ o.name }}</option>
|
2018-10-19 18:44:52 +02:00
|
|
|
</select>
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="row">
|
|
|
|
<div class="col-6 form-group">
|
|
|
|
<label for="cardNumber">{{ "number" | i18n }}</label>
|
2018-06-07 23:12:11 +02:00
|
|
|
<div class="input-group">
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2021-05-03 20:55:42 +02:00
|
|
|
id="cardNumber"
|
2019-02-21 22:50:37 +01:00
|
|
|
class="form-control text-monospace"
|
|
|
|
type="{{ showCardNumber ? 'text' : 'password' }}"
|
2021-05-03 20:55:42 +02:00
|
|
|
name="Card.Number"
|
|
|
|
[(ngModel)]="cipher.card.number"
|
2021-01-06 17:01:34 +01:00
|
|
|
appInputVerbatim
|
2020-04-08 22:48:30 +02:00
|
|
|
autocomplete="new-password"
|
2020-12-22 16:57:44 +01:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
2020-04-10 19:42:37 +02:00
|
|
|
<div class="input-group-append">
|
2021-12-17 15:57:11 +01:00
|
|
|
<button
|
2018-07-18 05:15:15 +02:00
|
|
|
type="button"
|
|
|
|
class="btn btn-outline-secondary"
|
2021-01-22 00:00:03 +01:00
|
|
|
appA11yTitle="{{ 'toggleVisibility' | i18n }}"
|
|
|
|
(click)="toggleCardNumber()"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
|
|
|
<i
|
2022-01-27 18:25:58 +01:00
|
|
|
class="bwi bwi-lg"
|
2019-10-11 16:35:24 +02:00
|
|
|
aria-hidden="true"
|
2022-01-27 18:25:58 +01:00
|
|
|
[ngClass]="{
|
|
|
|
'bwi-eye': !showCardNumber,
|
|
|
|
'bwi-eye-slash': showCardNumber
|
|
|
|
}"
|
2021-12-17 15:57:11 +01:00
|
|
|
></i>
|
2018-06-07 15:05:25 +02:00
|
|
|
</button>
|
2021-12-17 15:57:11 +01:00
|
|
|
<button
|
2018-07-18 05:15:15 +02:00
|
|
|
type="button"
|
|
|
|
class="btn btn-outline-secondary"
|
2019-10-11 16:35:24 +02:00
|
|
|
appA11yTitle="{{ 'copyNumber' | i18n }}"
|
2021-01-22 00:00:03 +01:00
|
|
|
(click)="copy(cipher.card.number, 'number', 'Number')"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
2022-01-27 18:25:58 +01:00
|
|
|
<i class="bwi bwi-lg bwi-clone" aria-hidden="true"></i>
|
2018-06-07 15:05:25 +02:00
|
|
|
</button>
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="col form-group">
|
|
|
|
<label for="cardExpMonth">{{ "expirationMonth" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<select
|
2019-02-21 22:50:37 +01:00
|
|
|
id="cardExpMonth"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2019-02-21 22:50:37 +01:00
|
|
|
name="Card.ExpMonth"
|
2020-12-22 16:57:44 +01:00
|
|
|
[(ngModel)]="cipher.card.expMonth"
|
2021-01-06 17:01:34 +01:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
2018-06-07 16:21:28 +02:00
|
|
|
<option *ngFor="let o of cardExpMonthOptions" [ngValue]="o.value">
|
2021-12-17 15:57:11 +01:00
|
|
|
{{ o.name }}
|
2018-10-19 18:44:52 +02:00
|
|
|
</option>
|
|
|
|
</select>
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="col form-group">
|
|
|
|
<label for="cardExpYear">{{ "expirationYear" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="cardExpYear"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2019-02-21 22:50:37 +01:00
|
|
|
type="text"
|
|
|
|
name="Card.ExpYear"
|
2021-01-06 17:01:34 +01:00
|
|
|
[(ngModel)]="cipher.card.expYear"
|
|
|
|
placeholder="{{ 'ex' | i18n }} 2019"
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="row">
|
|
|
|
<div class="col-6 form-group">
|
|
|
|
<label for="cardCode">{{ "securityCode" | i18n }}</label>
|
2018-06-07 23:12:11 +02:00
|
|
|
<div class="input-group">
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="cardCode"
|
|
|
|
class="form-control text-monospace"
|
|
|
|
type="{{ showCardCode ? 'text' : 'password' }}"
|
|
|
|
name="Card.Code"
|
2020-04-08 22:48:30 +02:00
|
|
|
[(ngModel)]="cipher.card.code"
|
2021-01-06 17:01:34 +01:00
|
|
|
appInputVerbatim
|
2020-04-08 22:48:30 +02:00
|
|
|
autocomplete="new-password"
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
2020-04-10 19:42:37 +02:00
|
|
|
<div class="input-group-append">
|
2021-12-17 15:57:11 +01:00
|
|
|
<button
|
2018-07-18 05:15:15 +02:00
|
|
|
type="button"
|
|
|
|
class="btn btn-outline-secondary"
|
2021-01-22 00:00:03 +01:00
|
|
|
appA11yTitle="{{ 'toggleVisibility' | i18n }}"
|
|
|
|
(click)="toggleCardCode()"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
|
|
|
<i
|
2022-01-27 18:25:58 +01:00
|
|
|
class="bwi bwi-lg"
|
2019-10-11 16:35:24 +02:00
|
|
|
aria-hidden="true"
|
2022-01-27 18:25:58 +01:00
|
|
|
[ngClass]="{ 'bwi-eye': !showCardCode, 'bwi-eye-slash': showCardCode }"
|
2021-12-17 15:57:11 +01:00
|
|
|
></i>
|
2018-06-07 15:05:25 +02:00
|
|
|
</button>
|
2021-12-17 15:57:11 +01:00
|
|
|
<button
|
2018-07-18 05:15:15 +02:00
|
|
|
type="button"
|
|
|
|
class="btn btn-outline-secondary"
|
2019-10-11 16:35:24 +02:00
|
|
|
appA11yTitle="{{ 'securityCode' | i18n }}"
|
2021-01-22 00:00:03 +01:00
|
|
|
(click)="copy(cipher.card.code, 'securityCode', 'Security Code')"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
2022-01-27 18:25:58 +01:00
|
|
|
<i class="bwi bwi-lg bwi-clone" aria-hidden="true"></i>
|
2018-06-07 15:05:25 +02:00
|
|
|
</button>
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2021-05-03 20:55:42 +02:00
|
|
|
</ng-container>
|
2018-06-07 16:21:28 +02:00
|
|
|
<!-- Identity -->
|
2018-06-07 23:12:11 +02:00
|
|
|
<ng-container *ngIf="cipher.type === cipherType.Identity">
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="row">
|
|
|
|
<div class="col-4 form-group">
|
|
|
|
<label for="idTitle">{{ "title" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<select
|
2019-02-21 22:50:37 +01:00
|
|
|
id="idTitle"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2019-02-21 22:50:37 +01:00
|
|
|
name="Identity.Title"
|
2020-12-22 16:57:44 +01:00
|
|
|
[(ngModel)]="cipher.identity.title"
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
2018-06-07 16:21:28 +02:00
|
|
|
<option *ngFor="let o of identityTitleOptions" [ngValue]="o.value">
|
2021-12-17 15:57:11 +01:00
|
|
|
{{ o.name }}
|
2018-10-19 18:44:52 +02:00
|
|
|
</option>
|
|
|
|
</select>
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="row">
|
|
|
|
<div class="col-4 form-group">
|
|
|
|
<label for="idFirstName">{{ "firstName" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="idFirstName"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2019-02-21 22:50:37 +01:00
|
|
|
type="text"
|
|
|
|
name="Identity.FirstName"
|
2020-12-22 16:57:44 +01:00
|
|
|
[(ngModel)]="cipher.identity.firstName"
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="col-4 form-group">
|
|
|
|
<label for="idMiddleName">{{ "middleName" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="idMiddleName"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2019-02-21 22:50:37 +01:00
|
|
|
type="text"
|
|
|
|
name="Identity.MiddleName"
|
2020-12-22 16:57:44 +01:00
|
|
|
[(ngModel)]="cipher.identity.middleName"
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="col-4 form-group">
|
|
|
|
<label for="idLastName">{{ "lastName" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="idLastName"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2019-02-21 22:50:37 +01:00
|
|
|
type="text"
|
|
|
|
name="Identity.LastName"
|
2020-12-22 16:57:44 +01:00
|
|
|
[(ngModel)]="cipher.identity.lastName"
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="row">
|
|
|
|
<div class="col-4 form-group">
|
|
|
|
<label for="idUsername">{{ "username" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="idUsername"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2019-02-21 22:50:37 +01:00
|
|
|
type="text"
|
|
|
|
name="Identity.Username"
|
2021-01-06 17:01:34 +01:00
|
|
|
[(ngModel)]="cipher.identity.username"
|
|
|
|
appInputVerbatim
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="col-4 form-group">
|
|
|
|
<label for="idCompany">{{ "company" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="idCompany"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2019-02-21 22:50:37 +01:00
|
|
|
type="text"
|
|
|
|
name="Identity.Company"
|
2020-12-22 16:57:44 +01:00
|
|
|
[(ngModel)]="cipher.identity.company"
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="row">
|
|
|
|
<div class="col-4 form-group">
|
|
|
|
<label for="idSsn">{{ "ssn" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="idSsn"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2019-02-21 22:50:37 +01:00
|
|
|
type="text"
|
|
|
|
name="Identity.SSN"
|
2021-01-06 17:01:34 +01:00
|
|
|
[(ngModel)]="cipher.identity.ssn"
|
|
|
|
appInputVerbatim
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="col-4 form-group">
|
|
|
|
<label for="idPassportNumber">{{ "passportNumber" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="idPassportNumber"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2019-02-21 22:50:37 +01:00
|
|
|
type="text"
|
|
|
|
name="Identity.PassportNumber"
|
2021-01-06 17:01:34 +01:00
|
|
|
[(ngModel)]="cipher.identity.passportNumber"
|
|
|
|
appInputVerbatim
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="col-4 form-group">
|
|
|
|
<label for="idLicenseNumber">{{ "licenseNumber" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="idLicenseNumber"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2019-02-21 22:50:37 +01:00
|
|
|
type="text"
|
|
|
|
name="Identity.LicenseNumber"
|
2021-01-06 17:01:34 +01:00
|
|
|
[(ngModel)]="cipher.identity.licenseNumber"
|
|
|
|
appInputVerbatim
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="row">
|
|
|
|
<div class="col-6 form-group">
|
|
|
|
<label for="idEmail">{{ "email" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="idEmail"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2019-02-21 22:50:37 +01:00
|
|
|
type="text"
|
2022-01-12 10:07:56 +01:00
|
|
|
inputmode="email"
|
2019-02-21 22:50:37 +01:00
|
|
|
name="Identity.Email"
|
2021-01-06 17:01:34 +01:00
|
|
|
[(ngModel)]="cipher.identity.email"
|
|
|
|
appInputVerbatim
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="col-6 form-group">
|
|
|
|
<label for="idPhone">{{ "phone" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="idPhone"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2019-02-21 22:50:37 +01:00
|
|
|
type="text"
|
2022-01-12 10:07:56 +01:00
|
|
|
inputmode="tel"
|
2019-02-21 22:50:37 +01:00
|
|
|
name="Identity.Phone"
|
2020-12-22 16:57:44 +01:00
|
|
|
[(ngModel)]="cipher.identity.phone"
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="row">
|
|
|
|
<div class="col-6 form-group">
|
|
|
|
<label for="idAddress1">{{ "address1" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="idAddress1"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2019-02-21 22:50:37 +01:00
|
|
|
type="text"
|
|
|
|
name="Identity.Address1"
|
2020-12-22 16:57:44 +01:00
|
|
|
[(ngModel)]="cipher.identity.address1"
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="col-6 form-group">
|
|
|
|
<label for="idAddress2">{{ "address2" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="idAddress2"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2019-02-21 22:50:37 +01:00
|
|
|
type="text"
|
|
|
|
name="Identity.Address2"
|
2020-12-22 16:57:44 +01:00
|
|
|
[(ngModel)]="cipher.identity.address2"
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="row">
|
|
|
|
<div class="col-6 form-group">
|
|
|
|
<label for="idAddress3">{{ "address3" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="idAddress3"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2019-02-21 22:50:37 +01:00
|
|
|
type="text"
|
|
|
|
name="Identity.Address3"
|
2020-12-22 16:57:44 +01:00
|
|
|
[(ngModel)]="cipher.identity.address3"
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="col-6 form-group">
|
|
|
|
<label for="idCity">{{ "cityTown" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="idCity"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2019-02-21 22:50:37 +01:00
|
|
|
type="text"
|
|
|
|
name="Identity.City"
|
2020-12-22 16:57:44 +01:00
|
|
|
[(ngModel)]="cipher.identity.city"
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="row">
|
|
|
|
<div class="col-6 form-group">
|
|
|
|
<label for="idState">{{ "stateProvince" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="idState"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2019-02-21 22:50:37 +01:00
|
|
|
type="text"
|
|
|
|
name="Identity.State"
|
2020-12-22 16:57:44 +01:00
|
|
|
[(ngModel)]="cipher.identity.state"
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="col-6 form-group">
|
|
|
|
<label for="idPostalCode">{{ "zipPostalCode" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="idPostalCode"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2019-02-21 22:50:37 +01:00
|
|
|
type="text"
|
|
|
|
name="Identity.PostalCode"
|
2020-12-22 16:57:44 +01:00
|
|
|
[(ngModel)]="cipher.identity.postalCode"
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="row">
|
|
|
|
<div class="col-6 form-group">
|
|
|
|
<label for="idCountry">{{ "country" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
id="idCountry"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2019-02-21 22:50:37 +01:00
|
|
|
type="text"
|
|
|
|
name="Identity.Country"
|
2020-12-22 16:57:44 +01:00
|
|
|
[(ngModel)]="cipher.identity.country"
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
2021-05-03 20:55:42 +02:00
|
|
|
</ng-container>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="form-group">
|
|
|
|
<label for="notes">{{ "notes" | i18n }}</label>
|
2021-01-06 17:01:34 +01:00
|
|
|
<textarea
|
|
|
|
id="notes"
|
|
|
|
name="Notes"
|
2021-12-17 15:57:11 +01:00
|
|
|
rows="6"
|
2021-01-06 17:01:34 +01:00
|
|
|
[(ngModel)]="cipher.notes"
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
|
|
|
></textarea>
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
2021-11-03 22:41:04 +01:00
|
|
|
<app-vault-add-edit-custom-fields
|
|
|
|
[cipher]="cipher"
|
|
|
|
[thisCipherType]="cipher.type"
|
|
|
|
[viewOnly]="viewOnly"
|
|
|
|
[copy]="copy.bind(this)"
|
|
|
|
></app-vault-add-edit-custom-fields>
|
2020-02-12 22:11:38 +01:00
|
|
|
<ng-container *ngIf="allowOwnershipAssignment()">
|
2018-10-19 18:44:52 +02:00
|
|
|
<h3 class="mt-4">{{ "ownership" | i18n }}</h3>
|
2018-06-07 16:21:28 +02:00
|
|
|
<div class="row">
|
|
|
|
<div class="col-5">
|
|
|
|
<label for="organizationId">{{ "whoOwnsThisItem" | i18n }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<select
|
2020-04-08 22:48:30 +02:00
|
|
|
id="organizationId"
|
2021-01-06 17:01:34 +01:00
|
|
|
class="form-control"
|
2020-04-08 22:48:30 +02:00
|
|
|
name="OrganizationId"
|
2020-02-10 20:03:36 +01:00
|
|
|
[(ngModel)]="cipher.organizationId"
|
2020-04-08 22:48:30 +02:00
|
|
|
(change)="organizationChanged()"
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
2018-10-19 18:44:52 +02:00
|
|
|
<option *ngFor="let o of ownershipOptions" [ngValue]="o.value">{{ o.name }}</option>
|
|
|
|
</select>
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
2021-05-03 20:55:42 +02:00
|
|
|
</ng-container>
|
2020-02-10 20:03:36 +01:00
|
|
|
<ng-container *ngIf="(!editMode || cloneMode) && cipher.organizationId">
|
2018-10-19 18:44:52 +02:00
|
|
|
<h3 class="mt-4">{{ "collections" | i18n }}</h3>
|
|
|
|
<div *ngIf="!collections || !collections.length">
|
|
|
|
{{ "noCollectionsInList" | i18n }}
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
2018-10-19 18:44:52 +02:00
|
|
|
<ng-container *ngIf="collections && collections.length">
|
2019-03-28 16:59:53 +01:00
|
|
|
<div class="form-check" *ngFor="let c of collections; let i = index">
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
class="form-check-input"
|
|
|
|
type="checkbox"
|
|
|
|
[(ngModel)]="c.checked"
|
2021-01-06 17:01:34 +01:00
|
|
|
id="collection-{{ i }}"
|
|
|
|
name="Collection[{{ i }}].Checked"
|
2021-05-03 20:55:42 +02:00
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
2018-10-19 18:44:52 +02:00
|
|
|
<label class="form-check-label" for="collection-{{ i }}">{{ c.name }}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
2021-05-03 20:55:42 +02:00
|
|
|
</ng-container>
|
|
|
|
</ng-container>
|
2018-07-28 05:38:12 +02:00
|
|
|
<ng-container *ngIf="editMode">
|
2018-07-31 04:02:01 +02:00
|
|
|
<div class="small text-muted mt-4">
|
2021-12-17 15:57:11 +01:00
|
|
|
<div>
|
2018-07-28 05:38:12 +02:00
|
|
|
<b class="font-weight-semibold">{{ "dateUpdated" | i18n }}:</b>
|
|
|
|
{{ cipher.revisionDate | date: "medium" }}
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
2018-07-31 04:02:01 +02:00
|
|
|
<div *ngIf="showRevisionDate">
|
2018-07-28 05:38:12 +02:00
|
|
|
<b class="font-weight-semibold">{{ "datePasswordUpdated" | i18n }}:</b>
|
2018-07-31 04:02:01 +02:00
|
|
|
{{ cipher.passwordRevisionDisplayDate | date: "medium" }}
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
2018-07-31 04:02:01 +02:00
|
|
|
<div *ngIf="hasPasswordHistory">
|
2018-07-28 05:38:12 +02:00
|
|
|
<b class="font-weight-semibold">{{ "passwordHistory" | i18n }}:</b>
|
2021-01-22 00:00:03 +01:00
|
|
|
<a href="#" appStopClick (click)="viewHistory()" title="{{ 'view' | i18n }}">
|
2018-07-30 14:48:48 +02:00
|
|
|
{{ cipher.passwordHistory.length }}
|
2021-12-17 15:57:11 +01:00
|
|
|
</a>
|
|
|
|
</div>
|
2020-12-22 16:57:44 +01:00
|
|
|
<div class="ml-3" *ngIf="viewingPasswordHistory">
|
2018-07-30 14:48:48 +02:00
|
|
|
<div *ngFor="let ph of cipher.passwordHistory">
|
|
|
|
{{ ph.lastUsedDate | date: "short" }} -
|
2020-12-16 21:47:37 +01:00
|
|
|
<span class="password-wrapper text-monospace ml-2">{{ ph.password }}</span>
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
2018-06-06 23:25:57 +02:00
|
|
|
</div>
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
2021-05-03 20:55:42 +02:00
|
|
|
</ng-container>
|
2021-11-09 19:24:26 +01:00
|
|
|
<ng-container *ngIf="canUseReprompt">
|
2018-10-19 18:44:52 +02:00
|
|
|
<h3 class="mt-4">{{ "options" | i18n }}</h3>
|
2021-05-03 20:55:42 +02:00
|
|
|
<div class="form-check">
|
2021-12-17 15:57:11 +01:00
|
|
|
<input
|
2019-02-21 22:50:37 +01:00
|
|
|
class="form-check-input"
|
|
|
|
type="checkbox"
|
2021-05-03 20:55:42 +02:00
|
|
|
[ngModel]="reprompt"
|
|
|
|
(change)="repromptChanged()"
|
|
|
|
id="passwordPrompt"
|
|
|
|
name="passwordPrompt"
|
|
|
|
[disabled]="cipher.isDeleted || viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
/>
|
2021-06-21 20:52:34 +02:00
|
|
|
<label class="form-check-label" for="passwordPrompt">{{
|
2021-05-03 20:55:42 +02:00
|
|
|
"passwordPrompt" | i18n
|
2018-06-07 16:21:28 +02:00
|
|
|
}}</label>
|
2021-12-17 15:57:11 +01:00
|
|
|
<a
|
2019-10-11 16:35:24 +02:00
|
|
|
target="_blank"
|
|
|
|
rel="noopener"
|
|
|
|
appA11yTitle="{{ 'learnMore' | i18n }}"
|
2022-01-31 20:11:27 +01:00
|
|
|
href="https://bitwarden.com/help/managing-items/#protect-individual-items"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
2022-01-27 18:25:58 +01:00
|
|
|
<i class="bwi bwi-question-circle" aria-hidden="true"></i>
|
2021-12-17 15:57:11 +01:00
|
|
|
</a>
|
|
|
|
</div>
|
2021-05-03 20:55:42 +02:00
|
|
|
</ng-container>
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
2018-06-07 15:05:25 +02:00
|
|
|
<div class="modal-footer">
|
2021-12-17 15:57:11 +01:00
|
|
|
<button
|
2020-12-22 16:57:44 +01:00
|
|
|
type="submit"
|
|
|
|
class="btn btn-primary btn-submit"
|
|
|
|
[disabled]="form.loading"
|
|
|
|
*ngIf="!viewOnly"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
2022-01-27 18:25:58 +01:00
|
|
|
<i class="bwi bwi-spinner bwi-spin" title="{{ 'loading' | i18n }}" aria-hidden="true"></i>
|
2020-05-18 15:51:20 +02:00
|
|
|
<span>{{ (cipher?.isDeleted ? "restore" : "save") | i18n }}</span>
|
2018-06-07 05:23:14 +02:00
|
|
|
</button>
|
2018-07-18 05:15:15 +02:00
|
|
|
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal">
|
2020-12-22 16:57:44 +01:00
|
|
|
{{ (viewOnly ? "close" : "cancel") | i18n }}
|
2018-06-07 05:23:14 +02:00
|
|
|
</button>
|
2020-12-22 16:57:44 +01:00
|
|
|
<div class="ml-auto" *ngIf="cipher && !viewOnly">
|
2021-12-17 15:57:11 +01:00
|
|
|
<button
|
2019-02-21 22:50:37 +01:00
|
|
|
*ngIf="!organization && !cipher.isDeleted"
|
2018-07-18 05:15:15 +02:00
|
|
|
type="button"
|
2021-01-22 00:00:03 +01:00
|
|
|
(click)="toggleFavorite()"
|
2019-10-11 16:35:24 +02:00
|
|
|
class="btn btn-link"
|
2021-01-06 17:01:34 +01:00
|
|
|
appA11yTitle="{{ (cipher.favorite ? 'unfavorite' : 'favorite') | i18n }}"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
|
|
|
<i
|
2022-01-27 18:25:58 +01:00
|
|
|
class="bwi bwi-lg"
|
|
|
|
[ngClass]="{ 'bwi-star-f': cipher.favorite, 'bwi-star': !cipher.favorite }"
|
2019-10-11 16:35:24 +02:00
|
|
|
aria-hidden="true"
|
2021-12-17 15:57:11 +01:00
|
|
|
></i>
|
2018-06-07 05:23:14 +02:00
|
|
|
</button>
|
2021-12-17 15:57:11 +01:00
|
|
|
<button
|
2019-02-21 22:50:37 +01:00
|
|
|
#deleteBtn
|
2018-07-18 05:15:15 +02:00
|
|
|
type="button"
|
2019-02-21 22:50:37 +01:00
|
|
|
(click)="delete()"
|
2018-07-18 05:15:15 +02:00
|
|
|
class="btn btn-outline-danger"
|
2020-04-08 22:48:30 +02:00
|
|
|
appA11yTitle="{{ (cipher.isDeleted ? 'permanentlyDelete' : 'delete') | i18n }}"
|
2021-01-06 17:01:34 +01:00
|
|
|
*ngIf="editMode && !cloneMode"
|
|
|
|
[disabled]="deleteBtn.loading"
|
|
|
|
[appApiAction]="deletePromise"
|
2021-12-17 15:57:11 +01:00
|
|
|
>
|
|
|
|
<i
|
2022-01-27 18:25:58 +01:00
|
|
|
class="bwi bwi-trash bwi-lg bwi-fw"
|
2019-02-21 22:50:37 +01:00
|
|
|
[hidden]="deleteBtn.loading"
|
2019-10-11 16:35:24 +02:00
|
|
|
aria-hidden="true"
|
2021-12-17 15:57:11 +01:00
|
|
|
></i>
|
|
|
|
<i
|
2022-01-27 18:25:58 +01:00
|
|
|
class="bwi bwi-spinner bwi-spin bwi-lg bwi-fw"
|
2019-02-21 22:50:37 +01:00
|
|
|
[hidden]="!deleteBtn.loading"
|
2019-10-11 16:35:24 +02:00
|
|
|
title="{{ 'loading' | i18n }}"
|
|
|
|
aria-hidden="true"
|
2021-12-17 15:57:11 +01:00
|
|
|
></i>
|
2018-06-07 05:23:14 +02:00
|
|
|
</button>
|
2021-12-17 15:57:11 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
2018-06-07 05:23:14 +02:00
|
|
|
</form>
|
2018-06-06 23:25:57 +02:00
|
|
|
</div>
|
2020-04-08 22:48:30 +02:00
|
|
|
</div>
|