Browse Source

Improve asset profile details dialog

pull/1504/head
Thomas 3 years ago
parent
commit
432aa850b9
  1. 14
      apps/api/src/services/symbol-profile.service.ts
  2. 11
      apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.ts
  3. 18
      apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
  4. 2
      apps/client/src/app/components/admin-market-data/admin-market-data.html
  5. 4
      apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
  6. 10
      apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
  7. 1
      apps/client/src/app/components/admin-market-data/asset-profile-dialog/interfaces/interfaces.ts
  8. 1
      libs/common/src/lib/interfaces/enhanced-symbol-profile.interface.ts

14
apps/api/src/services/symbol-profile.service.ts

@ -36,6 +36,13 @@ export class SymbolProfileService {
_count: {
select: { Order: true }
},
Order: {
orderBy: {
date: 'asc'
},
select: { date: true },
take: 1
},
SymbolProfileOverrides: true
},
where: {
@ -118,6 +125,9 @@ export class SymbolProfileService {
private getSymbols(
symbolProfiles: (SymbolProfile & {
_count: { Order: number };
Order?: {
date: Date;
}[];
SymbolProfileOverrides: SymbolProfileOverrides;
})[]
): EnhancedSymbolProfile[] {
@ -128,6 +138,7 @@ export class SymbolProfileService {
countries: this.getCountries(
symbolProfile?.countries as unknown as Prisma.JsonArray
),
dateOfFirstActivity: <Date>undefined,
scraperConfiguration: this.getScraperConfiguration(symbolProfile),
sectors: this.getSectors(symbolProfile),
symbolMapping: this.getSymbolMapping(symbolProfile)
@ -136,6 +147,9 @@ export class SymbolProfileService {
item.activitiesCount = symbolProfile._count.Order;
delete item._count;
item.dateOfFirstActivity = symbolProfile.Order?.[0]?.date;
delete item.Order;
if (item.SymbolProfileOverrides) {
item.assetClass =
item.SymbolProfileOverrides.assetClass ?? item.assetClass;

11
apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.ts

@ -20,11 +20,14 @@ import {
addDays,
format,
isBefore,
isDate,
isSameDay,
isToday,
isValid,
parse,
parseISO
} from 'date-fns';
import { last } from 'lodash';
import { DeviceDetectorService } from 'ngx-device-detector';
import { Subject, takeUntil } from 'rxjs';
@ -106,9 +109,15 @@ export class AdminMarketDataDetailComponent implements OnChanges, OnInit {
}
}
const marketDataItems = [...missingMarketData, ...this.marketData];
if (!isToday(last(marketDataItems)?.date)) {
marketDataItems.push({ date: new Date() });
}
this.marketDataByMonth = {};
for (const marketDataItem of [...missingMarketData, ...this.marketData]) {
for (const marketDataItem of marketDataItems) {
const currentDay = parseInt(format(marketDataItem.date, 'd'), 10);
const key = format(marketDataItem.date, 'yyyy-MM');

18
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts

@ -13,12 +13,11 @@ import { ActivatedRoute, Router } from '@angular/router';
import { AdminService } from '@ghostfolio/client/services/admin.service';
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { DATE_FORMAT, getDateFormatString } from '@ghostfolio/common/helper';
import { getDateFormatString } from '@ghostfolio/common/helper';
import { Filter, UniqueAsset, User } from '@ghostfolio/common/interfaces';
import { AdminMarketDataItem } from '@ghostfolio/common/interfaces/admin-market-data.interface';
import { translate } from '@ghostfolio/ui/i18n';
import { AssetSubClass, DataSource } from '@prisma/client';
import { format, parseISO } from 'date-fns';
import { DeviceDetectorService } from 'ngx-device-detector';
import { Subject } from 'rxjs';
import { distinctUntilChanged, switchMap, takeUntil } from 'rxjs/operators';
@ -98,7 +97,6 @@ export class AdminMarketDataComponent implements OnDestroy, OnInit {
) {
this.openAssetProfileDialog({
dataSource: params['dataSource'],
dateOfFirstActivity: params['dateOfFirstActivity'],
symbol: params['symbol']
});
}
@ -195,18 +193,9 @@ export class AdminMarketDataComponent implements OnDestroy, OnInit {
.subscribe(() => {});
}
public onOpenAssetProfileDialog({
dataSource,
dateOfFirstActivity,
symbol
}: UniqueAsset & { dateOfFirstActivity: string }) {
try {
dateOfFirstActivity = format(parseISO(dateOfFirstActivity), DATE_FORMAT);
} catch {}
public onOpenAssetProfileDialog({ dataSource, symbol }: UniqueAsset) {
this.router.navigate([], {
queryParams: {
dateOfFirstActivity,
dataSource,
symbol,
assetProfileDialog: true
@ -221,11 +210,9 @@ export class AdminMarketDataComponent implements OnDestroy, OnInit {
private openAssetProfileDialog({
dataSource,
dateOfFirstActivity,
symbol
}: {
dataSource: DataSource;
dateOfFirstActivity: string;
symbol: string;
}) {
this.userService
@ -238,7 +225,6 @@ export class AdminMarketDataComponent implements OnDestroy, OnInit {
autoFocus: false,
data: <AssetProfileDialogParams>{
dataSource,
dateOfFirstActivity,
symbol,
deviceType: this.deviceType,
locale: this.user?.settings?.locale

2
apps/client/src/app/components/admin-market-data/admin-market-data.html

@ -176,7 +176,7 @@
*matRowDef="let row; columns: displayedColumns"
class="cursor-pointer"
mat-row
(click)="onOpenAssetProfileDialog({ dateOfFirstActivity: row.date, dataSource: row.dataSource, symbol: row.symbol })"
(click)="onOpenAssetProfileDialog({ dataSource: row.dataSource, symbol: row.symbol })"
></tr>
</table>
</div>

4
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts

@ -87,8 +87,8 @@ export class AssetProfileDialog implements OnDestroy, OnInit {
}
this.assetProfileForm.setValue({
comment: this.assetProfile?.comment,
symbolMapping: JSON.stringify(this.assetProfile?.symbolMapping)
comment: this.assetProfile?.comment ?? '',
symbolMapping: JSON.stringify(this.assetProfile?.symbolMapping ?? {})
});
this.assetProfileForm.markAsPristine();

10
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html

@ -44,7 +44,7 @@
<gf-admin-market-data-detail
class="mb-3"
[dataSource]="data.dataSource"
[dateOfFirstActivity]="data.dateOfFirstActivity"
[dateOfFirstActivity]="assetProfile?.dateOfFirstActivity"
[locale]="data.locale"
[marketData]="marketDataDetails"
[symbol]="data.symbol"
@ -55,10 +55,10 @@
<gf-value
i18n
size="medium"
[isDate]="data.dateOfFirstActivity ? true : false"
[isDate]="assetProfile?.dateOfFirstActivity ? true : false"
[locale]="data.locale"
[value]="data.dateOfFirstActivity ?? '-'"
>First Buy Date</gf-value
[value]="assetProfile?.dateOfFirstActivity ?? '-'"
>First Activity</gf-value
>
</div>
<div class="col-6 mb-3">
@ -67,7 +67,7 @@
size="medium"
[locale]="data.locale"
[value]="assetProfile?.activitiesCount ?? 0"
>Transactions</gf-value
>Activities</gf-value
>
</div>
<div class="col-6 mb-3">

1
apps/client/src/app/components/admin-market-data/asset-profile-dialog/interfaces/interfaces.ts

@ -1,7 +1,6 @@
import { DataSource } from '@prisma/client';
export interface AssetProfileDialogParams {
dateOfFirstActivity: string;
dataSource: DataSource;
deviceType: string;
locale: string;

1
libs/common/src/lib/interfaces/enhanced-symbol-profile.interface.ts

@ -13,6 +13,7 @@ export interface EnhancedSymbolProfile {
createdAt: Date;
currency: string | null;
dataSource: DataSource;
dateOfFirstActivity?: Date;
id: string;
name: string | null;
scraperConfiguration?: ScraperConfiguration | null;

Loading…
Cancel
Save