|
|
@ -7,6 +7,8 @@ import { |
|
|
|
OnInit |
|
|
|
} from '@angular/core'; |
|
|
|
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; |
|
|
|
import { Sort, SortDirection } from '@angular/material/sort'; |
|
|
|
import { MatTableDataSource } from '@angular/material/table'; |
|
|
|
import { DataService } from '@ghostfolio/client/services/data.service'; |
|
|
|
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; |
|
|
|
import { UserService } from '@ghostfolio/client/services/user/user.service'; |
|
|
@ -16,6 +18,7 @@ import { |
|
|
|
HistoricalDataItem, |
|
|
|
User |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; |
|
|
|
import { OrderWithAccount } from '@ghostfolio/common/types'; |
|
|
|
import Big from 'big.js'; |
|
|
|
import { format, parseISO } from 'date-fns'; |
|
|
@ -24,7 +27,6 @@ import { Subject } from 'rxjs'; |
|
|
|
import { takeUntil } from 'rxjs/operators'; |
|
|
|
|
|
|
|
import { AccountDetailDialogParams } from './interfaces/interfaces'; |
|
|
|
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; |
|
|
|
|
|
|
|
@Component({ |
|
|
|
host: { class: 'd-flex flex-column h-100' }, |
|
|
@ -38,6 +40,7 @@ export class AccountDetailDialog implements OnDestroy, OnInit { |
|
|
|
public activities: OrderWithAccount[]; |
|
|
|
public balance: number; |
|
|
|
public currency: string; |
|
|
|
public dataSource: MatTableDataSource<OrderWithAccount>; |
|
|
|
public equity: number; |
|
|
|
public hasImpersonationId: boolean; |
|
|
|
public hasPermissionToDeleteAccountBalance: boolean; |
|
|
@ -46,6 +49,9 @@ export class AccountDetailDialog implements OnDestroy, OnInit { |
|
|
|
public isLoadingChart: boolean; |
|
|
|
public name: string; |
|
|
|
public platformName: string; |
|
|
|
public sortColumn = 'date'; |
|
|
|
public sortDirection: SortDirection = 'desc'; |
|
|
|
public totalItems: number; |
|
|
|
public transactionCount: number; |
|
|
|
public user: User; |
|
|
|
public valueInBaseCurrency: number; |
|
|
@ -77,8 +83,6 @@ export class AccountDetailDialog implements OnDestroy, OnInit { |
|
|
|
} |
|
|
|
|
|
|
|
public ngOnInit() { |
|
|
|
this.isLoadingActivities = true; |
|
|
|
|
|
|
|
this.dataService |
|
|
|
.fetchAccount(this.data.accountId) |
|
|
|
.pipe(takeUntil(this.unsubscribeSubject)) |
|
|
@ -110,19 +114,6 @@ export class AccountDetailDialog implements OnDestroy, OnInit { |
|
|
|
} |
|
|
|
); |
|
|
|
|
|
|
|
this.dataService |
|
|
|
.fetchActivities({ |
|
|
|
filters: [{ id: this.data.accountId, type: 'ACCOUNT' }] |
|
|
|
}) |
|
|
|
.pipe(takeUntil(this.unsubscribeSubject)) |
|
|
|
.subscribe(({ activities }) => { |
|
|
|
this.activities = activities; |
|
|
|
|
|
|
|
this.isLoadingActivities = false; |
|
|
|
|
|
|
|
this.changeDetectorRef.markForCheck(); |
|
|
|
}); |
|
|
|
|
|
|
|
this.impersonationStorageService |
|
|
|
.onChangeHasImpersonation() |
|
|
|
.pipe(takeUntil(this.unsubscribeSubject)) |
|
|
@ -131,6 +122,7 @@ export class AccountDetailDialog implements OnDestroy, OnInit { |
|
|
|
}); |
|
|
|
|
|
|
|
this.fetchAccountBalances(); |
|
|
|
this.fetchActivities(); |
|
|
|
this.fetchPortfolioPerformance(); |
|
|
|
} |
|
|
|
|
|
|
@ -151,12 +143,20 @@ export class AccountDetailDialog implements OnDestroy, OnInit { |
|
|
|
} |
|
|
|
|
|
|
|
public onExport() { |
|
|
|
let activityIds = []; |
|
|
|
|
|
|
|
if (this.user?.settings?.isExperimentalFeatures === true) { |
|
|
|
activityIds = this.dataSource.data.map(({ id }) => { |
|
|
|
return id; |
|
|
|
}); |
|
|
|
} else { |
|
|
|
activityIds = this.activities.map(({ id }) => { |
|
|
|
return id; |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
this.dataService |
|
|
|
.fetchExport( |
|
|
|
this.activities.map(({ id }) => { |
|
|
|
return id; |
|
|
|
}) |
|
|
|
) |
|
|
|
.fetchExport(activityIds) |
|
|
|
.pipe(takeUntil(this.unsubscribeSubject)) |
|
|
|
.subscribe((data) => { |
|
|
|
downloadAsFile({ |
|
|
@ -172,6 +172,13 @@ export class AccountDetailDialog implements OnDestroy, OnInit { |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
public onSortChanged({ active, direction }: Sort) { |
|
|
|
this.sortColumn = active; |
|
|
|
this.sortDirection = direction; |
|
|
|
|
|
|
|
this.fetchActivities(); |
|
|
|
} |
|
|
|
|
|
|
|
private fetchAccountBalances() { |
|
|
|
this.dataService |
|
|
|
.fetchAccountBalances(this.data.accountId) |
|
|
@ -183,6 +190,41 @@ export class AccountDetailDialog implements OnDestroy, OnInit { |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
private fetchActivities() { |
|
|
|
this.isLoadingActivities = true; |
|
|
|
|
|
|
|
if (this.user?.settings?.isExperimentalFeatures === true) { |
|
|
|
this.dataService |
|
|
|
.fetchActivities({ |
|
|
|
filters: [{ id: this.data.accountId, type: 'ACCOUNT' }], |
|
|
|
sortColumn: this.sortColumn, |
|
|
|
sortDirection: this.sortDirection |
|
|
|
}) |
|
|
|
.pipe(takeUntil(this.unsubscribeSubject)) |
|
|
|
.subscribe(({ activities, count }) => { |
|
|
|
this.dataSource = new MatTableDataSource(activities); |
|
|
|
this.totalItems = count; |
|
|
|
|
|
|
|
this.isLoadingActivities = false; |
|
|
|
|
|
|
|
this.changeDetectorRef.markForCheck(); |
|
|
|
}); |
|
|
|
} else { |
|
|
|
this.dataService |
|
|
|
.fetchActivities({ |
|
|
|
filters: [{ id: this.data.accountId, type: 'ACCOUNT' }] |
|
|
|
}) |
|
|
|
.pipe(takeUntil(this.unsubscribeSubject)) |
|
|
|
.subscribe(({ activities }) => { |
|
|
|
this.activities = activities; |
|
|
|
|
|
|
|
this.isLoadingActivities = false; |
|
|
|
|
|
|
|
this.changeDetectorRef.markForCheck(); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private fetchPortfolioPerformance() { |
|
|
|
this.isLoadingChart = true; |
|
|
|
|
|
|
|