2018-01-24 04:21:14 +01:00
|
|
|
<div class="content">
|
2018-01-25 05:26:40 +01:00
|
|
|
<div class="inner-content" *ngIf="cipher">
|
2018-01-24 04:57:24 +01:00
|
|
|
<div class="box">
|
|
|
|
<div class="box-header">
|
2018-01-24 22:32:24 +01:00
|
|
|
{{'itemInformation' | i18n}}
|
2018-01-24 04:57:24 +01:00
|
|
|
</div>
|
2018-01-25 05:26:40 +01:00
|
|
|
<div class="box-content">
|
2018-01-24 04:57:24 +01:00
|
|
|
<div class="box-content-row">
|
2018-01-24 22:32:24 +01:00
|
|
|
<span class="row-label">{{'name' | i18n}}</span>
|
2018-01-24 06:06:05 +01:00
|
|
|
{{cipher.name}}
|
2018-01-24 04:57:24 +01:00
|
|
|
</div>
|
2018-01-25 20:25:44 +01:00
|
|
|
<!-- Login -->
|
2018-01-24 20:59:03 +01:00
|
|
|
<div *ngIf="cipher.login">
|
2018-01-29 23:11:31 +01:00
|
|
|
<div class="box-content-row box-content-row-flex" *ngIf="cipher.login.username">
|
|
|
|
<div class="row-main">
|
|
|
|
<span class="row-label">{{'username' | i18n}}</span>
|
|
|
|
{{cipher.login.username}}
|
|
|
|
</div>
|
2018-01-25 05:26:40 +01:00
|
|
|
<div class="action-buttons">
|
2018-02-16 19:59:46 +01:00
|
|
|
<a class="row-btn" href="#" appStopClick title="{{'copyUsername' | i18n}}"
|
2019-02-21 22:53:32 +01:00
|
|
|
(click)="copy(cipher.login.username, 'username', 'Username')">
|
2018-01-25 05:26:40 +01:00
|
|
|
<i class="fa fa-lg fa-clipboard"></i>
|
|
|
|
</a>
|
|
|
|
</div>
|
2018-01-24 20:59:03 +01:00
|
|
|
</div>
|
2018-01-29 23:11:31 +01:00
|
|
|
<div class="box-content-row box-content-row-flex" *ngIf="cipher.login.password">
|
|
|
|
<div class="row-main">
|
|
|
|
<span class="row-label">{{'password' | i18n}}</span>
|
2019-04-01 19:40:49 +02:00
|
|
|
<div [hidden]="showPassword" class="monospaced">
|
2018-12-08 19:48:30 +01:00
|
|
|
{{cipher.login.maskedPassword}}</div>
|
2019-04-01 19:40:49 +02:00
|
|
|
<div [hidden]="!showPassword" class="monospaced password-wrapper" appSelectCopy
|
2019-02-21 22:53:32 +01:00
|
|
|
[innerHTML]="cipher.login.password | colorPassword"></div>
|
2018-01-29 23:11:31 +01:00
|
|
|
</div>
|
2018-01-25 05:26:40 +01:00
|
|
|
<div class="action-buttons">
|
2018-02-28 17:35:48 +01:00
|
|
|
<button type="button" #checkPasswordBtn class="row-btn btn" appBlurClick
|
2019-02-21 22:53:32 +01:00
|
|
|
title="{{'checkPassword' | i18n}}" (click)="checkPassword()"
|
|
|
|
[appApiAction]="checkPasswordPromise" [disabled]="checkPasswordBtn.loading">
|
2018-02-28 17:35:48 +01:00
|
|
|
<i class="fa fa-lg fa-check-circle" [hidden]="checkPasswordBtn.loading"></i>
|
|
|
|
<i class="fa fa-lg fa-spinner fa-spin" [hidden]="!checkPasswordBtn.loading"></i>
|
|
|
|
</button>
|
2018-01-25 05:26:40 +01:00
|
|
|
<a class="row-btn" href="#" appStopClick title="{{'toggleVisibility' | i18n}}"
|
2019-02-21 22:53:32 +01:00
|
|
|
(click)="togglePassword()">
|
2018-01-25 05:26:40 +01:00
|
|
|
<i class="fa fa-lg"
|
2019-02-21 22:53:32 +01:00
|
|
|
[ngClass]="{'fa-eye': !showPassword, 'fa-eye-slash': showPassword}"></i>
|
2018-01-25 05:26:40 +01:00
|
|
|
</a>
|
2018-02-16 19:59:46 +01:00
|
|
|
<a class="row-btn" href="#" appStopClick title="{{'copyPassword' | i18n}}"
|
2019-02-21 22:53:32 +01:00
|
|
|
(click)="copy(cipher.login.password, 'password', 'Password')">
|
2018-01-25 05:26:40 +01:00
|
|
|
<i class="fa fa-lg fa-clipboard"></i>
|
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-01-29 23:11:31 +01:00
|
|
|
<div class="box-content-row box-content-row-flex totp" [ngClass]="{'low': totpLow}"
|
2019-02-21 22:53:32 +01:00
|
|
|
*ngIf="cipher.login.totp && totpCode">
|
2018-01-29 23:11:31 +01:00
|
|
|
<div class="row-main">
|
|
|
|
<span class="row-label">{{'verificationCodeTotp' | i18n}}</span>
|
|
|
|
<span class="totp-code">{{totpCodeFormatted}}</span>
|
2018-01-25 05:26:40 +01:00
|
|
|
</div>
|
|
|
|
<span class="totp-countdown">
|
|
|
|
<span class="totp-sec">{{totpSec}}</span>
|
|
|
|
<svg>
|
|
|
|
<g>
|
|
|
|
<circle class="totp-circle inner" r="12.6" cy="16" cx="16"
|
2019-02-21 22:53:32 +01:00
|
|
|
[ngStyle]="{'stroke-dashoffset.px': totpDash}"></circle>
|
2018-01-25 05:26:40 +01:00
|
|
|
<circle class="totp-circle outer" r="14" cy="16" cx="16"></circle>
|
|
|
|
</g>
|
|
|
|
</svg>
|
|
|
|
</span>
|
2018-01-29 23:11:31 +01:00
|
|
|
<div class="action-buttons">
|
|
|
|
<a class="row-btn" href="#" appStopClick title="{{'copyValue' | i18n}}"
|
2019-02-21 22:53:32 +01:00
|
|
|
(click)="copy(totpCode, 'verificationCodeTotp', 'TOTP')">
|
2018-01-29 23:11:31 +01:00
|
|
|
<i class="fa fa-lg fa-clipboard"></i>
|
|
|
|
</a>
|
|
|
|
</div>
|
2018-01-24 20:59:03 +01:00
|
|
|
</div>
|
2018-01-24 04:57:24 +01:00
|
|
|
</div>
|
2018-01-25 20:25:44 +01:00
|
|
|
<!-- Card -->
|
|
|
|
<div *ngIf="cipher.card">
|
|
|
|
<div class="box-content-row" *ngIf="cipher.card.cardholderName">
|
|
|
|
<span class="row-label">{{'cardholderName' | i18n}}</span>
|
|
|
|
{{cipher.card.cardholderName}}
|
|
|
|
</div>
|
2018-01-29 23:11:31 +01:00
|
|
|
<div class="box-content-row box-content-row-flex" *ngIf="cipher.card.number">
|
|
|
|
<div class="row-main">
|
|
|
|
<span class="row-label">{{'number' | i18n}}</span>
|
|
|
|
{{cipher.card.number}}
|
|
|
|
</div>
|
2018-01-25 20:25:44 +01:00
|
|
|
<div class="action-buttons">
|
2018-02-16 19:59:46 +01:00
|
|
|
<a class="row-btn" href="#" appStopClick title="{{'copyNumber' | i18n}}"
|
2019-02-21 22:53:32 +01:00
|
|
|
(click)="copy(cipher.card.number, 'number', 'Number')">
|
2018-01-25 20:25:44 +01:00
|
|
|
<i class="fa fa-lg fa-clipboard"></i>
|
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="box-content-row" *ngIf="cipher.card.brand">
|
|
|
|
<span class="row-label">{{'brand' | i18n}}</span>
|
|
|
|
{{cipher.card.brand}}
|
|
|
|
</div>
|
|
|
|
<div class="box-content-row" *ngIf="cipher.card.expiration">
|
|
|
|
<span class="row-label">{{'expiration' | i18n}}</span>
|
|
|
|
{{cipher.card.expiration}}
|
|
|
|
</div>
|
2018-01-29 23:11:31 +01:00
|
|
|
<div class="box-content-row box-content-row-flex" *ngIf="cipher.card.code">
|
|
|
|
<div class="row-main">
|
|
|
|
<span class="row-label">{{'securityCode' | i18n}}</span>
|
2018-06-18 23:29:45 +02:00
|
|
|
<span [hidden]="showCardCode" class="monospaced">{{cipher.card.maskedCode}}</span>
|
|
|
|
<span [hidden]="!showCardCode" class="monospaced">{{cipher.card.code}}</span>
|
2018-01-29 23:11:31 +01:00
|
|
|
</div>
|
2018-01-25 20:25:44 +01:00
|
|
|
<div class="action-buttons">
|
2018-06-13 18:34:41 +02:00
|
|
|
<a class="row-btn" href="#" appStopClick title="{{'toggleVisibility' | i18n}}"
|
2019-02-21 22:53:32 +01:00
|
|
|
(click)="toggleCardCode()">
|
2018-06-13 18:34:41 +02:00
|
|
|
<i class="fa fa-lg"
|
2019-02-21 22:53:32 +01:00
|
|
|
[ngClass]="{'fa-eye': !showCardCode, 'fa-eye-slash': showCardCode}"></i>
|
2018-06-13 18:34:41 +02:00
|
|
|
</a>
|
2018-02-16 19:59:46 +01:00
|
|
|
<a class="row-btn" href="#" appStopClick title="{{'copySecurityCode' | i18n}}"
|
2019-02-21 22:53:32 +01:00
|
|
|
(click)="copy(cipher.card.code, 'securityCode', 'Security Code')">
|
2018-01-25 20:25:44 +01:00
|
|
|
<i class="fa fa-lg fa-clipboard"></i>
|
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<!-- Identity -->
|
|
|
|
<div *ngIf="cipher.identity">
|
|
|
|
<div class="box-content-row" *ngIf="cipher.identity.fullName">
|
|
|
|
<span class="row-label">{{'identityName' | i18n}}</span>
|
|
|
|
{{cipher.identity.fullName}}
|
|
|
|
</div>
|
|
|
|
<div class="box-content-row" *ngIf="cipher.identity.username">
|
|
|
|
<span class="row-label">{{'username' | i18n}}</span>
|
|
|
|
{{cipher.identity.username}}
|
|
|
|
</div>
|
|
|
|
<div class="box-content-row" *ngIf="cipher.identity.company">
|
|
|
|
<span class="row-label">{{'company' | i18n}}</span>
|
|
|
|
{{cipher.identity.company}}
|
|
|
|
</div>
|
|
|
|
<div class="box-content-row" *ngIf="cipher.identity.ssn">
|
|
|
|
<span class="row-label">{{'ssn' | i18n}}</span>
|
|
|
|
{{cipher.identity.ssn}}
|
|
|
|
</div>
|
|
|
|
<div class="box-content-row" *ngIf="cipher.identity.passportNumber">
|
|
|
|
<span class="row-label">{{'passportNumber' | i18n}}</span>
|
|
|
|
{{cipher.identity.passportNumber}}
|
|
|
|
</div>
|
|
|
|
<div class="box-content-row" *ngIf="cipher.identity.licenseNumber">
|
|
|
|
<span class="row-label">{{'licenseNumber' | i18n}}</span>
|
|
|
|
{{cipher.identity.licenseNumber}}
|
|
|
|
</div>
|
|
|
|
<div class="box-content-row" *ngIf="cipher.identity.email">
|
|
|
|
<span class="row-label">{{'email' | i18n}}</span>
|
|
|
|
{{cipher.identity.email}}
|
|
|
|
</div>
|
|
|
|
<div class="box-content-row" *ngIf="cipher.identity.phone">
|
|
|
|
<span class="row-label">{{'phone' | i18n}}</span>
|
|
|
|
{{cipher.identity.phone}}
|
|
|
|
</div>
|
|
|
|
<div class="box-content-row"
|
2019-02-21 22:53:32 +01:00
|
|
|
*ngIf="cipher.identity.address1 || cipher.identity.city || cipher.identity.country">
|
2018-01-25 20:25:44 +01:00
|
|
|
<span class="row-label">{{'address' | i18n}}</span>
|
|
|
|
<div *ngIf="cipher.identity.address1">{{cipher.identity.address1}}</div>
|
|
|
|
<div *ngIf="cipher.identity.address2">{{cipher.identity.address2}}</div>
|
|
|
|
<div *ngIf="cipher.identity.address3">{{cipher.identity.address3}}</div>
|
|
|
|
<div *ngIf="cipher.identity.city || cipher.identity.state || cipher.identity.postalCode">
|
|
|
|
{{cipher.identity.city || '-'}},
|
|
|
|
{{cipher.identity.state || '-'}},
|
|
|
|
{{cipher.identity.postalCode || '-'}}
|
|
|
|
</div>
|
|
|
|
<div *ngIf="cipher.identity.country">{{cipher.identity.country}}</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-01-24 04:57:24 +01:00
|
|
|
</div>
|
2018-01-25 05:26:40 +01:00
|
|
|
</div>
|
2018-03-02 05:45:12 +01:00
|
|
|
<div class="box" *ngIf="cipher.login && cipher.login.hasUris">
|
|
|
|
<div class="box-content">
|
|
|
|
<div class="box-content-row box-content-row-flex" *ngFor="let u of cipher.login.uris; let i = index">
|
|
|
|
<div class="row-main">
|
|
|
|
<span class="row-label" *ngIf="!u.isWebsite">{{'uri' | i18n}}</span>
|
|
|
|
<span class="row-label" *ngIf="u.isWebsite">{{'website' | i18n}}</span>
|
2018-04-19 20:43:32 +02:00
|
|
|
<span title="{{u.uri}}">{{u.hostnameOrUri}}</span>
|
2018-03-02 05:45:12 +01:00
|
|
|
</div>
|
|
|
|
<div class="action-buttons">
|
2019-02-21 22:53:32 +01:00
|
|
|
<a class="row-btn" href="#" appStopClick title="{{'launch' | i18n}}" *ngIf="u.canLaunch"
|
|
|
|
(click)="launch(u)">
|
2018-03-02 05:45:12 +01:00
|
|
|
<i class="fa fa-lg fa-share-square-o"></i>
|
|
|
|
</a>
|
2018-04-06 05:50:06 +02:00
|
|
|
<a class="row-btn" href="#" appStopClick title="{{'copyUri' | i18n}}"
|
2019-02-21 22:53:32 +01:00
|
|
|
(click)="copy(u.uri, u.isWebsite ? 'website' : 'uri', 'URI')">
|
2018-03-02 05:45:12 +01:00
|
|
|
<i class="fa fa-lg fa-clipboard"></i>
|
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-01-25 05:26:40 +01:00
|
|
|
<div class="box" *ngIf="cipher.notes">
|
|
|
|
<div class="box-header">
|
|
|
|
{{'notes' | i18n}}
|
|
|
|
</div>
|
|
|
|
<div class="box-content">
|
2019-03-28 17:09:08 +01:00
|
|
|
<div class="box-content-row pre-wrap">{{cipher.notes}}</div>
|
2018-01-25 05:26:40 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="box" *ngIf="cipher.hasFields">
|
|
|
|
<div class="box-header">
|
|
|
|
{{'customFields' | i18n}}
|
|
|
|
</div>
|
|
|
|
<div class="box-content">
|
2018-01-29 23:11:31 +01:00
|
|
|
<div class="box-content-row box-content-row-flex" *ngFor="let field of cipher.fields">
|
|
|
|
<div class="row-main">
|
|
|
|
<span class="row-label">{{field.name}}</span>
|
|
|
|
<div *ngIf="field.type === fieldType.Text">
|
|
|
|
{{field.value || ' '}}
|
|
|
|
</div>
|
|
|
|
<div *ngIf="field.type === fieldType.Hidden">
|
2018-12-21 05:01:21 +01:00
|
|
|
<span [hidden]="!field.showValue" class="monospaced show-whitespace">{{field.value}}</span>
|
2018-01-29 23:11:31 +01:00
|
|
|
<span [hidden]="field.showValue" class="monospaced">{{field.maskedValue}}</span>
|
|
|
|
</div>
|
|
|
|
<div *ngIf="field.type === fieldType.Boolean">
|
|
|
|
<i class="fa fa-check-square-o" *ngIf="field.value === 'true'"></i>
|
|
|
|
<i class="fa fa-square-o" *ngIf="field.value !== 'true'"></i>
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-01-25 20:25:44 +01:00
|
|
|
<div class="action-buttons">
|
|
|
|
<a class="row-btn" href="#" appStopClick title="{{'toggleVisibility' | i18n}}"
|
2019-02-21 22:53:32 +01:00
|
|
|
*ngIf="field.type === fieldType.Hidden" (click)="toggleFieldValue(field)">
|
2018-01-25 20:25:44 +01:00
|
|
|
<i class="fa fa-lg"
|
2019-02-21 22:53:32 +01:00
|
|
|
[ngClass]="{'fa-eye': !field.showValue, 'fa-eye-slash': field.showValue}"></i>
|
2018-01-25 20:25:44 +01:00
|
|
|
</a>
|
|
|
|
<a class="row-btn" href="#" appStopClick title="{{'copyValue' | i18n}}"
|
2019-02-21 22:53:32 +01:00
|
|
|
*ngIf="field.value && field.type !== fieldType.Boolean"
|
|
|
|
(click)="copy(field.value, 'value', 'Field')">
|
2018-01-25 20:25:44 +01:00
|
|
|
<i class="fa fa-lg fa-clipboard"></i>
|
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-01-25 05:26:40 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
2018-11-16 13:45:23 +01:00
|
|
|
<div class="box" *ngIf="cipher.hasAttachments && (canAccessPremium || cipher.organizationId)">
|
2018-01-25 05:26:40 +01:00
|
|
|
<div class="box-header">
|
|
|
|
{{'attachments' | i18n}}
|
|
|
|
</div>
|
|
|
|
<div class="box-content">
|
2018-02-04 21:52:32 +01:00
|
|
|
<a class="box-content-row box-content-row-flex text-default"
|
2019-02-21 22:53:32 +01:00
|
|
|
*ngFor="let attachment of cipher.attachments" href="#" appStopClick appBlurCLick
|
|
|
|
(click)="downloadAttachment(attachment)">
|
2018-01-30 05:19:55 +01:00
|
|
|
<span class="row-main">{{attachment.fileName}}</span>
|
2018-01-25 20:25:44 +01:00
|
|
|
<small class="row-sub-label">{{attachment.sizeName}}</small>
|
2018-01-30 05:19:55 +01:00
|
|
|
<i class="fa fa-download fa-fw row-sub-icon" *ngIf="!attachment.downloading"></i>
|
|
|
|
<i class="fa fa-spinner fa-fw fa-spin row-sub-icon" *ngIf="attachment.downloading"></i>
|
2018-01-25 20:25:44 +01:00
|
|
|
</a>
|
2018-01-24 04:57:24 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
2018-07-30 16:05:36 +02:00
|
|
|
<div class="box">
|
2018-07-31 04:22:17 +02:00
|
|
|
<div class="box-footer">
|
|
|
|
<div>
|
|
|
|
<b class="font-weight-semibold">{{'dateUpdated' | i18n}}:</b>
|
2018-07-30 16:05:36 +02:00
|
|
|
{{cipher.revisionDate | date:'medium'}}
|
|
|
|
</div>
|
2018-07-31 04:22:17 +02:00
|
|
|
<div *ngIf="cipher.passwordRevisionDisplayDate">
|
|
|
|
<b class="font-weight-semibold">{{'datePasswordUpdated' | i18n}}:</b>
|
|
|
|
{{cipher.passwordRevisionDisplayDate | date:'medium'}}
|
|
|
|
</div>
|
|
|
|
<div *ngIf="cipher.hasPasswordHistory">
|
2019-02-21 22:53:32 +01:00
|
|
|
<b class="font-weight-semibold">{{'passwordHistory' | i18n}}:</b>
|
2018-08-20 23:01:25 +02:00
|
|
|
<a href="#" (click)="viewHistory()" appStopClick title="{{'passwordHistory' | i18n}}">
|
2018-07-31 04:22:17 +02:00
|
|
|
{{cipher.passwordHistory.length}}
|
|
|
|
</a>
|
2018-07-30 16:05:36 +02:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2018-01-24 04:57:24 +01:00
|
|
|
</div>
|
2018-01-24 04:21:14 +01:00
|
|
|
</div>
|
|
|
|
<div class="footer">
|
2018-01-31 18:52:12 +01:00
|
|
|
<button appBlurClick class="primary" (click)="edit()" title="{{'edit' | i18n}}">
|
|
|
|
<i class="fa fa-pencil fa-fw fa-lg"></i>
|
|
|
|
</button>
|
2018-01-24 04:21:14 +01:00
|
|
|
</div>
|