2018-04-05 16:29:11 +02:00
|
|
|
<header>
|
2021-02-03 20:36:05 +01:00
|
|
|
<div class="left">
|
2018-04-05 21:35:56 +02:00
|
|
|
<app-pop-out></app-pop-out>
|
2021-12-21 15:43:35 +01:00
|
|
|
</div>
|
2021-12-13 21:56:23 +01:00
|
|
|
<h1 class="sr-only">{{ "myVault" | i18n }}</h1>
|
2018-04-09 16:50:28 +02:00
|
|
|
<div class="search">
|
2021-12-21 15:43:35 +01:00
|
|
|
<input
|
2019-03-14 03:54:18 +01:00
|
|
|
type="{{ searchTypeSearch ? 'search' : 'text' }}"
|
|
|
|
placeholder="{{ 'searchVault' | i18n }}"
|
|
|
|
id="search"
|
2021-02-18 09:40:13 +01:00
|
|
|
[(ngModel)]="searchText"
|
|
|
|
(input)="search(200)"
|
|
|
|
autocomplete="off"
|
|
|
|
appAutofocus
|
|
|
|
(keydown)="closeOnEsc($event)"
|
2021-12-21 15:43:35 +01:00
|
|
|
/>
|
2018-04-09 16:50:28 +02:00
|
|
|
<i class="fa fa-search"></i>
|
2021-12-21 15:43:35 +01:00
|
|
|
</div>
|
2018-04-05 16:29:11 +02:00
|
|
|
<div class="right">
|
2021-07-31 21:03:51 +02:00
|
|
|
<button type="button" appBlurClick (click)="addCipher()" appA11yTitle="{{ 'addItem' | i18n }}">
|
2019-10-08 23:04:44 +02:00
|
|
|
<i class="fa fa-plus fa-lg fa-fw" aria-hidden="true"></i>
|
2021-07-31 21:03:51 +02:00
|
|
|
</button>
|
2021-12-21 15:43:35 +01:00
|
|
|
</div>
|
2018-04-05 16:29:11 +02:00
|
|
|
</header>
|
|
|
|
<content>
|
2018-08-13 17:53:16 +02:00
|
|
|
<div class="no-items" *ngIf="(!ciphers || !ciphers.length) && !showSearching()">
|
2018-04-09 16:50:28 +02:00
|
|
|
<i class="fa fa-spinner fa-spin fa-3x" *ngIf="!loaded"></i>
|
|
|
|
<ng-container *ngIf="loaded">
|
2022-01-21 16:31:01 +01:00
|
|
|
<img class="no-items-image" />
|
2018-04-09 16:50:28 +02:00
|
|
|
<p>{{ "noItemsInList" | i18n }}</p>
|
2021-07-31 21:03:51 +02:00
|
|
|
<button type="button" (click)="addCipher()" class="btn block primary link">
|
|
|
|
{{ "addItem" | i18n }}
|
|
|
|
</button>
|
2018-04-09 16:50:28 +02:00
|
|
|
</ng-container>
|
2021-12-21 15:43:35 +01:00
|
|
|
</div>
|
2018-08-13 17:53:16 +02:00
|
|
|
<ng-container *ngIf="ciphers && ciphers.length && !showSearching()">
|
2021-06-03 00:50:36 +02:00
|
|
|
<div class="box list" *ngIf="favoriteCiphers">
|
2021-11-02 23:28:53 +01:00
|
|
|
<h2 class="box-header">
|
2021-06-03 00:50:36 +02:00
|
|
|
{{ "favorites" | i18n }}
|
|
|
|
<span class="flex-right">{{ favoriteCiphers.length }}</span>
|
2021-12-21 15:43:35 +01:00
|
|
|
</h2>
|
2021-06-03 00:50:36 +02:00
|
|
|
<div class="box-content">
|
|
|
|
<app-cipher-row
|
|
|
|
*ngFor="let favoriteCipher of favoriteCiphers"
|
|
|
|
[cipher]="favoriteCipher"
|
|
|
|
title="{{ 'viewItem' | i18n }}"
|
|
|
|
(onSelected)="selectCipher($event)"
|
|
|
|
(launchEvent)="launchCipher($event)"
|
|
|
|
></app-cipher-row>
|
2021-12-21 15:43:35 +01:00
|
|
|
</div>
|
2018-04-05 16:29:11 +02:00
|
|
|
</div>
|
2021-06-03 00:50:36 +02:00
|
|
|
<div class="box list">
|
2021-12-13 21:56:23 +01:00
|
|
|
<h2 class="box-header">
|
2021-06-03 00:50:36 +02:00
|
|
|
{{ "types" | i18n }}
|
|
|
|
<span class="flex-right">4</span>
|
2021-12-13 21:56:23 +01:00
|
|
|
</h2>
|
|
|
|
<div class="box-content single-line">
|
2021-12-21 15:43:35 +01:00
|
|
|
<button
|
2021-07-31 21:03:51 +02:00
|
|
|
type="button"
|
|
|
|
class="box-content-row"
|
|
|
|
appStopClick
|
|
|
|
appBlurClick
|
2021-12-13 21:56:23 +01:00
|
|
|
(click)="selectType(cipherType.Login)"
|
2021-12-21 15:43:35 +01:00
|
|
|
>
|
2021-06-03 00:50:36 +02:00
|
|
|
<div class="row-main">
|
|
|
|
<div class="icon"><i class="fa fa-fw fa-lg fa-globe"></i></div>
|
2021-12-13 21:56:23 +01:00
|
|
|
<span class="text">{{ "typeLogin" | i18n }}</span>
|
2021-12-21 15:43:35 +01:00
|
|
|
</div>
|
2021-06-03 00:50:36 +02:00
|
|
|
<span class="row-sub-label">{{ typeCounts.get(cipherType.Login) || 0 }}</span>
|
2018-04-09 16:50:28 +02:00
|
|
|
<span><i class="fa fa-chevron-right fa-lg row-sub-icon"></i></span>
|
2021-07-31 21:03:51 +02:00
|
|
|
</button>
|
2021-12-21 15:43:35 +01:00
|
|
|
<button
|
2021-07-31 21:03:51 +02:00
|
|
|
type="button"
|
|
|
|
class="box-content-row"
|
|
|
|
appStopClick
|
2018-04-09 16:50:28 +02:00
|
|
|
appBlurClick
|
|
|
|
(click)="selectType(cipherType.Card)"
|
2021-12-21 15:43:35 +01:00
|
|
|
>
|
2018-04-09 16:50:28 +02:00
|
|
|
<div class="row-main">
|
2019-03-14 03:54:18 +01:00
|
|
|
<div class="icon"><i class="fa fa-fw fa-lg fa-credit-card"></i></div>
|
|
|
|
<span class="text">{{ "typeCard" | i18n }}</span>
|
2021-12-21 15:43:35 +01:00
|
|
|
</div>
|
2019-03-14 03:54:18 +01:00
|
|
|
<span class="row-sub-label">{{ typeCounts.get(cipherType.Card) || 0 }}</span>
|
|
|
|
<span><i class="fa fa-chevron-right fa-lg row-sub-icon"></i></span>
|
2021-07-31 21:03:51 +02:00
|
|
|
</button>
|
2021-12-21 15:43:35 +01:00
|
|
|
<button
|
2019-03-14 03:54:18 +01:00
|
|
|
type="button"
|
2021-07-31 21:03:51 +02:00
|
|
|
class="box-content-row"
|
|
|
|
appStopClick
|
2019-03-14 03:54:18 +01:00
|
|
|
appBlurClick
|
|
|
|
(click)="selectType(cipherType.Identity)"
|
2021-12-21 15:43:35 +01:00
|
|
|
>
|
2019-03-14 03:54:18 +01:00
|
|
|
<div class="row-main">
|
|
|
|
<div class="icon"><i class="fa fa-fw fa-lg fa-id-card-o"></i></div>
|
|
|
|
<span class="text">{{ "typeIdentity" | i18n }}</span>
|
2021-12-21 15:43:35 +01:00
|
|
|
</div>
|
2021-02-18 09:40:13 +01:00
|
|
|
<span class="row-sub-label">{{ typeCounts.get(cipherType.Identity) || 0 }}</span>
|
|
|
|
<span><i class="fa fa-chevron-right fa-lg row-sub-icon"></i></span>
|
|
|
|
</button>
|
|
|
|
<button
|
|
|
|
type="button"
|
2021-07-31 21:03:51 +02:00
|
|
|
class="box-content-row"
|
2021-02-18 09:40:13 +01:00
|
|
|
appStopClick
|
|
|
|
appBlurClick
|
|
|
|
(click)="selectType(cipherType.SecureNote)"
|
2021-12-21 15:43:35 +01:00
|
|
|
>
|
2021-02-18 09:40:13 +01:00
|
|
|
<div class="row-main">
|
2021-06-03 00:50:36 +02:00
|
|
|
<div class="icon"><i class="fa fa-fw fa-lg fa-sticky-note-o"></i></div>
|
2021-02-18 09:40:13 +01:00
|
|
|
<span class="text">{{ "typeSecureNote" | i18n }}</span>
|
2021-12-21 15:43:35 +01:00
|
|
|
</div>
|
2018-04-09 16:50:28 +02:00
|
|
|
<span class="row-sub-label">{{ typeCounts.get(cipherType.SecureNote) || 0 }}</span>
|
|
|
|
<span><i class="fa fa-chevron-right fa-lg row-sub-icon"></i></span>
|
2021-07-31 21:03:51 +02:00
|
|
|
</button>
|
2021-12-21 15:43:35 +01:00
|
|
|
</div>
|
2018-04-05 16:29:11 +02:00
|
|
|
</div>
|
|
|
|
<div class="box list" *ngIf="nestedFolders?.length">
|
2021-07-31 21:03:51 +02:00
|
|
|
<h2 class="box-header">
|
|
|
|
{{ "folders" | i18n }}
|
|
|
|
<span class="flex-right">{{ folderCount }}</span>
|
2021-12-21 15:43:35 +01:00
|
|
|
</h2>
|
2021-07-31 21:03:51 +02:00
|
|
|
<div class="box-content single-line">
|
|
|
|
<button
|
|
|
|
type="button"
|
|
|
|
*ngFor="let f of nestedFolders"
|
|
|
|
class="box-content-row"
|
|
|
|
appStopClick
|
|
|
|
appBlurClick
|
|
|
|
(click)="selectFolder(f.node)"
|
2021-12-21 15:43:35 +01:00
|
|
|
>
|
2021-06-03 00:50:36 +02:00
|
|
|
<div class="row-main">
|
|
|
|
<div class="icon">
|
2021-12-21 15:43:35 +01:00
|
|
|
<i
|
2019-10-08 23:04:44 +02:00
|
|
|
class="fa fa-fw fa-lg"
|
|
|
|
[ngClass]="{ 'fa-folder-open': f.node.id, 'fa-folder-open-o': !f.node.id }"
|
2021-12-21 15:43:35 +01:00
|
|
|
></i>
|
|
|
|
</div>
|
2019-10-08 23:04:44 +02:00
|
|
|
<span class="text">{{ f.node.name }}</span>
|
2021-12-21 15:43:35 +01:00
|
|
|
</div>
|
2021-06-03 00:50:36 +02:00
|
|
|
<span class="row-sub-label">{{ folderCounts.get(f.node.id) || 0 }}</span>
|
2019-10-08 23:04:44 +02:00
|
|
|
<span><i class="fa fa-chevron-right fa-lg row-sub-icon"></i></span>
|
2018-04-05 23:27:31 +02:00
|
|
|
</button>
|
2021-12-21 15:43:35 +01:00
|
|
|
</div>
|
2018-04-05 16:29:11 +02:00
|
|
|
</div>
|
2018-08-13 17:53:16 +02:00
|
|
|
<div class="box list" *ngIf="nestedCollections && nestedCollections.length">
|
|
|
|
<h2 class="box-header">
|
|
|
|
{{ "collections" | i18n }}
|
2018-04-09 16:50:28 +02:00
|
|
|
<span class="flex-right">{{ nestedCollections.length }}</span>
|
2021-12-21 15:43:35 +01:00
|
|
|
</h2>
|
2018-04-09 16:50:28 +02:00
|
|
|
<div class="box-content single-line">
|
2021-12-21 15:43:35 +01:00
|
|
|
<button
|
2021-07-31 21:03:51 +02:00
|
|
|
type="button"
|
2018-04-09 16:50:28 +02:00
|
|
|
*ngFor="let nestedCollection of nestedCollections"
|
2021-07-31 21:03:51 +02:00
|
|
|
class="box-content-row"
|
|
|
|
appStopClick
|
|
|
|
appBlurClick
|
2018-04-09 16:50:28 +02:00
|
|
|
(click)="selectCollection(nestedCollection.node)"
|
2021-12-21 15:43:35 +01:00
|
|
|
>
|
2021-06-03 00:50:36 +02:00
|
|
|
<div class="row-main">
|
2018-04-09 16:50:28 +02:00
|
|
|
<div class="icon"><i class="fa fa-fw fa-lg fa-cube"></i></div>
|
|
|
|
<span class="text">{{ nestedCollection.node.name }}</span>
|
2021-12-21 15:43:35 +01:00
|
|
|
</div>
|
2021-06-03 00:50:36 +02:00
|
|
|
<span class="row-sub-label">{{
|
2018-04-09 16:50:28 +02:00
|
|
|
collectionCounts.get(nestedCollection.node.id) || 0
|
2021-12-21 15:43:35 +01:00
|
|
|
}}</span>
|
2018-04-09 16:50:28 +02:00
|
|
|
<span><i class="fa fa-chevron-right fa-lg row-sub-icon"></i></span>
|
2021-07-31 21:03:51 +02:00
|
|
|
</button>
|
2018-04-09 16:50:28 +02:00
|
|
|
</div>
|
|
|
|
</div>
|
2021-06-03 00:50:36 +02:00
|
|
|
<div class="box list" *ngIf="showNoFolderCiphers">
|
2021-11-02 23:28:53 +01:00
|
|
|
<h2 class="box-header">
|
2021-06-03 00:50:36 +02:00
|
|
|
{{ "noneFolder" | i18n }}
|
|
|
|
<div class="flex-right">{{ noFolderCiphers.length }}</div>
|
2021-11-02 23:28:53 +01:00
|
|
|
</h2>
|
2021-06-03 00:50:36 +02:00
|
|
|
<div class="box-content">
|
|
|
|
<app-cipher-row
|
|
|
|
*ngFor="let noFolderCipher of noFolderCiphers"
|
|
|
|
[cipher]="noFolderCipher"
|
|
|
|
title="{{ 'viewItem' | i18n }}"
|
2021-07-31 21:03:51 +02:00
|
|
|
(onSelected)="selectCipher($event)"
|
|
|
|
(launchEvent)="launchCipher($event)"
|
|
|
|
></app-cipher-row>
|
2021-12-21 15:43:35 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
2021-07-31 21:03:51 +02:00
|
|
|
<div class="box list" *ngIf="deletedCount">
|
2021-06-03 00:50:36 +02:00
|
|
|
<h2 class="box-header">
|
|
|
|
{{ "trash" | i18n }}
|
|
|
|
<span class="flex-right">{{ deletedCount }}</span>
|
2021-07-31 21:03:51 +02:00
|
|
|
</h2>
|
2021-06-03 00:50:36 +02:00
|
|
|
<div class="box-content single-line">
|
|
|
|
<button
|
|
|
|
type="button"
|
2021-07-31 21:03:51 +02:00
|
|
|
class="box-content-row"
|
|
|
|
appStopClick
|
|
|
|
appBlurClick
|
2021-06-03 00:50:36 +02:00
|
|
|
(click)="selectTrash()"
|
|
|
|
>
|
|
|
|
<div class="row-main">
|
|
|
|
<div class="icon"><i class="fa fa-fw fa-lg fa-trash-o"></i></div>
|
|
|
|
<span class="text">{{ "trash" | i18n }}</span>
|
|
|
|
</div>
|
|
|
|
<span class="row-sub-label">{{ deletedCount }}</span>
|
|
|
|
<span><i class="fa fa-chevron-right fa-lg row-sub-icon"></i></span>
|
2021-07-31 21:03:51 +02:00
|
|
|
</button>
|
2021-06-03 00:50:36 +02:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</ng-container>
|
|
|
|
<ng-container *ngIf="showSearching()">
|
|
|
|
<div class="no-items" *ngIf="!ciphers || !ciphers.length">
|
|
|
|
<p>{{ "noItemsInList" | i18n }}</p>
|
|
|
|
</div>
|
|
|
|
<cdk-virtual-scroll-viewport
|
2021-08-11 04:52:44 +02:00
|
|
|
itemSize="46"
|
|
|
|
minBufferPx="400"
|
|
|
|
maxBufferPx="600"
|
2021-06-03 00:50:36 +02:00
|
|
|
*ngIf="ciphers && ciphers.length > 0"
|
2021-12-21 15:43:35 +01:00
|
|
|
>
|
2021-06-03 00:50:36 +02:00
|
|
|
<div class="box list full-list">
|
|
|
|
<div class="box-content">
|
|
|
|
<app-cipher-row
|
2018-08-13 17:53:16 +02:00
|
|
|
*cdkVirtualFor="let searchedCipher of ciphers"
|
|
|
|
[cipher]="searchedCipher"
|
2018-04-09 16:50:28 +02:00
|
|
|
title="{{ 'viewItem' | i18n }}"
|
2021-06-03 00:47:02 +02:00
|
|
|
(onSelected)="selectCipher($event)"
|
|
|
|
(launchEvent)="launchCipher($event)"
|
2018-04-09 16:50:28 +02:00
|
|
|
></app-cipher-row>
|
|
|
|
</div>
|
2021-05-21 05:01:39 +02:00
|
|
|
</div>
|
|
|
|
</cdk-virtual-scroll-viewport>
|
2018-04-09 16:50:28 +02:00
|
|
|
</ng-container>
|
2018-04-05 16:29:11 +02:00
|
|
|
</content>
|