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: { _count: {
select: { Order: true } select: { Order: true }
}, },
Order: {
orderBy: {
date: 'asc'
},
select: { date: true },
take: 1
},
SymbolProfileOverrides: true SymbolProfileOverrides: true
}, },
where: { where: {
@ -118,6 +125,9 @@ export class SymbolProfileService {
private getSymbols( private getSymbols(
symbolProfiles: (SymbolProfile & { symbolProfiles: (SymbolProfile & {
_count: { Order: number }; _count: { Order: number };
Order?: {
date: Date;
}[];
SymbolProfileOverrides: SymbolProfileOverrides; SymbolProfileOverrides: SymbolProfileOverrides;
})[] })[]
): EnhancedSymbolProfile[] { ): EnhancedSymbolProfile[] {
@ -128,6 +138,7 @@ export class SymbolProfileService {
countries: this.getCountries( countries: this.getCountries(
symbolProfile?.countries as unknown as Prisma.JsonArray symbolProfile?.countries as unknown as Prisma.JsonArray
), ),
dateOfFirstActivity: <Date>undefined,
scraperConfiguration: this.getScraperConfiguration(symbolProfile), scraperConfiguration: this.getScraperConfiguration(symbolProfile),
sectors: this.getSectors(symbolProfile), sectors: this.getSectors(symbolProfile),
symbolMapping: this.getSymbolMapping(symbolProfile) symbolMapping: this.getSymbolMapping(symbolProfile)
@ -136,6 +147,9 @@ export class SymbolProfileService {
item.activitiesCount = symbolProfile._count.Order; item.activitiesCount = symbolProfile._count.Order;
delete item._count; delete item._count;
item.dateOfFirstActivity = symbolProfile.Order?.[0]?.date;
delete item.Order;
if (item.SymbolProfileOverrides) { if (item.SymbolProfileOverrides) {
item.assetClass = item.assetClass =
item.SymbolProfileOverrides.assetClass ?? 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, addDays,
format, format,
isBefore, isBefore,
isDate,
isSameDay, isSameDay,
isToday,
isValid, isValid,
parse, parse,
parseISO parseISO
} from 'date-fns'; } from 'date-fns';
import { last } from 'lodash';
import { DeviceDetectorService } from 'ngx-device-detector'; import { DeviceDetectorService } from 'ngx-device-detector';
import { Subject, takeUntil } from 'rxjs'; 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 = {}; this.marketDataByMonth = {};
for (const marketDataItem of [...missingMarketData, ...this.marketData]) { for (const marketDataItem of marketDataItems) {
const currentDay = parseInt(format(marketDataItem.date, 'd'), 10); const currentDay = parseInt(format(marketDataItem.date, 'd'), 10);
const key = format(marketDataItem.date, 'yyyy-MM'); 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 { AdminService } from '@ghostfolio/client/services/admin.service';
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.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 { Filter, UniqueAsset, User } from '@ghostfolio/common/interfaces';
import { AdminMarketDataItem } from '@ghostfolio/common/interfaces/admin-market-data.interface'; import { AdminMarketDataItem } from '@ghostfolio/common/interfaces/admin-market-data.interface';
import { translate } from '@ghostfolio/ui/i18n'; import { translate } from '@ghostfolio/ui/i18n';
import { AssetSubClass, DataSource } from '@prisma/client'; import { AssetSubClass, DataSource } from '@prisma/client';
import { format, parseISO } from 'date-fns';
import { DeviceDetectorService } from 'ngx-device-detector'; import { DeviceDetectorService } from 'ngx-device-detector';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { distinctUntilChanged, switchMap, takeUntil } from 'rxjs/operators'; import { distinctUntilChanged, switchMap, takeUntil } from 'rxjs/operators';
@ -98,7 +97,6 @@ export class AdminMarketDataComponent implements OnDestroy, OnInit {
) { ) {
this.openAssetProfileDialog({ this.openAssetProfileDialog({
dataSource: params['dataSource'], dataSource: params['dataSource'],
dateOfFirstActivity: params['dateOfFirstActivity'],
symbol: params['symbol'] symbol: params['symbol']
}); });
} }
@ -195,18 +193,9 @@ export class AdminMarketDataComponent implements OnDestroy, OnInit {
.subscribe(() => {}); .subscribe(() => {});
} }
public onOpenAssetProfileDialog({ public onOpenAssetProfileDialog({ dataSource, symbol }: UniqueAsset) {
dataSource,
dateOfFirstActivity,
symbol
}: UniqueAsset & { dateOfFirstActivity: string }) {
try {
dateOfFirstActivity = format(parseISO(dateOfFirstActivity), DATE_FORMAT);
} catch {}
this.router.navigate([], { this.router.navigate([], {
queryParams: { queryParams: {
dateOfFirstActivity,
dataSource, dataSource,
symbol, symbol,
assetProfileDialog: true assetProfileDialog: true
@ -221,11 +210,9 @@ export class AdminMarketDataComponent implements OnDestroy, OnInit {
private openAssetProfileDialog({ private openAssetProfileDialog({
dataSource, dataSource,
dateOfFirstActivity,
symbol symbol
}: { }: {
dataSource: DataSource; dataSource: DataSource;
dateOfFirstActivity: string;
symbol: string; symbol: string;
}) { }) {
this.userService this.userService
@ -238,7 +225,6 @@ export class AdminMarketDataComponent implements OnDestroy, OnInit {
autoFocus: false, autoFocus: false,
data: <AssetProfileDialogParams>{ data: <AssetProfileDialogParams>{
dataSource, dataSource,
dateOfFirstActivity,
symbol, symbol,
deviceType: this.deviceType, deviceType: this.deviceType,
locale: this.user?.settings?.locale 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" *matRowDef="let row; columns: displayedColumns"
class="cursor-pointer" class="cursor-pointer"
mat-row mat-row
(click)="onOpenAssetProfileDialog({ dateOfFirstActivity: row.date, dataSource: row.dataSource, symbol: row.symbol })" (click)="onOpenAssetProfileDialog({ dataSource: row.dataSource, symbol: row.symbol })"
></tr> ></tr>
</table> </table>
</div> </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({ this.assetProfileForm.setValue({
comment: this.assetProfile?.comment, comment: this.assetProfile?.comment ?? '',
symbolMapping: JSON.stringify(this.assetProfile?.symbolMapping) symbolMapping: JSON.stringify(this.assetProfile?.symbolMapping ?? {})
}); });
this.assetProfileForm.markAsPristine(); 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 <gf-admin-market-data-detail
class="mb-3" class="mb-3"
[dataSource]="data.dataSource" [dataSource]="data.dataSource"
[dateOfFirstActivity]="data.dateOfFirstActivity" [dateOfFirstActivity]="assetProfile?.dateOfFirstActivity"
[locale]="data.locale" [locale]="data.locale"
[marketData]="marketDataDetails" [marketData]="marketDataDetails"
[symbol]="data.symbol" [symbol]="data.symbol"
@ -55,10 +55,10 @@
<gf-value <gf-value
i18n i18n
size="medium" size="medium"
[isDate]="data.dateOfFirstActivity ? true : false" [isDate]="assetProfile?.dateOfFirstActivity ? true : false"
[locale]="data.locale" [locale]="data.locale"
[value]="data.dateOfFirstActivity ?? '-'" [value]="assetProfile?.dateOfFirstActivity ?? '-'"
>First Buy Date</gf-value >First Activity</gf-value
> >
</div> </div>
<div class="col-6 mb-3"> <div class="col-6 mb-3">
@ -67,7 +67,7 @@
size="medium" size="medium"
[locale]="data.locale" [locale]="data.locale"
[value]="assetProfile?.activitiesCount ?? 0" [value]="assetProfile?.activitiesCount ?? 0"
>Transactions</gf-value >Activities</gf-value
> >
</div> </div>
<div class="col-6 mb-3"> <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'; import { DataSource } from '@prisma/client';
export interface AssetProfileDialogParams { export interface AssetProfileDialogParams {
dateOfFirstActivity: string;
dataSource: DataSource; dataSource: DataSource;
deviceType: string; deviceType: string;
locale: string; locale: string;

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

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

Loading…
Cancel
Save