Merge branch 'main' of github.com:ghostfolio/ghostfolio
All checks were successful
Docker image CD / build_and_push (push) Successful in 21m42s
All checks were successful
Docker image CD / build_and_push (push) Successful in 21m42s
This commit is contained in:
commit
12ebce03af
@ -13,10 +13,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
|
- Renamed `Order` to `activities` in the `User` database schema
|
||||||
- Improved the language localization for Catalan (`ca`)
|
- Improved the language localization for Catalan (`ca`)
|
||||||
- Improved the language localization for Italian (`it`)
|
- Improved the language localization for Italian (`it`)
|
||||||
- Upgraded `nestjs` from version `10.4.15` to `11.0.12`
|
- Upgraded `nestjs` from version `10.4.15` to `11.0.12`
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed an issue in the watchlist endpoint (`POST`) related to the `HasPermissionGuard`
|
||||||
|
|
||||||
## 2.161.0 - 2025-05-06
|
## 2.161.0 - 2025-05-06
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
@ -821,7 +821,7 @@ export class AdminService {
|
|||||||
where,
|
where,
|
||||||
select: {
|
select: {
|
||||||
_count: {
|
_count: {
|
||||||
select: { Account: true, Order: true }
|
select: { Account: true, activities: true }
|
||||||
},
|
},
|
||||||
Analytics: {
|
Analytics: {
|
||||||
select: {
|
select: {
|
||||||
@ -869,10 +869,10 @@ export class AdminService {
|
|||||||
role,
|
role,
|
||||||
subscription,
|
subscription,
|
||||||
accountCount: _count.Account || 0,
|
accountCount: _count.Account || 0,
|
||||||
|
activityCount: _count.activities || 0,
|
||||||
country: Analytics?.country,
|
country: Analytics?.country,
|
||||||
dailyApiRequests: Analytics?.dataProviderGhostfolioDailyRequests || 0,
|
dailyApiRequests: Analytics?.dataProviderGhostfolioDailyRequests || 0,
|
||||||
lastActivity: Analytics?.updatedAt,
|
lastActivity: Analytics?.updatedAt
|
||||||
transactionCount: _count.Order || 0
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -39,7 +39,7 @@ export class WatchlistController {
|
|||||||
|
|
||||||
@Post()
|
@Post()
|
||||||
@HasPermission(permissions.createWatchlistItem)
|
@HasPermission(permissions.createWatchlistItem)
|
||||||
@UseGuards(AuthGuard('jwt'))
|
@UseGuards(AuthGuard('jwt'), HasPermissionGuard)
|
||||||
@UseInterceptors(TransformDataSourceInRequestInterceptor)
|
@UseInterceptors(TransformDataSourceInRequestInterceptor)
|
||||||
public async createWatchlistItem(@Body() data: CreateWatchlistItemDto) {
|
public async createWatchlistItem(@Body() data: CreateWatchlistItemDto) {
|
||||||
return this.watchlistService.createWatchlistItem({
|
return this.watchlistService.createWatchlistItem({
|
||||||
|
@ -1,23 +0,0 @@
|
|||||||
import { PortfolioItem, Position } from '@ghostfolio/common/interfaces';
|
|
||||||
|
|
||||||
import { Order } from '../order';
|
|
||||||
|
|
||||||
export interface PortfolioInterface {
|
|
||||||
get(aDate?: Date): PortfolioItem[];
|
|
||||||
|
|
||||||
getFees(): number;
|
|
||||||
|
|
||||||
getPositions(aDate: Date): {
|
|
||||||
[symbol: string]: Position;
|
|
||||||
};
|
|
||||||
|
|
||||||
getSymbols(aDate?: Date): string[];
|
|
||||||
|
|
||||||
getTotalBuy(): number;
|
|
||||||
|
|
||||||
getTotalSell(): number;
|
|
||||||
|
|
||||||
getOrders(): Order[];
|
|
||||||
|
|
||||||
getValue(aDate?: Date): number;
|
|
||||||
}
|
|
@ -257,20 +257,20 @@
|
|||||||
<div class="h5" i18n>Sectors</div>
|
<div class="h5" i18n>Sectors</div>
|
||||||
<gf-portfolio-proportion-chart
|
<gf-portfolio-proportion-chart
|
||||||
[colorScheme]="data.colorScheme"
|
[colorScheme]="data.colorScheme"
|
||||||
|
[data]="sectors"
|
||||||
[isInPercent]="true"
|
[isInPercent]="true"
|
||||||
[keys]="['name']"
|
[keys]="['name']"
|
||||||
[maxItems]="10"
|
[maxItems]="10"
|
||||||
[positions]="sectors"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-6 mb-3">
|
<div class="col-md-6 mb-3">
|
||||||
<div class="h5" i18n>Countries</div>
|
<div class="h5" i18n>Countries</div>
|
||||||
<gf-portfolio-proportion-chart
|
<gf-portfolio-proportion-chart
|
||||||
[colorScheme]="data.colorScheme"
|
[colorScheme]="data.colorScheme"
|
||||||
|
[data]="countries"
|
||||||
[isInPercent]="true"
|
[isInPercent]="true"
|
||||||
[keys]="['name']"
|
[keys]="['name']"
|
||||||
[maxItems]="10"
|
[maxItems]="10"
|
||||||
[positions]="countries"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
@ -142,7 +142,7 @@
|
|||||||
<gf-value
|
<gf-value
|
||||||
class="d-inline-block justify-content-end"
|
class="d-inline-block justify-content-end"
|
||||||
[locale]="user?.settings?.locale"
|
[locale]="user?.settings?.locale"
|
||||||
[value]="element.transactionCount"
|
[value]="element.activityCount"
|
||||||
/>
|
/>
|
||||||
</td>
|
</td>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
@ -259,11 +259,11 @@
|
|||||||
<gf-portfolio-proportion-chart
|
<gf-portfolio-proportion-chart
|
||||||
[baseCurrency]="data.baseCurrency"
|
[baseCurrency]="data.baseCurrency"
|
||||||
[colorScheme]="data.colorScheme"
|
[colorScheme]="data.colorScheme"
|
||||||
|
[data]="sectors"
|
||||||
[isInPercent]="true"
|
[isInPercent]="true"
|
||||||
[keys]="['name']"
|
[keys]="['name']"
|
||||||
[locale]="data.locale"
|
[locale]="data.locale"
|
||||||
[maxItems]="10"
|
[maxItems]="10"
|
||||||
[positions]="sectors"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-6 mb-3">
|
<div class="col-md-6 mb-3">
|
||||||
@ -271,11 +271,11 @@
|
|||||||
<gf-portfolio-proportion-chart
|
<gf-portfolio-proportion-chart
|
||||||
[baseCurrency]="data.baseCurrency"
|
[baseCurrency]="data.baseCurrency"
|
||||||
[colorScheme]="data.colorScheme"
|
[colorScheme]="data.colorScheme"
|
||||||
|
[data]="countries"
|
||||||
[isInPercent]="true"
|
[isInPercent]="true"
|
||||||
[keys]="['name']"
|
[keys]="['name']"
|
||||||
[locale]="data.locale"
|
[locale]="data.locale"
|
||||||
[maxItems]="10"
|
[maxItems]="10"
|
||||||
[positions]="countries"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
@ -48,10 +48,10 @@
|
|||||||
<gf-portfolio-proportion-chart
|
<gf-portfolio-proportion-chart
|
||||||
[baseCurrency]="user?.settings?.baseCurrency"
|
[baseCurrency]="user?.settings?.baseCurrency"
|
||||||
[colorScheme]="user?.settings?.colorScheme"
|
[colorScheme]="user?.settings?.colorScheme"
|
||||||
|
[data]="platforms"
|
||||||
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
||||||
[keys]="['id']"
|
[keys]="['id']"
|
||||||
[locale]="user?.settings?.locale"
|
[locale]="user?.settings?.locale"
|
||||||
[positions]="platforms"
|
|
||||||
/>
|
/>
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
@ -70,10 +70,10 @@
|
|||||||
<gf-portfolio-proportion-chart
|
<gf-portfolio-proportion-chart
|
||||||
[baseCurrency]="user?.settings?.baseCurrency"
|
[baseCurrency]="user?.settings?.baseCurrency"
|
||||||
[colorScheme]="user?.settings?.colorScheme"
|
[colorScheme]="user?.settings?.colorScheme"
|
||||||
|
[data]="positions"
|
||||||
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
||||||
[keys]="['currency']"
|
[keys]="['currency']"
|
||||||
[locale]="user?.settings?.locale"
|
[locale]="user?.settings?.locale"
|
||||||
[positions]="positions"
|
|
||||||
/>
|
/>
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
@ -92,10 +92,10 @@
|
|||||||
<gf-portfolio-proportion-chart
|
<gf-portfolio-proportion-chart
|
||||||
[baseCurrency]="user?.settings?.baseCurrency"
|
[baseCurrency]="user?.settings?.baseCurrency"
|
||||||
[colorScheme]="user?.settings?.colorScheme"
|
[colorScheme]="user?.settings?.colorScheme"
|
||||||
|
[data]="positions"
|
||||||
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
||||||
[keys]="['assetClassLabel', 'assetSubClassLabel']"
|
[keys]="['assetClassLabel', 'assetSubClassLabel']"
|
||||||
[locale]="user?.settings?.locale"
|
[locale]="user?.settings?.locale"
|
||||||
[positions]="positions"
|
|
||||||
/>
|
/>
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
@ -113,10 +113,10 @@
|
|||||||
cursor="pointer"
|
cursor="pointer"
|
||||||
[baseCurrency]="user?.settings?.baseCurrency"
|
[baseCurrency]="user?.settings?.baseCurrency"
|
||||||
[colorScheme]="user?.settings?.colorScheme"
|
[colorScheme]="user?.settings?.colorScheme"
|
||||||
|
[data]="symbols"
|
||||||
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
||||||
[keys]="['symbol']"
|
[keys]="['symbol']"
|
||||||
[locale]="user?.settings?.locale"
|
[locale]="user?.settings?.locale"
|
||||||
[positions]="symbols"
|
|
||||||
[showLabels]="deviceType !== 'mobile'"
|
[showLabels]="deviceType !== 'mobile'"
|
||||||
(proportionChartClicked)="onSymbolChartClicked($event)"
|
(proportionChartClicked)="onSymbolChartClicked($event)"
|
||||||
/>
|
/>
|
||||||
@ -137,11 +137,11 @@
|
|||||||
<gf-portfolio-proportion-chart
|
<gf-portfolio-proportion-chart
|
||||||
[baseCurrency]="user?.settings?.baseCurrency"
|
[baseCurrency]="user?.settings?.baseCurrency"
|
||||||
[colorScheme]="user?.settings?.colorScheme"
|
[colorScheme]="user?.settings?.colorScheme"
|
||||||
|
[data]="sectors"
|
||||||
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
||||||
[keys]="['name']"
|
[keys]="['name']"
|
||||||
[locale]="user?.settings?.locale"
|
[locale]="user?.settings?.locale"
|
||||||
[maxItems]="10"
|
[maxItems]="10"
|
||||||
[positions]="sectors"
|
|
||||||
/>
|
/>
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
@ -160,10 +160,10 @@
|
|||||||
<gf-portfolio-proportion-chart
|
<gf-portfolio-proportion-chart
|
||||||
[baseCurrency]="user?.settings?.baseCurrency"
|
[baseCurrency]="user?.settings?.baseCurrency"
|
||||||
[colorScheme]="user?.settings?.colorScheme"
|
[colorScheme]="user?.settings?.colorScheme"
|
||||||
|
[data]="continents"
|
||||||
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
||||||
[keys]="['name']"
|
[keys]="['name']"
|
||||||
[locale]="user?.settings?.locale"
|
[locale]="user?.settings?.locale"
|
||||||
[positions]="continents"
|
|
||||||
/>
|
/>
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
@ -182,9 +182,9 @@
|
|||||||
<gf-portfolio-proportion-chart
|
<gf-portfolio-proportion-chart
|
||||||
[baseCurrency]="user?.settings?.baseCurrency"
|
[baseCurrency]="user?.settings?.baseCurrency"
|
||||||
[colorScheme]="user?.settings?.colorScheme"
|
[colorScheme]="user?.settings?.colorScheme"
|
||||||
|
[data]="marketsAdvanced"
|
||||||
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
||||||
[locale]="user?.settings?.locale"
|
[locale]="user?.settings?.locale"
|
||||||
[positions]="marketsAdvanced"
|
|
||||||
/>
|
/>
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
@ -271,11 +271,11 @@
|
|||||||
<gf-portfolio-proportion-chart
|
<gf-portfolio-proportion-chart
|
||||||
[baseCurrency]="user?.settings?.baseCurrency"
|
[baseCurrency]="user?.settings?.baseCurrency"
|
||||||
[colorScheme]="user?.settings?.colorScheme"
|
[colorScheme]="user?.settings?.colorScheme"
|
||||||
|
[data]="countries"
|
||||||
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
||||||
[keys]="['name']"
|
[keys]="['name']"
|
||||||
[locale]="user?.settings?.locale"
|
[locale]="user?.settings?.locale"
|
||||||
[maxItems]="10"
|
[maxItems]="10"
|
||||||
[positions]="countries"
|
|
||||||
/>
|
/>
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
@ -290,10 +290,10 @@
|
|||||||
cursor="pointer"
|
cursor="pointer"
|
||||||
[baseCurrency]="user?.settings?.baseCurrency"
|
[baseCurrency]="user?.settings?.baseCurrency"
|
||||||
[colorScheme]="user?.settings?.colorScheme"
|
[colorScheme]="user?.settings?.colorScheme"
|
||||||
|
[data]="accounts"
|
||||||
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
||||||
[keys]="['id']"
|
[keys]="['id']"
|
||||||
[locale]="user?.settings?.locale"
|
[locale]="user?.settings?.locale"
|
||||||
[positions]="accounts"
|
|
||||||
(proportionChartClicked)="onAccountChartClicked($event)"
|
(proportionChartClicked)="onAccountChartClicked($event)"
|
||||||
/>
|
/>
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
@ -313,10 +313,10 @@
|
|||||||
<gf-portfolio-proportion-chart
|
<gf-portfolio-proportion-chart
|
||||||
[baseCurrency]="user?.settings?.baseCurrency"
|
[baseCurrency]="user?.settings?.baseCurrency"
|
||||||
[colorScheme]="user?.settings?.colorScheme"
|
[colorScheme]="user?.settings?.colorScheme"
|
||||||
|
[data]="positions"
|
||||||
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
||||||
[keys]="['etfProvider']"
|
[keys]="['etfProvider']"
|
||||||
[locale]="user?.settings?.locale"
|
[locale]="user?.settings?.locale"
|
||||||
[positions]="positions"
|
|
||||||
/>
|
/>
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
|
@ -72,9 +72,9 @@
|
|||||||
<mat-card-content>
|
<mat-card-content>
|
||||||
<gf-portfolio-proportion-chart
|
<gf-portfolio-proportion-chart
|
||||||
class="mx-auto"
|
class="mx-auto"
|
||||||
|
[data]="symbols"
|
||||||
[isInPercent]="true"
|
[isInPercent]="true"
|
||||||
[keys]="['symbol']"
|
[keys]="['symbol']"
|
||||||
[positions]="symbols"
|
|
||||||
[showLabels]="deviceType !== 'mobile'"
|
[showLabels]="deviceType !== 'mobile'"
|
||||||
/>
|
/>
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
@ -90,10 +90,10 @@
|
|||||||
</mat-card-header>
|
</mat-card-header>
|
||||||
<mat-card-content>
|
<mat-card-content>
|
||||||
<gf-portfolio-proportion-chart
|
<gf-portfolio-proportion-chart
|
||||||
|
[data]="positions"
|
||||||
[isInPercent]="true"
|
[isInPercent]="true"
|
||||||
[keys]="['currency']"
|
[keys]="['currency']"
|
||||||
[maxItems]="10"
|
[maxItems]="10"
|
||||||
[positions]="positions"
|
|
||||||
/>
|
/>
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
@ -107,10 +107,10 @@
|
|||||||
</mat-card-header>
|
</mat-card-header>
|
||||||
<mat-card-content>
|
<mat-card-content>
|
||||||
<gf-portfolio-proportion-chart
|
<gf-portfolio-proportion-chart
|
||||||
|
[data]="sectors"
|
||||||
[isInPercent]="true"
|
[isInPercent]="true"
|
||||||
[keys]="['name']"
|
[keys]="['name']"
|
||||||
[maxItems]="10"
|
[maxItems]="10"
|
||||||
[positions]="sectors"
|
|
||||||
/>
|
/>
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
@ -126,9 +126,9 @@
|
|||||||
</mat-card-header>
|
</mat-card-header>
|
||||||
<mat-card-content>
|
<mat-card-content>
|
||||||
<gf-portfolio-proportion-chart
|
<gf-portfolio-proportion-chart
|
||||||
|
[data]="continents"
|
||||||
[isInPercent]="true"
|
[isInPercent]="true"
|
||||||
[keys]="['name']"
|
[keys]="['name']"
|
||||||
[positions]="continents"
|
|
||||||
/>
|
/>
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
@ -198,10 +198,10 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg">
|
<div class="col-lg">
|
||||||
<gf-holdings-table
|
<gf-holdings-table
|
||||||
|
[data]="holdings"
|
||||||
[deviceType]="deviceType"
|
[deviceType]="deviceType"
|
||||||
[hasPermissionToOpenDetails]="false"
|
[hasPermissionToOpenDetails]="false"
|
||||||
[hasPermissionToShowValues]="false"
|
[hasPermissionToShowValues]="false"
|
||||||
[holdings]="holdings"
|
|
||||||
[pageSize]="7"
|
[pageSize]="7"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -6383,7 +6383,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">402</context>
|
<context context-type="linenumber">400</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="6333857424161463201" datatype="html">
|
<trans-unit id="6333857424161463201" datatype="html">
|
||||||
@ -6691,11 +6691,11 @@
|
|||||||
<target state="new">No data available</target>
|
<target state="new">No data available</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">404</context>
|
<context context-type="linenumber">402</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">417</context>
|
<context context-type="linenumber">415</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b" datatype="html">
|
<trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b" datatype="html">
|
||||||
|
@ -3106,7 +3106,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">402</context>
|
<context context-type="linenumber">400</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="4893616715766810081" datatype="html">
|
<trans-unit id="4893616715766810081" datatype="html">
|
||||||
@ -3114,11 +3114,11 @@
|
|||||||
<target state="translated">Keine Daten verfügbar</target>
|
<target state="translated">Keine Daten verfügbar</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">404</context>
|
<context context-type="linenumber">402</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">417</context>
|
<context context-type="linenumber">415</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1228771048078164312" datatype="html">
|
<trans-unit id="1228771048078164312" datatype="html">
|
||||||
|
@ -3091,7 +3091,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">402</context>
|
<context context-type="linenumber">400</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="4893616715766810081" datatype="html">
|
<trans-unit id="4893616715766810081" datatype="html">
|
||||||
@ -3099,11 +3099,11 @@
|
|||||||
<target state="translated">Sin datos disponibles</target>
|
<target state="translated">Sin datos disponibles</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">404</context>
|
<context context-type="linenumber">402</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">417</context>
|
<context context-type="linenumber">415</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1228771048078164312" datatype="html">
|
<trans-unit id="1228771048078164312" datatype="html">
|
||||||
|
@ -3162,7 +3162,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">402</context>
|
<context context-type="linenumber">400</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="8106025670158480144" datatype="html">
|
<trans-unit id="8106025670158480144" datatype="html">
|
||||||
@ -3338,11 +3338,11 @@
|
|||||||
<target state="translated">Pas de données disponibles</target>
|
<target state="translated">Pas de données disponibles</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">404</context>
|
<context context-type="linenumber">402</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">417</context>
|
<context context-type="linenumber">415</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="0f845001c88b82c18535e6d44f5597061f506e42" datatype="html">
|
<trans-unit id="0f845001c88b82c18535e6d44f5597061f506e42" datatype="html">
|
||||||
|
@ -3091,7 +3091,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">402</context>
|
<context context-type="linenumber">400</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="4893616715766810081" datatype="html">
|
<trans-unit id="4893616715766810081" datatype="html">
|
||||||
@ -3099,11 +3099,11 @@
|
|||||||
<target state="translated">Nessun dato disponibile</target>
|
<target state="translated">Nessun dato disponibile</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">404</context>
|
<context context-type="linenumber">402</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">417</context>
|
<context context-type="linenumber">415</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1228771048078164312" datatype="html">
|
<trans-unit id="1228771048078164312" datatype="html">
|
||||||
|
@ -3090,7 +3090,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">402</context>
|
<context context-type="linenumber">400</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="4893616715766810081" datatype="html">
|
<trans-unit id="4893616715766810081" datatype="html">
|
||||||
@ -3098,11 +3098,11 @@
|
|||||||
<target state="translated">Geen gegevens beschikbaar</target>
|
<target state="translated">Geen gegevens beschikbaar</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">404</context>
|
<context context-type="linenumber">402</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">417</context>
|
<context context-type="linenumber">415</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1228771048078164312" datatype="html">
|
<trans-unit id="1228771048078164312" datatype="html">
|
||||||
|
@ -5791,7 +5791,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">402</context>
|
<context context-type="linenumber">400</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="6333857424161463201" datatype="html">
|
<trans-unit id="6333857424161463201" datatype="html">
|
||||||
@ -6091,11 +6091,11 @@
|
|||||||
<target state="translated">Brak danych</target>
|
<target state="translated">Brak danych</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">404</context>
|
<context context-type="linenumber">402</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">417</context>
|
<context context-type="linenumber">415</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="d762c43328624b5dd81f3c6a3023203ae9a7553f" datatype="html">
|
<trans-unit id="d762c43328624b5dd81f3c6a3023203ae9a7553f" datatype="html">
|
||||||
|
@ -3002,7 +3002,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">402</context>
|
<context context-type="linenumber">400</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="8106025670158480144" datatype="html">
|
<trans-unit id="8106025670158480144" datatype="html">
|
||||||
@ -3178,11 +3178,11 @@
|
|||||||
<target state="translated">Sem dados disponíveis</target>
|
<target state="translated">Sem dados disponíveis</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">404</context>
|
<context context-type="linenumber">402</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">417</context>
|
<context context-type="linenumber">415</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="064d88bead9e71bd849ecaefd8b38cca8f195a88" datatype="html">
|
<trans-unit id="064d88bead9e71bd849ecaefd8b38cca8f195a88" datatype="html">
|
||||||
|
@ -5479,7 +5479,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">402</context>
|
<context context-type="linenumber">400</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="6333857424161463201" datatype="html">
|
<trans-unit id="6333857424161463201" datatype="html">
|
||||||
@ -5727,11 +5727,11 @@
|
|||||||
<target state="translated">Veri mevcut değil</target>
|
<target state="translated">Veri mevcut değil</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">404</context>
|
<context context-type="linenumber">402</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">417</context>
|
<context context-type="linenumber">415</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1c0638816928ae45284e60504936ca985960df5c" datatype="html">
|
<trans-unit id="1c0638816928ae45284e60504936ca985960df5c" datatype="html">
|
||||||
|
@ -7045,7 +7045,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">402</context>
|
<context context-type="linenumber">400</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="6973601224334878334" datatype="html">
|
<trans-unit id="6973601224334878334" datatype="html">
|
||||||
@ -7533,11 +7533,11 @@
|
|||||||
<target state="translated">Дані недоступні</target>
|
<target state="translated">Дані недоступні</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">404</context>
|
<context context-type="linenumber">402</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">417</context>
|
<context context-type="linenumber">415</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="b225488f8b209e9704760dc9f5d99845a5d07bf6" datatype="html">
|
<trans-unit id="b225488f8b209e9704760dc9f5d99845a5d07bf6" datatype="html">
|
||||||
|
@ -5360,7 +5360,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">402</context>
|
<context context-type="linenumber">400</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="6333857424161463201" datatype="html">
|
<trans-unit id="6333857424161463201" datatype="html">
|
||||||
@ -5623,11 +5623,11 @@
|
|||||||
<source>No data available</source>
|
<source>No data available</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">404</context>
|
<context context-type="linenumber">402</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">417</context>
|
<context context-type="linenumber">415</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="62c28ddba8fedb2ae7b0fff9a641778b59791aa2" datatype="html">
|
<trans-unit id="62c28ddba8fedb2ae7b0fff9a641778b59791aa2" datatype="html">
|
||||||
|
@ -5848,7 +5848,7 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">402</context>
|
<context context-type="linenumber">400</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="6333857424161463201" datatype="html">
|
<trans-unit id="6333857424161463201" datatype="html">
|
||||||
@ -6148,11 +6148,11 @@
|
|||||||
<target state="translated">无可用数据</target>
|
<target state="translated">无可用数据</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">404</context>
|
<context context-type="linenumber">402</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
<context context-type="sourcefile">libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts</context>
|
||||||
<context context-type="linenumber">417</context>
|
<context context-type="linenumber">415</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="62c28ddba8fedb2ae7b0fff9a641778b59791aa2" datatype="html">
|
<trans-unit id="62c28ddba8fedb2ae7b0fff9a641778b59791aa2" datatype="html">
|
||||||
|
@ -4,6 +4,7 @@ export interface AdminUsers {
|
|||||||
count: number;
|
count: number;
|
||||||
users: {
|
users: {
|
||||||
accountCount: number;
|
accountCount: number;
|
||||||
|
activityCount: number;
|
||||||
country: string;
|
country: string;
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
dailyApiRequests: number;
|
dailyApiRequests: number;
|
||||||
@ -11,6 +12,5 @@ export interface AdminUsers {
|
|||||||
id: string;
|
id: string;
|
||||||
lastActivity: Date;
|
lastActivity: Date;
|
||||||
role: Role;
|
role: Role;
|
||||||
transactionCount: number;
|
|
||||||
}[];
|
}[];
|
||||||
}
|
}
|
||||||
|
@ -29,8 +29,6 @@ import type { PortfolioChart } from './portfolio-chart.interface';
|
|||||||
import type { PortfolioDetails } from './portfolio-details.interface';
|
import type { PortfolioDetails } from './portfolio-details.interface';
|
||||||
import type { PortfolioDividends } from './portfolio-dividends.interface';
|
import type { PortfolioDividends } from './portfolio-dividends.interface';
|
||||||
import type { PortfolioInvestments } from './portfolio-investments.interface';
|
import type { PortfolioInvestments } from './portfolio-investments.interface';
|
||||||
import type { PortfolioItem } from './portfolio-item.interface';
|
|
||||||
import type { PortfolioOverview } from './portfolio-overview.interface';
|
|
||||||
import type { PortfolioPerformance } from './portfolio-performance.interface';
|
import type { PortfolioPerformance } from './portfolio-performance.interface';
|
||||||
import type { PortfolioPosition } from './portfolio-position.interface';
|
import type { PortfolioPosition } from './portfolio-position.interface';
|
||||||
import type { PortfolioReportRule } from './portfolio-report-rule.interface';
|
import type { PortfolioReportRule } from './portfolio-report-rule.interface';
|
||||||
@ -116,8 +114,6 @@ export {
|
|||||||
PortfolioHoldingResponse,
|
PortfolioHoldingResponse,
|
||||||
PortfolioHoldingsResponse,
|
PortfolioHoldingsResponse,
|
||||||
PortfolioInvestments,
|
PortfolioInvestments,
|
||||||
PortfolioItem,
|
|
||||||
PortfolioOverview,
|
|
||||||
PortfolioPerformance,
|
PortfolioPerformance,
|
||||||
PortfolioPerformanceResponse,
|
PortfolioPerformanceResponse,
|
||||||
PortfolioPosition,
|
PortfolioPosition,
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
import { Position } from '@ghostfolio/common/interfaces';
|
|
||||||
|
|
||||||
export interface PortfolioItem {
|
|
||||||
date: string;
|
|
||||||
grossPerformancePercent: number;
|
|
||||||
investment: number;
|
|
||||||
positions: { [symbol: string]: Position };
|
|
||||||
value: number;
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
export interface PortfolioOverview {
|
|
||||||
cash: number;
|
|
||||||
committedFunds: number;
|
|
||||||
fees: number;
|
|
||||||
ordersCount: number;
|
|
||||||
totalBuy: number;
|
|
||||||
totalSell: number;
|
|
||||||
}
|
|
@ -25,15 +25,15 @@ type Story = StoryObj<GfPortfolioProportionChartComponent>;
|
|||||||
export const Simple: Story = {
|
export const Simple: Story = {
|
||||||
args: {
|
args: {
|
||||||
baseCurrency: 'USD',
|
baseCurrency: 'USD',
|
||||||
keys: ['name'],
|
data: {
|
||||||
locale: 'en-US',
|
|
||||||
positions: {
|
|
||||||
Africa: { name: 'Africa', value: 983.22461479889288 },
|
Africa: { name: 'Africa', value: 983.22461479889288 },
|
||||||
Asia: { name: 'Asia', value: 12074.754633964973 },
|
Asia: { name: 'Asia', value: 12074.754633964973 },
|
||||||
Europe: { name: 'Europe', value: 34432.837085290535 },
|
Europe: { name: 'Europe', value: 34432.837085290535 },
|
||||||
'North America': { name: 'North America', value: 26539.89987780503 },
|
'North America': { name: 'North America', value: 26539.89987780503 },
|
||||||
Oceania: { name: 'Oceania', value: 1402.220605072031 },
|
Oceania: { name: 'Oceania', value: 1402.220605072031 },
|
||||||
'South America': { name: 'South America', value: 4938.25202180719859 }
|
'South America': { name: 'South America', value: 4938.25202180719859 }
|
||||||
}
|
},
|
||||||
|
keys: ['name'],
|
||||||
|
locale: 'en-US'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -60,18 +60,18 @@ export class GfPortfolioProportionChartComponent
|
|||||||
@Input() baseCurrency: string;
|
@Input() baseCurrency: string;
|
||||||
@Input() colorScheme: ColorScheme;
|
@Input() colorScheme: ColorScheme;
|
||||||
@Input() cursor: string;
|
@Input() cursor: string;
|
||||||
@Input() isInPercent = false;
|
@Input() data: {
|
||||||
@Input() keys: string[] = [];
|
|
||||||
@Input() locale = getLocale();
|
|
||||||
@Input() maxItems?: number;
|
|
||||||
@Input() showLabels = false;
|
|
||||||
@Input() positions: {
|
|
||||||
[symbol: string]: Pick<PortfolioPosition, 'type'> & {
|
[symbol: string]: Pick<PortfolioPosition, 'type'> & {
|
||||||
dataSource?: DataSource;
|
dataSource?: DataSource;
|
||||||
name: string;
|
name: string;
|
||||||
value: number;
|
value: number;
|
||||||
};
|
};
|
||||||
} = {};
|
} = {};
|
||||||
|
@Input() isInPercent = false;
|
||||||
|
@Input() keys: string[] = [];
|
||||||
|
@Input() locale = getLocale();
|
||||||
|
@Input() maxItems?: number;
|
||||||
|
@Input() showLabels = false;
|
||||||
|
|
||||||
@Output() proportionChartClicked = new EventEmitter<AssetProfileIdentifier>();
|
@Output() proportionChartClicked = new EventEmitter<AssetProfileIdentifier>();
|
||||||
|
|
||||||
@ -91,13 +91,13 @@ export class GfPortfolioProportionChartComponent
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ngAfterViewInit() {
|
public ngAfterViewInit() {
|
||||||
if (this.positions) {
|
if (this.data) {
|
||||||
this.initialize();
|
this.initialize();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ngOnChanges() {
|
public ngOnChanges() {
|
||||||
if (this.positions) {
|
if (this.data) {
|
||||||
this.initialize();
|
this.initialize();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -122,47 +122,45 @@ export class GfPortfolioProportionChartComponent
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (this.keys.length > 0) {
|
if (this.keys.length > 0) {
|
||||||
Object.keys(this.positions).forEach((symbol) => {
|
Object.keys(this.data).forEach((symbol) => {
|
||||||
if (this.positions[symbol][this.keys[0]]?.toUpperCase()) {
|
if (this.data[symbol][this.keys[0]]?.toUpperCase()) {
|
||||||
if (chartData[this.positions[symbol][this.keys[0]].toUpperCase()]) {
|
if (chartData[this.data[symbol][this.keys[0]].toUpperCase()]) {
|
||||||
chartData[
|
chartData[this.data[symbol][this.keys[0]].toUpperCase()].value =
|
||||||
this.positions[symbol][this.keys[0]].toUpperCase()
|
chartData[
|
||||||
].value = chartData[
|
this.data[symbol][this.keys[0]].toUpperCase()
|
||||||
this.positions[symbol][this.keys[0]].toUpperCase()
|
].value.plus(this.data[symbol].value || 0);
|
||||||
].value.plus(this.positions[symbol].value || 0);
|
|
||||||
|
|
||||||
if (
|
if (
|
||||||
chartData[this.positions[symbol][this.keys[0]].toUpperCase()]
|
chartData[this.data[symbol][this.keys[0]].toUpperCase()]
|
||||||
.subCategory[this.positions[symbol][this.keys[1]]]
|
.subCategory[this.data[symbol][this.keys[1]]]
|
||||||
) {
|
) {
|
||||||
chartData[
|
chartData[
|
||||||
this.positions[symbol][this.keys[0]].toUpperCase()
|
this.data[symbol][this.keys[0]].toUpperCase()
|
||||||
].subCategory[this.positions[symbol][this.keys[1]]].value =
|
].subCategory[this.data[symbol][this.keys[1]]].value = chartData[
|
||||||
chartData[
|
this.data[symbol][this.keys[0]].toUpperCase()
|
||||||
this.positions[symbol][this.keys[0]].toUpperCase()
|
].subCategory[this.data[symbol][this.keys[1]]].value.plus(
|
||||||
].subCategory[this.positions[symbol][this.keys[1]]].value.plus(
|
this.data[symbol].value || 0
|
||||||
this.positions[symbol].value || 0
|
);
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
chartData[
|
chartData[
|
||||||
this.positions[symbol][this.keys[0]].toUpperCase()
|
this.data[symbol][this.keys[0]].toUpperCase()
|
||||||
].subCategory[
|
].subCategory[this.data[symbol][this.keys[1]] ?? UNKNOWN_KEY] = {
|
||||||
this.positions[symbol][this.keys[1]] ?? UNKNOWN_KEY
|
value: new Big(this.data[symbol].value || 0)
|
||||||
] = { value: new Big(this.positions[symbol].value || 0) };
|
};
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
chartData[this.positions[symbol][this.keys[0]].toUpperCase()] = {
|
chartData[this.data[symbol][this.keys[0]].toUpperCase()] = {
|
||||||
name: this.positions[symbol][this.keys[0]],
|
name: this.data[symbol][this.keys[0]],
|
||||||
subCategory: {},
|
subCategory: {},
|
||||||
value: new Big(this.positions[symbol].value || 0)
|
value: new Big(this.data[symbol].value || 0)
|
||||||
};
|
};
|
||||||
|
|
||||||
if (this.positions[symbol][this.keys[1]]) {
|
if (this.data[symbol][this.keys[1]]) {
|
||||||
chartData[
|
chartData[
|
||||||
this.positions[symbol][this.keys[0]].toUpperCase()
|
this.data[symbol][this.keys[0]].toUpperCase()
|
||||||
].subCategory = {
|
].subCategory = {
|
||||||
[this.positions[symbol][this.keys[1]]]: {
|
[this.data[symbol][this.keys[1]]]: {
|
||||||
value: new Big(this.positions[symbol].value || 0)
|
value: new Big(this.data[symbol].value || 0)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -170,24 +168,24 @@ export class GfPortfolioProportionChartComponent
|
|||||||
} else {
|
} else {
|
||||||
if (chartData[UNKNOWN_KEY]) {
|
if (chartData[UNKNOWN_KEY]) {
|
||||||
chartData[UNKNOWN_KEY].value = chartData[UNKNOWN_KEY].value.plus(
|
chartData[UNKNOWN_KEY].value = chartData[UNKNOWN_KEY].value.plus(
|
||||||
this.positions[symbol].value || 0
|
this.data[symbol].value || 0
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
chartData[UNKNOWN_KEY] = {
|
chartData[UNKNOWN_KEY] = {
|
||||||
name: this.positions[symbol].name,
|
name: this.data[symbol].name,
|
||||||
subCategory: this.keys[1]
|
subCategory: this.keys[1]
|
||||||
? { [this.keys[1]]: { value: new Big(0) } }
|
? { [this.keys[1]]: { value: new Big(0) } }
|
||||||
: undefined,
|
: undefined,
|
||||||
value: new Big(this.positions[symbol].value || 0)
|
value: new Big(this.data[symbol].value || 0)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
Object.keys(this.positions).forEach((symbol) => {
|
Object.keys(this.data).forEach((symbol) => {
|
||||||
chartData[symbol] = {
|
chartData[symbol] = {
|
||||||
name: this.positions[symbol].name,
|
name: this.data[symbol].name,
|
||||||
value: new Big(this.positions[symbol].value || 0)
|
value: new Big(this.data[symbol].value || 0)
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -321,7 +319,7 @@ export class GfPortfolioProportionChartComponent
|
|||||||
const dataIndex = activeElements[0].index;
|
const dataIndex = activeElements[0].index;
|
||||||
const symbol: string = event.chart.data.labels[dataIndex];
|
const symbol: string = event.chart.data.labels[dataIndex];
|
||||||
|
|
||||||
const dataSource = this.positions[symbol]?.dataSource;
|
const dataSource = this.data[symbol]?.dataSource;
|
||||||
|
|
||||||
this.proportionChartClicked.emit({ dataSource, symbol });
|
this.proportionChartClicked.emit({ dataSource, symbol });
|
||||||
} catch {}
|
} catch {}
|
||||||
@ -404,7 +402,7 @@ export class GfPortfolioProportionChartComponent
|
|||||||
symbol = $localize`No data available`;
|
symbol = $localize`No data available`;
|
||||||
}
|
}
|
||||||
|
|
||||||
const name = translate(this.positions[symbol as string]?.name);
|
const name = translate(this.data[symbol as string]?.name);
|
||||||
|
|
||||||
let sum = 0;
|
let sum = 0;
|
||||||
for (const item of context.dataset.data) {
|
for (const item of context.dataset.data) {
|
||||||
|
@ -2,8 +2,7 @@ import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
|
|||||||
import { getLocale } from '@ghostfolio/common/helper';
|
import { getLocale } from '@ghostfolio/common/helper';
|
||||||
import {
|
import {
|
||||||
AssetProfileIdentifier,
|
AssetProfileIdentifier,
|
||||||
HoldingWithParents,
|
HoldingWithParents
|
||||||
PortfolioPosition
|
|
||||||
} from '@ghostfolio/common/interfaces';
|
} from '@ghostfolio/common/interfaces';
|
||||||
import { GfValueComponent } from '@ghostfolio/ui/value';
|
import { GfValueComponent } from '@ghostfolio/ui/value';
|
||||||
|
|
||||||
@ -29,7 +28,6 @@ import {
|
|||||||
import { MatButtonModule } from '@angular/material/button';
|
import { MatButtonModule } from '@angular/material/button';
|
||||||
import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
|
import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
|
||||||
import { MatTableDataSource, MatTableModule } from '@angular/material/table';
|
import { MatTableDataSource, MatTableModule } from '@angular/material/table';
|
||||||
import { DataSource } from '@prisma/client';
|
|
||||||
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
|
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
|
||||||
import { Subject } from 'rxjs';
|
import { Subject } from 'rxjs';
|
||||||
|
|
||||||
@ -64,13 +62,6 @@ export class GfTopHoldingsComponent implements OnChanges, OnDestroy {
|
|||||||
@Input() locale = getLocale();
|
@Input() locale = getLocale();
|
||||||
@Input() pageSize = Number.MAX_SAFE_INTEGER;
|
@Input() pageSize = Number.MAX_SAFE_INTEGER;
|
||||||
@Input() topHoldings: HoldingWithParents[];
|
@Input() topHoldings: HoldingWithParents[];
|
||||||
@Input() positions: {
|
|
||||||
[symbol: string]: Pick<PortfolioPosition, 'type'> & {
|
|
||||||
dataSource?: DataSource;
|
|
||||||
name: string;
|
|
||||||
value: number;
|
|
||||||
};
|
|
||||||
} = {};
|
|
||||||
|
|
||||||
@Output() holdingClicked = new EventEmitter<AssetProfileIdentifier>();
|
@Output() holdingClicked = new EventEmitter<AssetProfileIdentifier>();
|
||||||
|
|
||||||
|
@ -245,6 +245,7 @@ model Tag {
|
|||||||
|
|
||||||
model User {
|
model User {
|
||||||
accessToken String?
|
accessToken String?
|
||||||
|
activities Order[]
|
||||||
authChallenge String?
|
authChallenge String?
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
id String @id @default(uuid())
|
id String @id @default(uuid())
|
||||||
@ -260,7 +261,6 @@ model User {
|
|||||||
Analytics Analytics?
|
Analytics Analytics?
|
||||||
ApiKey ApiKey[]
|
ApiKey ApiKey[]
|
||||||
AuthDevice AuthDevice[]
|
AuthDevice AuthDevice[]
|
||||||
Order Order[]
|
|
||||||
Settings Settings?
|
Settings Settings?
|
||||||
SymbolProfile SymbolProfile[]
|
SymbolProfile SymbolProfile[]
|
||||||
Tag Tag[]
|
Tag Tag[]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user