Improved Liquid Assets page with pagination and search filter.
This commit is contained in:
parent
235c9b0bdd
commit
969367c8bb
@ -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: [
|
||||||
|
@ -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">
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user