|
|
@ -5,12 +5,16 @@ import { |
|
|
|
Inject, |
|
|
|
OnDestroy |
|
|
|
} from '@angular/core'; |
|
|
|
import { FormBuilder, FormGroup, Validators } from '@angular/forms'; |
|
|
|
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; |
|
|
|
import { MatSnackBar } from '@angular/material/snack-bar'; |
|
|
|
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; |
|
|
|
import { DataService } from '@ghostfolio/client/services/data.service'; |
|
|
|
import { ImportActivitiesService } from '@ghostfolio/client/services/import-activities.service'; |
|
|
|
import { isArray } from 'lodash'; |
|
|
|
import { Subject } from 'rxjs'; |
|
|
|
import { Position } from '@ghostfolio/common/interfaces'; |
|
|
|
import { AssetClass } from '@prisma/client'; |
|
|
|
import { isArray, sortBy } from 'lodash'; |
|
|
|
import { Subject, takeUntil } from 'rxjs'; |
|
|
|
|
|
|
|
import { ImportActivitiesDialogParams } from './interfaces/interfaces'; |
|
|
|
|
|
|
@ -24,20 +28,55 @@ export class ImportActivitiesDialog implements OnDestroy { |
|
|
|
public activities: Activity[] = []; |
|
|
|
public details: any[] = []; |
|
|
|
public errorMessages: string[] = []; |
|
|
|
public holdings: Position[] = []; |
|
|
|
public isFileSelected = false; |
|
|
|
public mode: 'DIVIDEND'; |
|
|
|
public selectedActivities: Activity[] = []; |
|
|
|
public uniqueAssetForm: FormGroup; |
|
|
|
|
|
|
|
private unsubscribeSubject = new Subject<void>(); |
|
|
|
|
|
|
|
public constructor( |
|
|
|
private changeDetectorRef: ChangeDetectorRef, |
|
|
|
@Inject(MAT_DIALOG_DATA) public data: ImportActivitiesDialogParams, |
|
|
|
private dataService: DataService, |
|
|
|
private formBuilder: FormBuilder, |
|
|
|
public dialogRef: MatDialogRef<ImportActivitiesDialog>, |
|
|
|
private importActivitiesService: ImportActivitiesService, |
|
|
|
private snackBar: MatSnackBar |
|
|
|
) {} |
|
|
|
|
|
|
|
public ngOnInit() {} |
|
|
|
public ngOnInit() { |
|
|
|
this.uniqueAssetForm = this.formBuilder.group({ |
|
|
|
uniqueAsset: [undefined, Validators.required] |
|
|
|
}); |
|
|
|
|
|
|
|
if ( |
|
|
|
this.data?.activityTypes?.length === 1 && |
|
|
|
this.data?.activityTypes?.[0] === 'DIVIDEND' |
|
|
|
) { |
|
|
|
this.mode = 'DIVIDEND'; |
|
|
|
|
|
|
|
this.dataService |
|
|
|
.fetchPositions({ |
|
|
|
filters: [ |
|
|
|
{ |
|
|
|
id: AssetClass.EQUITY, |
|
|
|
type: 'ASSET_CLASS' |
|
|
|
} |
|
|
|
], |
|
|
|
range: 'max' |
|
|
|
}) |
|
|
|
.pipe(takeUntil(this.unsubscribeSubject)) |
|
|
|
.subscribe(({ positions }) => { |
|
|
|
this.holdings = sortBy(positions, ({ name }) => { |
|
|
|
return name.toLowerCase(); |
|
|
|
}); |
|
|
|
|
|
|
|
this.changeDetectorRef.markForCheck(); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public onCancel(): void { |
|
|
|
this.dialogRef.close(); |
|
|
@ -71,6 +110,24 @@ export class ImportActivitiesDialog implements OnDestroy { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public onLoadDividends() { |
|
|
|
const { dataSource, symbol } = |
|
|
|
this.uniqueAssetForm.controls['uniqueAsset'].value; |
|
|
|
|
|
|
|
this.dataService |
|
|
|
.fetchDividendsImport({ |
|
|
|
dataSource, |
|
|
|
symbol |
|
|
|
}) |
|
|
|
.pipe(takeUntil(this.unsubscribeSubject)) |
|
|
|
.subscribe(({ activities }) => { |
|
|
|
this.activities = activities; |
|
|
|
this.isFileSelected = true; |
|
|
|
|
|
|
|
this.changeDetectorRef.markForCheck(); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
public onReset() { |
|
|
|
this.details = []; |
|
|
|
this.errorMessages = []; |
|
|
@ -95,8 +152,6 @@ export class ImportActivitiesDialog implements OnDestroy { |
|
|
|
reader.onload = async (readerEvent) => { |
|
|
|
const fileContent = readerEvent.target.result as string; |
|
|
|
|
|
|
|
console.log(fileContent); |
|
|
|
|
|
|
|
try { |
|
|
|
if (file.name.endsWith('.json')) { |
|
|
|
const content = JSON.parse(fileContent); |
|
|
|