2018-04-05 17:12:00 +02:00
|
|
|
import {
|
|
|
|
EventEmitter,
|
|
|
|
Input,
|
|
|
|
Output,
|
|
|
|
} from '@angular/core';
|
|
|
|
|
|
|
|
import { CipherType } from '../../enums/cipherType';
|
|
|
|
|
|
|
|
import { CollectionView } from '../../models/view/collectionView';
|
|
|
|
import { FolderView } from '../../models/view/folderView';
|
|
|
|
|
2018-10-25 15:38:37 +02:00
|
|
|
import { TreeNode } from '../../models/domain/treeNode';
|
|
|
|
|
2018-04-05 17:12:00 +02:00
|
|
|
import { CollectionService } from '../../abstractions/collection.service';
|
|
|
|
import { FolderService } from '../../abstractions/folder.service';
|
2018-11-09 23:44:45 +01:00
|
|
|
import { StorageService } from '../../abstractions/storage.service';
|
|
|
|
import { UserService } from '../../abstractions/user.service';
|
|
|
|
|
|
|
|
import { ConstantsService } from '../../services/constants.service';
|
2018-04-05 17:12:00 +02:00
|
|
|
|
|
|
|
export class GroupingsComponent {
|
2018-07-04 05:33:15 +02:00
|
|
|
@Input() showFolders = true;
|
|
|
|
@Input() showCollections = true;
|
|
|
|
@Input() showFavorites = true;
|
2020-04-03 22:32:15 +02:00
|
|
|
@Input() showTrash = true;
|
2018-07-04 05:33:15 +02:00
|
|
|
|
2018-04-05 17:12:00 +02:00
|
|
|
@Output() onAllClicked = new EventEmitter();
|
|
|
|
@Output() onFavoritesClicked = new EventEmitter();
|
2020-04-03 22:32:15 +02:00
|
|
|
@Output() onTrashClicked = new EventEmitter();
|
2018-04-05 17:12:00 +02:00
|
|
|
@Output() onCipherTypeClicked = new EventEmitter<CipherType>();
|
|
|
|
@Output() onFolderClicked = new EventEmitter<FolderView>();
|
|
|
|
@Output() onAddFolder = new EventEmitter();
|
|
|
|
@Output() onEditFolder = new EventEmitter<FolderView>();
|
|
|
|
@Output() onCollectionClicked = new EventEmitter<CollectionView>();
|
|
|
|
|
|
|
|
folders: FolderView[];
|
2020-08-12 21:42:42 +02:00
|
|
|
nestedFolders: TreeNode<FolderView>[];
|
2018-04-05 17:12:00 +02:00
|
|
|
collections: CollectionView[];
|
2020-08-12 21:42:42 +02:00
|
|
|
nestedCollections: TreeNode<CollectionView>[];
|
2018-04-05 17:12:00 +02:00
|
|
|
loaded: boolean = false;
|
|
|
|
cipherType = CipherType;
|
|
|
|
selectedAll: boolean = false;
|
|
|
|
selectedFavorites: boolean = false;
|
2020-04-03 22:32:15 +02:00
|
|
|
selectedTrash: boolean = false;
|
2018-04-05 17:12:00 +02:00
|
|
|
selectedType: CipherType = null;
|
|
|
|
selectedFolder: boolean = false;
|
|
|
|
selectedFolderId: string = null;
|
|
|
|
selectedCollectionId: string = null;
|
|
|
|
|
2018-11-09 23:44:45 +01:00
|
|
|
private collapsedGroupings: Set<string>;
|
|
|
|
private collapsedGroupingsKey: string;
|
|
|
|
|
|
|
|
constructor(protected collectionService: CollectionService, protected folderService: FolderService,
|
|
|
|
protected storageService: StorageService, protected userService: UserService) { }
|
2018-04-05 17:12:00 +02:00
|
|
|
|
2018-04-12 21:42:34 +02:00
|
|
|
async load(setLoaded = true) {
|
2018-11-09 23:44:45 +01:00
|
|
|
const userId = await this.userService.getUserId();
|
|
|
|
this.collapsedGroupingsKey = ConstantsService.collapsedGroupingsKey + '_' + userId;
|
|
|
|
const collapsedGroupings = await this.storageService.get<string[]>(this.collapsedGroupingsKey);
|
|
|
|
if (collapsedGroupings == null) {
|
|
|
|
this.collapsedGroupings = new Set<string>();
|
|
|
|
} else {
|
|
|
|
this.collapsedGroupings = new Set(collapsedGroupings);
|
|
|
|
}
|
|
|
|
|
2018-04-05 17:12:00 +02:00
|
|
|
await this.loadFolders();
|
|
|
|
await this.loadCollections();
|
2018-04-12 21:42:34 +02:00
|
|
|
|
|
|
|
if (setLoaded) {
|
|
|
|
this.loaded = true;
|
|
|
|
}
|
2018-04-05 17:12:00 +02:00
|
|
|
}
|
|
|
|
|
2018-07-04 05:33:15 +02:00
|
|
|
async loadCollections(organizationId?: string) {
|
|
|
|
if (!this.showCollections) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const collections = await this.collectionService.getAllDecrypted();
|
|
|
|
if (organizationId != null) {
|
|
|
|
this.collections = collections.filter((c) => c.organizationId === organizationId);
|
|
|
|
} else {
|
|
|
|
this.collections = collections;
|
|
|
|
}
|
2018-10-26 16:48:06 +02:00
|
|
|
this.nestedCollections = await this.collectionService.getAllNested(this.collections);
|
2018-04-05 17:12:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
async loadFolders() {
|
2018-07-04 05:33:15 +02:00
|
|
|
if (!this.showFolders) {
|
|
|
|
return;
|
|
|
|
}
|
2018-04-05 17:12:00 +02:00
|
|
|
this.folders = await this.folderService.getAllDecrypted();
|
2018-10-26 16:48:06 +02:00
|
|
|
this.nestedFolders = await this.folderService.getAllNested();
|
2018-04-05 17:12:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
selectAll() {
|
|
|
|
this.clearSelections();
|
|
|
|
this.selectedAll = true;
|
|
|
|
this.onAllClicked.emit();
|
|
|
|
}
|
|
|
|
|
|
|
|
selectFavorites() {
|
|
|
|
this.clearSelections();
|
|
|
|
this.selectedFavorites = true;
|
|
|
|
this.onFavoritesClicked.emit();
|
|
|
|
}
|
|
|
|
|
2020-04-03 22:32:15 +02:00
|
|
|
selectTrash() {
|
|
|
|
this.clearSelections();
|
|
|
|
this.selectedTrash = true;
|
|
|
|
this.onTrashClicked.emit();
|
|
|
|
}
|
|
|
|
|
2018-04-05 17:12:00 +02:00
|
|
|
selectType(type: CipherType) {
|
|
|
|
this.clearSelections();
|
|
|
|
this.selectedType = type;
|
|
|
|
this.onCipherTypeClicked.emit(type);
|
|
|
|
}
|
|
|
|
|
|
|
|
selectFolder(folder: FolderView) {
|
|
|
|
this.clearSelections();
|
|
|
|
this.selectedFolder = true;
|
|
|
|
this.selectedFolderId = folder.id;
|
|
|
|
this.onFolderClicked.emit(folder);
|
|
|
|
}
|
|
|
|
|
|
|
|
addFolder() {
|
|
|
|
this.onAddFolder.emit();
|
|
|
|
}
|
|
|
|
|
|
|
|
editFolder(folder: FolderView) {
|
|
|
|
this.onEditFolder.emit(folder);
|
|
|
|
}
|
|
|
|
|
|
|
|
selectCollection(collection: CollectionView) {
|
|
|
|
this.clearSelections();
|
|
|
|
this.selectedCollectionId = collection.id;
|
|
|
|
this.onCollectionClicked.emit(collection);
|
|
|
|
}
|
|
|
|
|
|
|
|
clearSelections() {
|
|
|
|
this.selectedAll = false;
|
|
|
|
this.selectedFavorites = false;
|
2020-04-03 22:32:15 +02:00
|
|
|
this.selectedTrash = false;
|
2018-04-05 17:12:00 +02:00
|
|
|
this.selectedType = null;
|
|
|
|
this.selectedFolder = false;
|
|
|
|
this.selectedFolderId = null;
|
|
|
|
this.selectedCollectionId = null;
|
|
|
|
}
|
2018-11-09 23:44:45 +01:00
|
|
|
|
|
|
|
collapse(grouping: FolderView | CollectionView, idPrefix = '') {
|
|
|
|
if (grouping.id == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const id = idPrefix + grouping.id;
|
|
|
|
if (this.isCollapsed(grouping, idPrefix)) {
|
|
|
|
this.collapsedGroupings.delete(id);
|
|
|
|
} else {
|
|
|
|
this.collapsedGroupings.add(id);
|
|
|
|
}
|
|
|
|
this.storageService.save(this.collapsedGroupingsKey, this.collapsedGroupings);
|
|
|
|
}
|
|
|
|
|
|
|
|
isCollapsed(grouping: FolderView | CollectionView, idPrefix = '') {
|
|
|
|
return this.collapsedGroupings.has(idPrefix + grouping.id);
|
|
|
|
}
|
2018-04-05 17:12:00 +02:00
|
|
|
}
|