1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-16 08:13:42 +00:00

paging ciphers for better performance

This commit is contained in:
Kyle Spearrin
2019-03-19 12:44:22 -04:00
parent e4093209cc
commit cc706a48da
9 changed files with 29 additions and 25 deletions

View File

@@ -3,6 +3,7 @@ import 'core-js';
import { ToasterModule } from 'angular2-toaster';
import { Angulartics2Module } from 'angulartics2';
import { Angulartics2GoogleAnalytics } from 'angulartics2/ga';
import { InfiniteScrollModule } from 'ngx-infinite-scroll';
import { AppRoutingModule } from './app-routing.module';
@@ -223,6 +224,7 @@ registerLocaleData(localeZhTw, 'zh-TW');
},
}),
ToasterModule.forRoot(),
InfiniteScrollModule,
],
declarations: [
AcceptOrganizationComponent,

View File

@@ -13,8 +13,6 @@ import { I18nService } from 'jslib/abstractions/i18n.service';
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
import { SearchService } from 'jslib/abstractions/search.service';
import { CipherData } from 'jslib/models/data/cipherData';
import { Cipher } from 'jslib/models/domain/cipher';
import { Organization } from 'jslib/models/domain/organization';
import { CipherView } from 'jslib/models/view/cipherView';
@@ -59,7 +57,7 @@ export class CiphersComponent extends BaseCiphersComponent {
}
}
search(timeout: number = null) {
async search(timeout: number = null) {
if (!this.organization.isAdmin) {
return super.search(timeout);
}
@@ -73,6 +71,7 @@ export class CiphersComponent extends BaseCiphersComponent {
} else {
this.ciphers = this.searchService.searchCiphersBasic(filteredCiphers, this.searchText);
}
await this.resetPaging();
}
checkCipher(c: CipherView) {

View File

@@ -90,7 +90,7 @@ export class VaultComponent implements OnInit, OnDestroy {
if (qParams == null) {
this.groupingsComponent.selectedAll = true;
await this.ciphersComponent.load();
await this.ciphersComponent.reload();
} else {
if (qParams.type) {
const t = parseInt(qParams.type, null);
@@ -101,7 +101,7 @@ export class VaultComponent implements OnInit, OnDestroy {
await this.filterCollection(qParams.collectionId, true);
} else {
this.groupingsComponent.selectedAll = true;
await this.ciphersComponent.load();
await this.ciphersComponent.reload();
}
}
@@ -136,7 +136,7 @@ export class VaultComponent implements OnInit, OnDestroy {
this.groupingsComponent.searchPlaceholder = this.i18nService.t('searchType');
const filter = (c: CipherView) => c.type === type;
if (load) {
await this.ciphersComponent.load(filter);
await this.ciphersComponent.reload(filter);
} else {
await this.ciphersComponent.applyFilter(filter);
}
@@ -156,7 +156,7 @@ export class VaultComponent implements OnInit, OnDestroy {
}
};
if (load) {
await this.ciphersComponent.load(filter);
await this.ciphersComponent.reload(filter);
} else {
await this.ciphersComponent.applyFilter(filter);
}

View File

@@ -1,7 +1,8 @@
<ng-container *ngIf="ciphers">
<table class="table table-hover table-list table-ciphers" *ngIf="ciphers.length > 0">
<ng-container *ngIf="(isPaging() ? pagedCiphers : ciphers) as filteredCiphers">
<table class="table table-hover table-list table-ciphers" *ngIf="filteredCiphers.length" infiniteScroll
[infiniteScrollDistance]="1" [infiniteScrollDisabled]="!isPaging()" (scrolled)="loadMore()">
<tbody>
<tr *ngFor="let c of ciphers">
<tr *ngFor="let c of filteredCiphers">
<td (click)="checkCipher(c)" class="table-list-checkbox" *ngIf="!organization">
<input type="checkbox" [(ngModel)]="c.checked" appStopProp>
</td>
@@ -62,7 +63,7 @@
</tr>
</tbody>
</table>
<div class="no-items" *ngIf="ciphers.length === 0">
<div class="no-items" *ngIf="!filteredCiphers.length">
<i class="fa fa-spinner fa-spin text-muted" *ngIf="!loaded" title="{{'loading' | i18n}}"></i>
<ng-container *ngIf="loaded">
<p>{{'noItemsInList' | i18n}}</p>

View File

@@ -39,6 +39,7 @@ export class CiphersComponent extends BaseCiphersComponent implements OnDestroy
protected toasterService: ToasterService, protected i18nService: I18nService,
protected platformUtilsService: PlatformUtilsService, protected cipherService: CipherService) {
super(searchService);
this.pageSize = 150;
}
ngOnDestroy() {

View File

@@ -102,7 +102,7 @@ export class VaultComponent implements OnInit, OnDestroy {
if (params == null) {
this.groupingsComponent.selectedAll = true;
await this.ciphersComponent.load();
await this.ciphersComponent.reload();
} else {
if (params.favorites) {
this.groupingsComponent.selectedFavorites = true;
@@ -120,7 +120,7 @@ export class VaultComponent implements OnInit, OnDestroy {
await this.filterCollection(params.collectionId);
} else {
this.groupingsComponent.selectedAll = true;
await this.ciphersComponent.load();
await this.ciphersComponent.reload();
}
}
@@ -154,7 +154,7 @@ export class VaultComponent implements OnInit, OnDestroy {
async clearGroupingFilters() {
this.ciphersComponent.showAddNew = true;
this.groupingsComponent.searchPlaceholder = this.i18nService.t('searchVault');
await this.ciphersComponent.load();
await this.ciphersComponent.reload();
this.clearFilters();
this.go();
}
@@ -162,7 +162,7 @@ export class VaultComponent implements OnInit, OnDestroy {
async filterFavorites() {
this.ciphersComponent.showAddNew = true;
this.groupingsComponent.searchPlaceholder = this.i18nService.t('searchFavorites');
await this.ciphersComponent.load((c) => c.favorite);
await this.ciphersComponent.reload((c) => c.favorite);
this.clearFilters();
this.favorites = true;
this.go();
@@ -171,7 +171,7 @@ export class VaultComponent implements OnInit, OnDestroy {
async filterCipherType(type: CipherType) {
this.ciphersComponent.showAddNew = true;
this.groupingsComponent.searchPlaceholder = this.i18nService.t('searchType');
await this.ciphersComponent.load((c) => c.type === type);
await this.ciphersComponent.reload((c) => c.type === type);
this.clearFilters();
this.type = type;
this.go();
@@ -181,7 +181,7 @@ export class VaultComponent implements OnInit, OnDestroy {
this.ciphersComponent.showAddNew = true;
folderId = folderId === 'none' ? null : folderId;
this.groupingsComponent.searchPlaceholder = this.i18nService.t('searchFolder');
await this.ciphersComponent.load((c) => c.folderId === folderId);
await this.ciphersComponent.reload((c) => c.folderId === folderId);
this.clearFilters();
this.folderId = folderId == null ? 'none' : folderId;
this.go();
@@ -190,7 +190,8 @@ export class VaultComponent implements OnInit, OnDestroy {
async filterCollection(collectionId: string) {
this.ciphersComponent.showAddNew = true;
this.groupingsComponent.searchPlaceholder = this.i18nService.t('searchCollection');
await this.ciphersComponent.load((c) => c.collectionIds != null && c.collectionIds.indexOf(collectionId) > -1);
await this.ciphersComponent.reload((c) => c.collectionIds != null &&
c.collectionIds.indexOf(collectionId) > -1);
this.clearFilters();
this.collectionId = collectionId;
this.go();