|
|
|
@ -1,8 +1,10 @@
|
|
|
|
|
import { ChangeDetectorRef, Component, OnInit } from '@angular/core';
|
|
|
|
|
import { AdminData } from '@ghostfolio/api/app/admin/interfaces/admin-data.interface';
|
|
|
|
|
import { User } from '@ghostfolio/api/app/user/interfaces/user.interface';
|
|
|
|
|
import { AdminService } from '@ghostfolio/client/services/admin.service';
|
|
|
|
|
import { CacheService } from '@ghostfolio/client/services/cache.service';
|
|
|
|
|
import { DataService } from '@ghostfolio/client/services/data.service';
|
|
|
|
|
import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
|
|
|
|
|
import { DEFAULT_DATE_FORMAT } from '@ghostfolio/helper';
|
|
|
|
|
import { formatDistanceToNow, isValid, parseISO, sub } from 'date-fns';
|
|
|
|
|
import { Subject } from 'rxjs';
|
|
|
|
@ -20,6 +22,7 @@ export class AdminPageComponent implements OnInit {
|
|
|
|
|
public lastDataGathering: string;
|
|
|
|
|
public transactionCount: number;
|
|
|
|
|
public userCount: number;
|
|
|
|
|
public user: User;
|
|
|
|
|
public users: AdminData['users'];
|
|
|
|
|
|
|
|
|
|
private unsubscribeSubject = new Subject<void>();
|
|
|
|
@ -31,46 +34,24 @@ export class AdminPageComponent implements OnInit {
|
|
|
|
|
private adminService: AdminService,
|
|
|
|
|
private cacheService: CacheService,
|
|
|
|
|
private cd: ChangeDetectorRef,
|
|
|
|
|
private dataService: DataService
|
|
|
|
|
private dataService: DataService,
|
|
|
|
|
private tokenStorageService: TokenStorageService
|
|
|
|
|
) {}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Initializes the controller
|
|
|
|
|
*/
|
|
|
|
|
public ngOnInit() {
|
|
|
|
|
this.dataService
|
|
|
|
|
.fetchAdminData()
|
|
|
|
|
.pipe(takeUntil(this.unsubscribeSubject))
|
|
|
|
|
.subscribe(
|
|
|
|
|
({
|
|
|
|
|
exchangeRates,
|
|
|
|
|
lastDataGathering,
|
|
|
|
|
transactionCount,
|
|
|
|
|
userCount,
|
|
|
|
|
users
|
|
|
|
|
}) => {
|
|
|
|
|
this.exchangeRates = exchangeRates;
|
|
|
|
|
this.users = users;
|
|
|
|
|
|
|
|
|
|
if (isValid(parseISO(lastDataGathering?.toString()))) {
|
|
|
|
|
this.lastDataGathering = formatDistanceToNow(
|
|
|
|
|
new Date(lastDataGathering),
|
|
|
|
|
{
|
|
|
|
|
addSuffix: true
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
} else if (lastDataGathering === 'IN_PROGRESS') {
|
|
|
|
|
this.dataGatheringInProgress = true;
|
|
|
|
|
} else {
|
|
|
|
|
this.lastDataGathering = '-';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.transactionCount = transactionCount;
|
|
|
|
|
this.userCount = userCount;
|
|
|
|
|
this.fetchAdminData();
|
|
|
|
|
|
|
|
|
|
this.cd.markForCheck();
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
this.tokenStorageService
|
|
|
|
|
.onChangeHasToken()
|
|
|
|
|
.pipe(takeUntil(this.unsubscribeSubject))
|
|
|
|
|
.subscribe(() => {
|
|
|
|
|
this.dataService.fetchUser().subscribe((user) => {
|
|
|
|
|
this.user = user;
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public onFlushCache() {
|
|
|
|
@ -112,8 +93,56 @@ export class AdminPageComponent implements OnInit {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public onDeleteUser(aId: string) {
|
|
|
|
|
const confirmation = confirm('Do you really want to delete this user?');
|
|
|
|
|
|
|
|
|
|
if (confirmation) {
|
|
|
|
|
this.dataService.deleteUser(aId).subscribe({
|
|
|
|
|
next: () => {
|
|
|
|
|
this.fetchAdminData();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public ngOnDestroy() {
|
|
|
|
|
this.unsubscribeSubject.next();
|
|
|
|
|
this.unsubscribeSubject.complete();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fetchAdminData() {
|
|
|
|
|
this.dataService
|
|
|
|
|
.fetchAdminData()
|
|
|
|
|
.pipe(takeUntil(this.unsubscribeSubject))
|
|
|
|
|
.subscribe(
|
|
|
|
|
({
|
|
|
|
|
exchangeRates,
|
|
|
|
|
lastDataGathering,
|
|
|
|
|
transactionCount,
|
|
|
|
|
userCount,
|
|
|
|
|
users
|
|
|
|
|
}) => {
|
|
|
|
|
this.exchangeRates = exchangeRates;
|
|
|
|
|
this.users = users;
|
|
|
|
|
|
|
|
|
|
if (isValid(parseISO(lastDataGathering?.toString()))) {
|
|
|
|
|
this.lastDataGathering = formatDistanceToNow(
|
|
|
|
|
new Date(lastDataGathering),
|
|
|
|
|
{
|
|
|
|
|
addSuffix: true
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
} else if (lastDataGathering === 'IN_PROGRESS') {
|
|
|
|
|
this.dataGatheringInProgress = true;
|
|
|
|
|
} else {
|
|
|
|
|
this.lastDataGathering = '-';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.transactionCount = transactionCount;
|
|
|
|
|
this.userCount = userCount;
|
|
|
|
|
|
|
|
|
|
this.cd.markForCheck();
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|