Improved Liquid Assets page with pagination and search filter.

This commit is contained in:
softsimon 2020-05-30 16:26:39 +07:00
parent 235c9b0bdd
commit 969367c8bb
No known key found for this signature in database
GPG Key ID: 488D7DCFB5A430D7
4 changed files with 68 additions and 4 deletions

View File

@ -3,7 +3,7 @@ import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http'; import { HttpClientModule } from '@angular/common/http';
import { ReactiveFormsModule } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { NgbButtonsModule, NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap'; import { NgbButtonsModule, NgbTooltipModule, NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap';
import { InfiniteScrollModule } from 'ngx-infinite-scroll'; import { InfiniteScrollModule } from 'ngx-infinite-scroll';
import { AppRoutingModule } from './app-routing.module'; import { AppRoutingModule } from './app-routing.module';
@ -101,6 +101,7 @@ import { Hex2asciiPipe } from './pipes/hex2ascii/hex2ascii.pipe';
BrowserAnimationsModule, BrowserAnimationsModule,
NgbButtonsModule, NgbButtonsModule,
NgbTooltipModule, NgbTooltipModule,
NgbPaginationModule,
InfiniteScrollModule, InfiniteScrollModule,
], ],
providers: [ providers: [

View File

@ -4,6 +4,15 @@
<div class="clearfix"></div> <div class="clearfix"></div>
<form [formGroup]="searchForm" class="form-inline">
<div class="input-group m-2">
<input style="width: 250px;" formControlName="searchText" type="text" class="form-control" placeholder="Search asset">
<div class="input-group-append">
<button [disabled]="!searchForm.get('searchText')?.value.length" class="btn btn-secondary" type="button" (click)="searchForm.get('searchText')?.setValue('');" autocomplete="off">Clear</button>
</div>
</div>
</form>
<ng-template [ngIf]="!isLoading && !error"> <ng-template [ngIf]="!isLoading && !error">
<table class="table table-borderless table-striped"> <table class="table table-borderless table-striped">
<thead> <thead>
@ -14,7 +23,7 @@
<th class="d-none d-lg-block">Issuance TX</th> <th class="d-none d-lg-block">Issuance TX</th>
</thead> </thead>
<tbody> <tbody>
<tr *ngFor="let asset of assets"> <tr *ngFor="let asset of filteredAssets; trackBy: trackByAsset">
<td class="td-name">{{ asset.name }}</td> <td class="td-name">{{ asset.name }}</td>
<td>{{ asset.ticker }}</td> <td>{{ asset.ticker }}</td>
<td class="d-none d-md-block"><a *ngIf="asset.entity" target="_blank" href="{{ 'http://' + asset.entity.domain }}">{{ asset.entity.domain }}</a></td> <td class="d-none d-md-block"><a *ngIf="asset.entity" target="_blank" href="{{ 'http://' + asset.entity.domain }}">{{ asset.entity.domain }}</a></td>
@ -23,6 +32,11 @@
</tr> </tr>
</tbody> </tbody>
</table> </table>
<br>
<ngb-pagination [collectionSize]="assets.length" [rotate]="true" [pageSize]="itemsPerPage" [(page)]="page" (pageChange)="pageChange(page)" [maxSize]="5" [boundaryLinks]="true"></ngb-pagination>
</ng-template> </ng-template>
<ng-template [ngIf]="isLoading && !error"> <ng-template [ngIf]="isLoading && !error">

View File

@ -1,6 +1,8 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { AssetsService } from '../services/assets.service'; import { AssetsService } from '../services/assets.service';
import { environment } from 'src/environments/environment'; import { environment } from 'src/environments/environment';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { filter, distinctUntilChanged } from 'rxjs/operators';
@Component({ @Component({
selector: 'app-assets', selector: 'app-assets',
@ -9,18 +11,45 @@ import { environment } from 'src/environments/environment';
}) })
export class AssetsComponent implements OnInit { export class AssetsComponent implements OnInit {
nativeAssetId = environment.nativeAssetId; nativeAssetId = environment.nativeAssetId;
assets: any[];
assetsCache: any[];
filteredAssets: any[];
searchForm: FormGroup;
isLoading = true; isLoading = true;
error: any; error: any;
assets: any; page = 1;
itemsPerPage = 15;
constructor( constructor(
private assetsService: AssetsService, private assetsService: AssetsService,
private formBuilder: FormBuilder,
) { } ) { }
ngOnInit() { ngOnInit() {
setTimeout(() => this.getAssets()); setTimeout(() => this.getAssets());
this.searchForm = this.formBuilder.group({
searchText: ['', Validators.required],
});
this.searchForm.controls.searchText.valueChanges
.pipe(
distinctUntilChanged(),
)
.subscribe((searchText) => {
this.page = 1;
if (searchText.length ) {
this.filteredAssets = this.assetsCache.filter((asset) => asset.name.toLowerCase().indexOf(searchText.toLowerCase()) > -1
|| asset.ticker.toLowerCase().indexOf(searchText.toLowerCase()) > -1);
this.assets = this.filteredAssets;
this.filteredAssets = this.filteredAssets.slice(0, this.itemsPerPage);
} else {
this.assets = this.assetsCache;
this.filteredAssets = this.assets.slice(0, this.itemsPerPage);
}
});
} }
getAssets() { getAssets() {
@ -33,6 +62,8 @@ export class AssetsComponent implements OnInit {
asset_id: this.nativeAssetId, asset_id: this.nativeAssetId,
}); });
this.assets = this.assets.sort((a: any, b: any) => a.name.localeCompare(b.name)); this.assets = this.assets.sort((a: any, b: any) => a.name.localeCompare(b.name));
this.assetsCache = this.assets;
this.filteredAssets = this.assets.slice(0, this.itemsPerPage);
this.isLoading = false; this.isLoading = false;
}, },
(error) => { (error) => {
@ -40,6 +71,14 @@ export class AssetsComponent implements OnInit {
this.error = error; this.error = error;
this.isLoading = false; this.isLoading = false;
}); });
} }
pageChange(page: number) {
const start = (page - 1) * this.itemsPerPage;
this.filteredAssets = this.assets.slice(start, this.itemsPerPage + start);
}
trackByAsset(index: number, asset: any) {
return asset.asset_id;
}
} }

View File

@ -11,6 +11,16 @@ $primary: #105fb0;
$secondary: #2d3348; $secondary: #2d3348;
$success: #1a9436; $success: #1a9436;
$pagination-bg: $body-bg;
$pagination-border-color: $gray-800;
$pagination-disabled-bg: #FFF;
$pagination-disabled-border-color: #1d1f31;
$pagination-active-color: #fff;
$pagination-active-bg: #653b9c;
$pagination-hover-bg: #12131e;
$pagination-hover-border-color: #1d1f31;
$pagination-disabled-bg: #1d1f31;
$link-color: #1bd8f4; $link-color: #1bd8f4;
$link-decoration: none !default; $link-decoration: none !default;
$link-hover-color: darken($link-color, 15%) !default; $link-hover-color: darken($link-color, 15%) !default;