import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; import { getLocale } from '@ghostfolio/common/helper'; import { AssetProfileIdentifier, HoldingWithParents } from '@ghostfolio/common/interfaces'; import { animate, state, style, transition, trigger } from '@angular/animations'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, OnDestroy, Output, ViewChild } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator'; import { MatTableDataSource, MatTableModule } from '@angular/material/table'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { Subject } from 'rxjs'; import { GfValueComponent } from '../value/value.component'; @Component({ animations: [ trigger('detailExpand', [ state('collapsed,void', style({ height: '0px', minHeight: '0' })), state('expanded', style({ height: '*' })), transition( 'expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)') ) ]) ], changeDetection: ChangeDetectionStrategy.OnPush, imports: [ CommonModule, GfSymbolPipe, GfValueComponent, MatButtonModule, MatPaginatorModule, MatTableModule, NgxSkeletonLoaderModule ], schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-top-holdings', styleUrls: ['./top-holdings.component.scss'], templateUrl: './top-holdings.component.html' }) export class GfTopHoldingsComponent implements OnChanges, OnDestroy { @Input() baseCurrency: string; @Input() locale = getLocale(); @Input() pageSize = Number.MAX_SAFE_INTEGER; @Input() topHoldings: HoldingWithParents[]; @Output() holdingClicked = new EventEmitter(); @ViewChild(MatPaginator) paginator: MatPaginator; public dataSource = new MatTableDataSource(); public displayedColumns: string[] = [ 'name', 'valueInBaseCurrency', 'allocationInPercentage' ]; public isLoading = true; private unsubscribeSubject = new Subject(); public ngOnChanges() { this.isLoading = true; this.dataSource = new MatTableDataSource(this.topHoldings); this.dataSource.paginator = this.paginator; if (this.topHoldings) { this.isLoading = false; } } public onClickHolding(assetProfileIdentifier: AssetProfileIdentifier) { this.holdingClicked.emit(assetProfileIdentifier); } public onShowAllHoldings() { this.pageSize = Number.MAX_SAFE_INTEGER; setTimeout(() => { this.dataSource.paginator = this.paginator; }); } public ngOnDestroy() { this.unsubscribeSubject.next(); this.unsubscribeSubject.complete(); } }