diff --git a/CHANGELOG.md b/CHANGELOG.md index 22672c6f1..6dfc32c1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,10 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- Added support to delete an asset from the watchlist (experimental) + ### Changed - Renamed `Order` to `activities` in the `Account` database schema +## 2.157.1 - 2025-04-29 + +### Added + +- Introduced a watchlist to follow assets (experimental) + +### Changed + +- Changed the column label from _Index_ to _Name_ in the benchmark component +- Extended the data providers management of the admin control panel +- Improved the language localization for German (`de`) + ## 2.156.0 - 2025-04-27 ### Changed diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index e9952ea08..d8507bbb0 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -68,7 +68,7 @@ export class AdminController { @HasPermission(permissions.accessAdminControl) @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getAdminData(): Promise { - return this.adminService.get(); + return this.adminService.get({ user: this.request.user }); } @HasPermission(permissions.accessAdminControl) diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index e72902704..ce8adaf65 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -29,7 +29,7 @@ import { Filter } from '@ghostfolio/common/interfaces'; import { Sector } from '@ghostfolio/common/interfaces/sector.interface'; -import { MarketDataPreset } from '@ghostfolio/common/types'; +import { MarketDataPreset, UserWithSettings } from '@ghostfolio/common/types'; import { BadRequestException, @@ -134,7 +134,9 @@ export class AdminService { } } - public async get(): Promise { + public async get({ user }: { user: UserWithSettings }): Promise { + const dataSources = await this.dataProviderService.getDataSources({ user }); + const [settings, transactionCount, userCount] = await Promise.all([ this.propertyService.get(), this.prismaService.order.count(), @@ -145,6 +147,11 @@ export class AdminService { settings, transactionCount, userCount, + dataProviders: dataSources.map((dataSource) => { + return this.dataProviderService + .getDataProvider(dataSource) + .getDataProviderInfo(); + }), version: environment.version }; } diff --git a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts index 7281697bd..bdaecf718 100644 --- a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts +++ b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts @@ -1,5 +1,6 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; +import { GhostfolioService as GhostfolioDataProviderService } from '@ghostfolio/api/services/data-provider/ghostfolio/ghostfolio.service'; import { GetAssetProfileParams, GetDividendsParams, @@ -327,10 +328,15 @@ export class GhostfolioService { } private getDataProviderInfo(): DataProviderInfo { + const ghostfolioDataProviderService = new GhostfolioDataProviderService( + this.configurationService, + this.propertyService + ); + return { + ...ghostfolioDataProviderService.getDataProviderInfo(), isPremium: false, - name: 'Ghostfolio Premium', - url: 'https://ghostfol.io' + name: 'Ghostfolio Premium' }; } diff --git a/apps/api/src/app/endpoints/watchlist/watchlist.controller.ts b/apps/api/src/app/endpoints/watchlist/watchlist.controller.ts index 0d25172c8..c9e41d5d3 100644 --- a/apps/api/src/app/endpoints/watchlist/watchlist.controller.ts +++ b/apps/api/src/app/endpoints/watchlist/watchlist.controller.ts @@ -2,7 +2,7 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorat import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor'; import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor'; -import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; +import { WatchlistResponse } from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; import { RequestWithUser } from '@ghostfolio/common/types'; @@ -53,13 +53,13 @@ export class WatchlistController { @Param('dataSource') dataSource: DataSource, @Param('symbol') symbol: string ) { - const watchlistItem = await this.watchlistService - .getWatchlistItems(this.request.user.id) - .then((items) => { - return items.find((item) => { - return item.dataSource === dataSource && item.symbol === symbol; - }); - }); + const watchlistItems = await this.watchlistService.getWatchlistItems( + this.request.user.id + ); + + const watchlistItem = watchlistItems.find((item) => { + return item.dataSource === dataSource && item.symbol === symbol; + }); if (!watchlistItem) { throw new HttpException( @@ -79,7 +79,13 @@ export class WatchlistController { @HasPermission(permissions.readWatchlist) @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(TransformDataSourceInResponseInterceptor) - public async getWatchlistItems(): Promise { - return this.watchlistService.getWatchlistItems(this.request.user.id); + public async getWatchlistItems(): Promise { + const watchlist = await this.watchlistService.getWatchlistItems( + this.request.user.id + ); + + return { + watchlist + }; } } diff --git a/apps/api/src/app/endpoints/watchlist/watchlist.module.ts b/apps/api/src/app/endpoints/watchlist/watchlist.module.ts index 15115888b..2addd2de0 100644 --- a/apps/api/src/app/endpoints/watchlist/watchlist.module.ts +++ b/apps/api/src/app/endpoints/watchlist/watchlist.module.ts @@ -1,6 +1,9 @@ import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module'; import { TransformDataSourceInResponseModule } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.module'; +import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; +import { DataGatheringModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module'; +import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; import { Module } from '@nestjs/common'; @@ -10,7 +13,10 @@ import { WatchlistService } from './watchlist.service'; @Module({ controllers: [WatchlistController], imports: [ + DataGatheringModule, + DataProviderModule, PrismaModule, + SymbolProfileModule, TransformDataSourceInRequestModule, TransformDataSourceInResponseModule ], diff --git a/apps/api/src/app/endpoints/watchlist/watchlist.service.ts b/apps/api/src/app/endpoints/watchlist/watchlist.service.ts index fdb9dd97a..6ff71ec50 100644 --- a/apps/api/src/app/endpoints/watchlist/watchlist.service.ts +++ b/apps/api/src/app/endpoints/watchlist/watchlist.service.ts @@ -1,12 +1,20 @@ +import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; +import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service'; +import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; -import { Injectable, NotFoundException } from '@nestjs/common'; -import { DataSource } from '@prisma/client'; +import { BadRequestException, Injectable } from '@nestjs/common'; +import { DataSource, Prisma } from '@prisma/client'; @Injectable() export class WatchlistService { - public constructor(private readonly prismaService: PrismaService) {} + public constructor( + private readonly dataGatheringService: DataGatheringService, + private readonly dataProviderService: DataProviderService, + private readonly prismaService: PrismaService, + private readonly symbolProfileService: SymbolProfileService + ) {} public async createWatchlistItem({ dataSource, @@ -24,11 +32,26 @@ export class WatchlistService { }); if (!symbolProfile) { - throw new NotFoundException( - `Asset profile not found for ${symbol} (${dataSource})` + const assetProfiles = await this.dataProviderService.getAssetProfiles([ + { dataSource, symbol } + ]); + + if (!assetProfiles[symbol]?.currency) { + throw new BadRequestException( + `Asset profile not found for ${symbol} (${dataSource})` + ); + } + + await this.symbolProfileService.add( + assetProfiles[symbol] as Prisma.SymbolProfileCreateInput ); } + await this.dataGatheringService.gatherSymbol({ + dataSource, + symbol + }); + await this.prismaService.user.update({ data: { watchlist: { diff --git a/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts b/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts index f9593f0d0..1e8f7eefa 100644 --- a/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts +++ b/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts @@ -52,6 +52,7 @@ export class AlphaVantageService implements DataProviderInterface { public getDataProviderInfo(): DataProviderInfo { return { + dataSource: DataSource.ALPHA_VANTAGE, isPremium: false, name: 'Alpha Vantage', url: 'https://www.alphavantage.co' diff --git a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts index d53355b9c..7776ff46c 100644 --- a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts +++ b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts @@ -92,6 +92,7 @@ export class CoinGeckoService implements DataProviderInterface { public getDataProviderInfo(): DataProviderInfo { return { + dataSource: DataSource.COINGECKO, isPremium: false, name: 'CoinGecko', url: 'https://coingecko.com' diff --git a/apps/api/src/services/data-provider/data-provider.service.ts b/apps/api/src/services/data-provider/data-provider.service.ts index a4edd5bfa..3d8f2e553 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -26,6 +26,7 @@ import { LookupItem, LookupResponse } from '@ghostfolio/common/interfaces'; +import { hasRole } from '@ghostfolio/common/permissions'; import type { Granularity, UserWithSettings } from '@ghostfolio/common/types'; import { Inject, Injectable, Logger } from '@nestjs/common'; @@ -169,6 +170,7 @@ export class DataProviderService { let dataSourcesKey: 'DATA_SOURCES' | 'DATA_SOURCES_LEGACY' = 'DATA_SOURCES'; if ( + !hasRole(user, 'ADMIN') && isBefore(user.createdAt, new Date('2025-03-23')) && this.configurationService.get('DATA_SOURCES_LEGACY')?.length > 0 ) { @@ -185,7 +187,7 @@ export class DataProviderService { PROPERTY_API_KEY_GHOSTFOLIO )) as string; - if (ghostfolioApiKey) { + if (ghostfolioApiKey || hasRole(user, 'ADMIN')) { dataSources.push('GHOSTFOLIO'); } @@ -670,6 +672,7 @@ export class DataProviderService { lookupItem.dataProviderInfo.isPremium = false; } + lookupItem.dataProviderInfo.dataSource = undefined; lookupItem.dataProviderInfo.name = undefined; lookupItem.dataProviderInfo.url = undefined; } else { diff --git a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts index 376b8f159..ddb94bb1a 100644 --- a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts +++ b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts @@ -68,6 +68,7 @@ export class EodHistoricalDataService implements DataProviderInterface { public getDataProviderInfo(): DataProviderInfo { return { + dataSource: DataSource.EOD_HISTORICAL_DATA, isPremium: true, name: 'EOD Historical Data', url: 'https://eodhd.com' diff --git a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts index 4e42201d0..d0e674c4d 100644 --- a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts +++ b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts @@ -223,6 +223,7 @@ export class FinancialModelingPrepService implements DataProviderInterface { public getDataProviderInfo(): DataProviderInfo { return { + dataSource: DataSource.FINANCIAL_MODELING_PREP, isPremium: true, name: 'Financial Modeling Prep', url: 'https://financialmodelingprep.com/developer/docs' diff --git a/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts b/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts index 097464e2f..90354ace5 100644 --- a/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts +++ b/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts @@ -92,9 +92,10 @@ export class GhostfolioService implements DataProviderInterface { public getDataProviderInfo(): DataProviderInfo { return { + dataSource: DataSource.GHOSTFOLIO, isPremium: true, name: 'Ghostfolio', - url: 'https://ghostfo.io' + url: 'https://ghostfol.io' }; } diff --git a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts index 0c466972d..f067f042c 100644 --- a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts +++ b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts @@ -47,6 +47,7 @@ export class GoogleSheetsService implements DataProviderInterface { public getDataProviderInfo(): DataProviderInfo { return { + dataSource: DataSource.GOOGLE_SHEETS, isPremium: false, name: 'Google Sheets', url: 'https://docs.google.com/spreadsheets' diff --git a/apps/api/src/services/data-provider/manual/manual.service.ts b/apps/api/src/services/data-provider/manual/manual.service.ts index 331806098..66e625e47 100644 --- a/apps/api/src/services/data-provider/manual/manual.service.ts +++ b/apps/api/src/services/data-provider/manual/manual.service.ts @@ -64,6 +64,7 @@ export class ManualService implements DataProviderInterface { public getDataProviderInfo(): DataProviderInfo { return { + dataSource: DataSource.MANUAL, isPremium: false }; } diff --git a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts index 7762be426..05f1c0e5d 100644 --- a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts +++ b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts @@ -43,6 +43,7 @@ export class RapidApiService implements DataProviderInterface { public getDataProviderInfo(): DataProviderInfo { return { + dataSource: DataSource.RAPID_API, isPremium: false, name: 'Rapid API', url: 'https://rapidapi.com' diff --git a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts index 6b42c9283..b9be5553e 100644 --- a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts +++ b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts @@ -51,6 +51,7 @@ export class YahooFinanceService implements DataProviderInterface { public getDataProviderInfo(): DataProviderInfo { return { + dataSource: DataSource.YAHOO, isPremium: false, name: 'Yahoo Finance', url: 'https://finance.yahoo.com' diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.html b/apps/client/src/app/components/admin-settings/admin-settings.component.html index 305d6ce49..977c8a372 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.component.html +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -4,74 +4,100 @@

Data Providers

-
-
- - @if (isGhostfolioApiKeyValid === false) { - Early Access - } - Ghostfolio Premium - - - @if (isGhostfolioApiKeyValid === true) { -
- - Valid until - {{ - ghostfolioApiStatus?.subscription?.expiresAt - | date: defaultDateFormat - }} -
- } -
-
- @if (isGhostfolioApiKeyValid === true) { -
-
- {{ ghostfolioApiStatus.dailyRequests }} - of - {{ ghostfolioApiStatus.dailyRequestsMax }} - daily requests + @for (dataProvider of dataProviders; track dataProvider.name) { +
+ @if (dataProvider.name === 'Ghostfolio') { +
+
+ +
+ + Ghostfolio Premium + + @if (isGhostfolioApiKeyValid === false) { + Early Access + } + + @if (isGhostfolioApiKeyValid === true) { +
+ + Valid until + {{ + ghostfolioApiStatus?.subscription?.expiresAt + | date: defaultDateFormat + }} +
+ } +
- - -
+
+ @if (isGhostfolioApiKeyValid === true) { +
+
+ {{ ghostfolioApiStatus.dailyRequests }} + of + {{ ghostfolioApiStatus.dailyRequestsMax }} + daily requests +
+ + + + +
+ } @else if (isGhostfolioApiKeyValid === false) { + - + } +
+ } @else { +
+
+ + {{ dataProvider.name }} +
- } @else if (isGhostfolioApiKeyValid === false) { - +
}
-
+ }
diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.ts b/apps/client/src/app/components/admin-settings/admin-settings.component.ts index be077c0e6..68c196962 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.component.ts +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.ts @@ -10,6 +10,7 @@ import { import { getDateFormatString } from '@ghostfolio/common/helper'; import { DataProviderGhostfolioStatusResponse, + DataProviderInfo, User } from '@ghostfolio/common/interfaces'; @@ -25,6 +26,7 @@ import { DeviceDetectorService } from 'ngx-device-detector'; import { catchError, filter, of, Subject, takeUntil } from 'rxjs'; import { GfGhostfolioPremiumApiDialogComponent } from './ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.component'; +import { GhostfolioPremiumApiDialogParams } from './ghostfolio-premium-api-dialog/interfaces/interfaces'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, @@ -34,6 +36,7 @@ import { GfGhostfolioPremiumApiDialogComponent } from './ghostfolio-premium-api- standalone: false }) export class AdminSettingsComponent implements OnDestroy, OnInit { + public dataProviders: DataProviderInfo[]; public defaultDateFormat: string; public ghostfolioApiStatus: DataProviderGhostfolioStatusResponse; public isGhostfolioApiKeyValid: boolean; @@ -101,9 +104,8 @@ export class AdminSettingsComponent implements OnDestroy, OnInit { autoFocus: false, data: { deviceType: this.deviceType, - pricingUrl: this.pricingUrl, - user: this.user - }, + pricingUrl: this.pricingUrl + } as GhostfolioPremiumApiDialogParams, height: this.deviceType === 'mobile' ? '98vh' : undefined, width: this.deviceType === 'mobile' ? '100vw' : '50rem' } @@ -124,23 +126,36 @@ export class AdminSettingsComponent implements OnDestroy, OnInit { private initialize() { this.adminService - .fetchGhostfolioDataProviderStatus() - .pipe( - catchError(() => { - this.isGhostfolioApiKeyValid = false; - - this.changeDetectorRef.markForCheck(); - - return of(null); - }), - filter((status) => { - return status !== null; - }), - takeUntil(this.unsubscribeSubject) - ) - .subscribe((status) => { - this.ghostfolioApiStatus = status; - this.isGhostfolioApiKeyValid = true; + .fetchAdminData() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(({ dataProviders, settings }) => { + this.dataProviders = dataProviders.filter(({ dataSource }) => { + return dataSource !== 'MANUAL'; + }); + + this.adminService + .fetchGhostfolioDataProviderStatus( + settings[PROPERTY_API_KEY_GHOSTFOLIO] as string + ) + .pipe( + catchError(() => { + this.isGhostfolioApiKeyValid = false; + + this.changeDetectorRef.markForCheck(); + + return of(null); + }), + filter((status) => { + return status !== null; + }), + takeUntil(this.unsubscribeSubject) + ) + .subscribe((status) => { + this.ghostfolioApiStatus = status; + this.isGhostfolioApiKeyValid = true; + + this.changeDetectorRef.markForCheck(); + }); this.changeDetectorRef.markForCheck(); }); diff --git a/apps/client/src/app/components/admin-settings/admin-settings.module.ts b/apps/client/src/app/components/admin-settings/admin-settings.module.ts index 5a5c39cde..79b269a62 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.module.ts +++ b/apps/client/src/app/components/admin-settings/admin-settings.module.ts @@ -1,5 +1,6 @@ import { GfAdminPlatformModule } from '@ghostfolio/client/components/admin-platform/admin-platform.module'; import { GfAdminTagModule } from '@ghostfolio/client/components/admin-tag/admin-tag.module'; +import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { CommonModule } from '@angular/common'; @@ -17,6 +18,7 @@ import { AdminSettingsComponent } from './admin-settings.component'; CommonModule, GfAdminPlatformModule, GfAdminTagModule, + GfAssetProfileIconComponent, GfPremiumIndicatorComponent, MatButtonModule, MatCardModule, diff --git a/apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html b/apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html index d3b0985fa..017133f5b 100644 --- a/apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html +++ b/apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html @@ -7,8 +7,8 @@ />
-

- The official +

+ Early access to the official data provider for self-hosters, offering 80’000+ tickers from over 50 exchanges, is - coming soon! -

-

- Want to stay updated? Click below to get notified as soon as it’s available. + ready now!

Notify meGet Early Access +
+ or +
+ - } + I have an API key +
diff --git a/apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/interfaces/interfaces.ts index 157a6f414..0c629599e 100644 --- a/apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/interfaces/interfaces.ts @@ -1,7 +1,4 @@ -import { User } from '@ghostfolio/common/interfaces'; - export interface GhostfolioPremiumApiDialogParams { deviceType: string; pricingUrl: string; - user: User; } diff --git a/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.scss b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.scss new file mode 100644 index 000000000..5d4e87f30 --- /dev/null +++ b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.scss @@ -0,0 +1,3 @@ +:host { + display: block; +} diff --git a/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts new file mode 100644 index 000000000..722f680c3 --- /dev/null +++ b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts @@ -0,0 +1,92 @@ +import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete'; + +import { CommonModule } from '@angular/common'; +import { + ChangeDetectionStrategy, + Component, + OnDestroy, + OnInit +} from '@angular/core'; +import { + AbstractControl, + FormBuilder, + FormControl, + FormGroup, + FormsModule, + ReactiveFormsModule, + ValidationErrors, + Validators +} from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule, MatDialogRef } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { Subject } from 'rxjs'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + host: { class: 'h-100' }, + imports: [ + CommonModule, + FormsModule, + GfSymbolAutocompleteComponent, + MatButtonModule, + MatDialogModule, + MatFormFieldModule, + ReactiveFormsModule + ], + selector: 'gf-create-watchlist-item-dialog', + styleUrls: ['./create-watchlist-item-dialog.component.scss'], + templateUrl: 'create-watchlist-item-dialog.html' +}) +export class CreateWatchlistItemDialogComponent implements OnInit, OnDestroy { + public createWatchlistItemForm: FormGroup; + + private unsubscribeSubject = new Subject(); + + public constructor( + public readonly dialogRef: MatDialogRef, + public readonly formBuilder: FormBuilder + ) {} + + public ngOnInit() { + this.createWatchlistItemForm = this.formBuilder.group( + { + searchSymbol: new FormControl(null, [Validators.required]) + }, + { + validators: this.validator + } + ); + } + + public onCancel() { + this.dialogRef.close(); + } + + public onSubmit() { + this.dialogRef.close({ + dataSource: + this.createWatchlistItemForm.get('searchSymbol').value.dataSource, + symbol: this.createWatchlistItemForm.get('searchSymbol').value.symbol + }); + } + + public ngOnDestroy() { + this.unsubscribeSubject.next(); + this.unsubscribeSubject.complete(); + } + + private validator(control: AbstractControl): ValidationErrors { + const searchSymbolControl = control.get('searchSymbol'); + + if ( + searchSymbolControl.valid && + searchSymbolControl.value.dataSource && + searchSymbolControl.value.symbol + ) { + return { incomplete: false }; + } + + return { incomplete: true }; + } +} diff --git a/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html new file mode 100644 index 000000000..dd59a9309 --- /dev/null +++ b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html @@ -0,0 +1,25 @@ +
+

Add asset to watchlist

+
+ + Name, symbol or ISIN + + +
+
+ + +
+
diff --git a/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/interfaces/interfaces.ts new file mode 100644 index 000000000..c0f74d022 --- /dev/null +++ b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/interfaces/interfaces.ts @@ -0,0 +1,4 @@ +export interface CreateWatchlistItemDialogParams { + deviceType: string; + locale: string; +} diff --git a/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts b/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts new file mode 100644 index 000000000..daf512b34 --- /dev/null +++ b/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts @@ -0,0 +1,168 @@ +import { DataService } from '@ghostfolio/client/services/data.service'; +import { UserService } from '@ghostfolio/client/services/user/user.service'; +import { + AssetProfileIdentifier, + Benchmark, + User +} from '@ghostfolio/common/interfaces'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { GfBenchmarkComponent } from '@ghostfolio/ui/benchmark'; +import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; + +import { CommonModule } from '@angular/common'; +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + CUSTOM_ELEMENTS_SCHEMA, + OnDestroy, + OnInit +} from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialog } from '@angular/material/dialog'; +import { ActivatedRoute, Router, RouterModule } from '@angular/router'; +import { DeviceDetectorService } from 'ngx-device-detector'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { CreateWatchlistItemDialogComponent } from './create-watchlist-item-dialog/create-watchlist-item-dialog.component'; +import { CreateWatchlistItemDialogParams } from './create-watchlist-item-dialog/interfaces/interfaces'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + CommonModule, + GfBenchmarkComponent, + GfPremiumIndicatorComponent, + MatButtonModule, + RouterModule + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + selector: 'gf-home-watchlist', + styleUrls: ['./home-watchlist.scss'], + templateUrl: './home-watchlist.html' +}) +export class HomeWatchlistComponent implements OnDestroy, OnInit { + public deviceType: string; + public hasPermissionToCreateWatchlistItem: boolean; + public hasPermissionToDeleteWatchlistItem: boolean; + public user: User; + public watchlist: Benchmark[]; + + private unsubscribeSubject = new Subject(); + + public constructor( + private changeDetectorRef: ChangeDetectorRef, + private dataService: DataService, + private deviceService: DeviceDetectorService, + private dialog: MatDialog, + private route: ActivatedRoute, + private router: Router, + private userService: UserService + ) { + this.deviceType = this.deviceService.getDeviceInfo().deviceType; + + this.route.queryParams + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((params) => { + if (params['createWatchlistItemDialog']) { + this.openCreateWatchlistItemDialog(); + } + }); + + this.userService.stateChanged + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((state) => { + if (state?.user) { + this.user = state.user; + + this.hasPermissionToCreateWatchlistItem = hasPermission( + this.user.permissions, + permissions.createWatchlistItem + ); + this.hasPermissionToDeleteWatchlistItem = hasPermission( + this.user.permissions, + permissions.deleteWatchlistItem + ); + + this.changeDetectorRef.markForCheck(); + } + }); + } + + public ngOnInit() { + this.loadWatchlistData(); + } + + public onWatchlistItemDeleted({ + dataSource, + symbol + }: AssetProfileIdentifier) { + this.dataService + .deleteWatchlistItem({ dataSource, symbol }) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe({ + next: () => { + return this.loadWatchlistData(); + } + }); + } + + public ngOnDestroy() { + this.unsubscribeSubject.next(); + this.unsubscribeSubject.complete(); + } + + private loadWatchlistData() { + this.dataService + .fetchWatchlist() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(({ watchlist }) => { + this.watchlist = watchlist.map(({ dataSource, symbol }) => ({ + dataSource, + symbol, + marketCondition: null, + name: symbol, + performances: null, + trend50d: 'UNKNOWN', + trend200d: 'UNKNOWN' + })); + + this.changeDetectorRef.markForCheck(); + }); + } + + private openCreateWatchlistItemDialog() { + this.userService + .get() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((user) => { + this.user = user; + + const dialogRef = this.dialog.open(CreateWatchlistItemDialogComponent, { + autoFocus: false, + data: { + deviceType: this.deviceType, + locale: this.user?.settings?.locale + } as CreateWatchlistItemDialogParams, + width: this.deviceType === 'mobile' ? '100vw' : '50rem' + }); + + dialogRef + .afterClosed() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(({ dataSource, symbol } = {}) => { + if (dataSource && symbol) { + this.dataService + .postWatchlistItem({ dataSource, symbol }) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe({ + next: () => this.loadWatchlistData() + }); + } + + this.router.navigate(['.'], { relativeTo: this.route }); + }); + }); + } +} diff --git a/apps/client/src/app/components/home-watchlist/home-watchlist.html b/apps/client/src/app/components/home-watchlist/home-watchlist.html new file mode 100644 index 000000000..ef073d331 --- /dev/null +++ b/apps/client/src/app/components/home-watchlist/home-watchlist.html @@ -0,0 +1,35 @@ +
+

+ + Watchlist + @if (user?.subscription?.type === 'Basic') { + + } + +

+
+
+ +
+
+
+@if (hasPermissionToCreateWatchlistItem) { +
+ + + +
+} diff --git a/apps/client/src/app/components/home-watchlist/home-watchlist.scss b/apps/client/src/app/components/home-watchlist/home-watchlist.scss new file mode 100644 index 000000000..5d4e87f30 --- /dev/null +++ b/apps/client/src/app/components/home-watchlist/home-watchlist.scss @@ -0,0 +1,3 @@ +:host { + display: block; +} diff --git a/apps/client/src/app/pages/home/home-page-routing.module.ts b/apps/client/src/app/pages/home/home-page-routing.module.ts index f50b55192..9a915f0b3 100644 --- a/apps/client/src/app/pages/home/home-page-routing.module.ts +++ b/apps/client/src/app/pages/home/home-page-routing.module.ts @@ -2,6 +2,7 @@ import { HomeHoldingsComponent } from '@ghostfolio/client/components/home-holdin import { HomeMarketComponent } from '@ghostfolio/client/components/home-market/home-market.component'; import { HomeOverviewComponent } from '@ghostfolio/client/components/home-overview/home-overview.component'; import { HomeSummaryComponent } from '@ghostfolio/client/components/home-summary/home-summary.component'; +import { HomeWatchlistComponent } from '@ghostfolio/client/components/home-watchlist/home-watchlist.component'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { NgModule } from '@angular/core'; @@ -36,6 +37,11 @@ const routes: Routes = [ path: 'market', component: HomeMarketComponent, title: $localize`Markets` + }, + { + path: 'watchlist', + component: HomeWatchlistComponent, + title: $localize`Watchlist` } ], component: HomePageComponent, diff --git a/apps/client/src/app/pages/home/home-page.component.ts b/apps/client/src/app/pages/home/home-page.component.ts index e307884f8..928ad2931 100644 --- a/apps/client/src/app/pages/home/home-page.component.ts +++ b/apps/client/src/app/pages/home/home-page.component.ts @@ -52,6 +52,12 @@ export class HomePageComponent implements OnDestroy, OnInit { iconName: 'newspaper-outline', label: $localize`Markets`, path: ['/home', 'market'] + }, + { + iconName: 'bookmark-outline', + label: $localize`Watchlist`, + path: ['/home', 'watchlist'], + showCondition: this.user?.settings?.isExperimentalFeatures } ]; this.user = state.user; diff --git a/apps/client/src/app/pages/home/home-page.module.ts b/apps/client/src/app/pages/home/home-page.module.ts index 045cfa8c0..32f031e4e 100644 --- a/apps/client/src/app/pages/home/home-page.module.ts +++ b/apps/client/src/app/pages/home/home-page.module.ts @@ -2,6 +2,7 @@ import { GfHomeHoldingsModule } from '@ghostfolio/client/components/home-holding import { GfHomeMarketModule } from '@ghostfolio/client/components/home-market/home-market.module'; import { GfHomeOverviewModule } from '@ghostfolio/client/components/home-overview/home-overview.module'; import { GfHomeSummaryModule } from '@ghostfolio/client/components/home-summary/home-summary.module'; +import { HomeWatchlistComponent } from '@ghostfolio/client/components/home-watchlist/home-watchlist.component'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -20,6 +21,7 @@ import { HomePageComponent } from './home-page.component'; GfHomeOverviewModule, GfHomeSummaryModule, HomePageRoutingModule, + HomeWatchlistComponent, MatTabsModule, RouterModule ], diff --git a/apps/client/src/app/services/admin.service.ts b/apps/client/src/app/services/admin.service.ts index 89769122d..cb72fb9fd 100644 --- a/apps/client/src/app/services/admin.service.ts +++ b/apps/client/src/app/services/admin.service.ts @@ -4,8 +4,7 @@ import { UpdatePlatformDto } from '@ghostfolio/api/app/platform/update-platform. import { IDataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { HEADER_KEY_SKIP_INTERCEPTOR, - HEADER_KEY_TOKEN, - PROPERTY_API_KEY_GHOSTFOLIO + HEADER_KEY_TOKEN } from '@ghostfolio/common/config'; import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; import { @@ -24,7 +23,6 @@ import { Injectable } from '@angular/core'; import { SortDirection } from '@angular/material/sort'; import { DataSource, MarketData, Platform } from '@prisma/client'; import { JobStatus } from 'bull'; -import { switchMap } from 'rxjs'; import { environment } from '../../environments/environment'; import { DataService } from './data.service'; @@ -115,19 +113,15 @@ export class AdminService { }); } - public fetchGhostfolioDataProviderStatus() { - return this.fetchAdminData().pipe( - switchMap(({ settings }) => { - const headers = new HttpHeaders({ - [HEADER_KEY_SKIP_INTERCEPTOR]: 'true', - [HEADER_KEY_TOKEN]: `Api-Key ${settings[PROPERTY_API_KEY_GHOSTFOLIO]}` - }); - - return this.http.get( - `${environment.production ? 'https://ghostfol.io' : ''}/api/v2/data-providers/ghostfolio/status`, - { headers } - ); - }) + public fetchGhostfolioDataProviderStatus(aApiKey: string) { + const headers = new HttpHeaders({ + [HEADER_KEY_SKIP_INTERCEPTOR]: 'true', + [HEADER_KEY_TOKEN]: `Api-Key ${aApiKey}` + }); + + return this.http.get( + `${environment.production ? 'https://ghostfol.io' : ''}/api/v2/data-providers/ghostfolio/status`, + { headers } ); } diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index 55d76d667..353bc4153 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -6,6 +6,7 @@ import { UpdateAccountDto } from '@ghostfolio/api/app/account/update-account.dto import { UpdateBulkMarketDataDto } from '@ghostfolio/api/app/admin/update-bulk-market-data.dto'; import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto'; import { UpdateTagDto } from '@ghostfolio/api/app/endpoints/tags/update-tag.dto'; +import { CreateWatchlistItemDto } from '@ghostfolio/api/app/endpoints/watchlist/create-watchlist-item.dto'; import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; import { Activities, @@ -44,7 +45,8 @@ import { PortfolioPerformanceResponse, PortfolioReportResponse, PublicPortfolioResponse, - User + User, + WatchlistResponse } from '@ghostfolio/common/interfaces'; import { filterGlobalPermissions } from '@ghostfolio/common/permissions'; import type { @@ -325,6 +327,10 @@ export class DataService { return this.http.delete(`/api/v1/user/${aId}`); } + public deleteWatchlistItem({ dataSource, symbol }: AssetProfileIdentifier) { + return this.http.delete(`/api/v1/watchlist/${dataSource}/${symbol}`); + } + public fetchAccesses() { return this.http.get('/api/v1/access'); } @@ -686,6 +692,10 @@ export class DataService { return this.http.get('/api/v1/tags'); } + public fetchWatchlist() { + return this.http.get('/api/v1/watchlist'); + } + public generateAccessToken(aUserId: string) { return this.http.post( `/api/v1/user/${aUserId}/access-token`, @@ -748,6 +758,10 @@ export class DataService { return this.http.post('/api/v1/user', {}); } + public postWatchlistItem(watchlistItem: CreateWatchlistItemDto) { + return this.http.post('/api/v1/watchlist', watchlistItem); + } + public putAccount(aAccount: UpdateAccountDto) { return this.http.put(`/api/v1/account/${aAccount.id}`, aAccount); } diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 94b8635b5..504ea6e14 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -653,7 +653,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 77 apps/client/src/app/components/header/header.component.ts @@ -1069,6 +1069,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -1473,6 +1477,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -1517,6 +1525,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1937,6 +1949,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -2159,7 +2175,7 @@ Plataformes apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -2167,7 +2183,7 @@ Etiquetes apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -2795,7 +2811,7 @@ or apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -4067,11 +4083,11 @@ Holdings apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -4087,7 +4103,7 @@ Summary apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -4099,7 +4115,7 @@ Markets apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -4943,7 +4959,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6078,14 +6094,6 @@ 197 - - Index - Index - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - 50-Day Trend 50-Day Trend @@ -6115,7 +6123,7 @@ Change from All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -6123,7 +6131,7 @@ from ATH libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -6651,7 +6659,7 @@ Valid until apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -7259,15 +7267,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 - - - - Want to stay updated? Click below to get notified as soon as it’s available. - Want to stay updated? Click below to get notified as soon as it’s available. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 + 83 @@ -7373,7 +7373,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -7381,7 +7381,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -7389,7 +7389,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -7397,7 +7397,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 96 @@ -7408,20 +7408,12 @@ 41 - - Notify me - Notify me - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - - + I have an API key I have an API key apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7565,7 +7557,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 @@ -7933,6 +7925,42 @@ 33 + + Add asset to watchlist + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + + + Get Early Access + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index afdcb1253..8612e948d 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -164,6 +164,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -500,6 +504,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -544,6 +552,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1066,7 +1078,7 @@ oder apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1314,7 +1326,7 @@ Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1974,7 +1986,7 @@ Märkte apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -2154,11 +2166,11 @@ Positionen apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -2228,6 +2240,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -2521,20 +2537,12 @@ 229 - - Index - Index - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - Change from All Time High Änderung vom Allzeithoch libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -2542,7 +2550,7 @@ vom AZH libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -3342,7 +3350,7 @@ Zusammenfassung apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -3390,7 +3398,7 @@ Gültig bis apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -3950,7 +3958,7 @@ Plattformen apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -4678,7 +4686,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5441,7 +5449,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 77 apps/client/src/app/components/header/header.component.ts @@ -7283,15 +7291,7 @@ API-Schlüssel setzen apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 - - - - Want to stay updated? Click below to get notified as soon as it’s available. - Möchtest du auf dem Laufenden bleiben? Dann klicke unten, um benachrichtigt zu werden, sobald es verfügbar ist. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 + 83 @@ -7397,7 +7397,7 @@ von apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -7405,7 +7405,7 @@ täglichen Anfragen apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -7413,7 +7413,7 @@ API-Schlüssel löschen apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -7421,7 +7421,7 @@ Möchtest du den API-Schlüssel wirklich löschen? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 96 @@ -7432,20 +7432,12 @@ 41 - - Notify me - Benachrichtige mich - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - - + I have an API key Ich habe einen API-Schlüssel apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7589,7 +7581,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 @@ -7933,6 +7925,42 @@ 33 + + Add asset to watchlist + Anlage zur Beobachtungsliste hinzufügen + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Beobachtungsliste + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Beobachtungsliste + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + + + Get Early Access + Early Access erhalten + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 6e6f6d3f1..e297e0021 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -165,6 +165,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -501,6 +505,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -545,6 +553,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1051,7 +1063,7 @@ o apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1299,7 +1311,7 @@ Etiquetas apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1959,7 +1971,7 @@ Mercados apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -2139,11 +2151,11 @@ Participaciones apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -2213,6 +2225,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -2506,20 +2522,12 @@ 229 - - Index - Índice - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - Change from All Time High Variación respecto al máximo histórico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -2527,7 +2535,7 @@ desde el máximo histórico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -3327,7 +3335,7 @@ Resumen apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -3375,7 +3383,7 @@ Válido hasta apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -3927,7 +3935,7 @@ Platforms apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -4655,7 +4663,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5418,7 +5426,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 77 apps/client/src/app/components/header/header.component.ts @@ -7260,15 +7268,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 - - - - Want to stay updated? Click below to get notified as soon as it’s available. - Want to stay updated? Click below to get notified as soon as it’s available. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 + 83 @@ -7374,7 +7374,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -7382,7 +7382,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -7390,7 +7390,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -7398,7 +7398,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 96 @@ -7409,20 +7409,12 @@ 41 - - Notify me - Notify me - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - - + I have an API key I have an API key apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7566,7 +7558,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 @@ -7934,6 +7926,42 @@ 33 + + Add asset to watchlist + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + + + Get Early Access + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index c4536731e..376a7cb30 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -172,6 +172,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -556,6 +560,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -600,6 +608,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -906,7 +918,7 @@ Étiquettes apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1402,7 +1414,7 @@ ou apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -2346,11 +2358,11 @@ Positions apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -2366,7 +2378,7 @@ Résumé apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -2378,7 +2390,7 @@ Marchés apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -2448,6 +2460,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -3025,20 +3041,12 @@ 229 - - Index - Indice - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - Change from All Time High Différence avec le Record Historique libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -3046,7 +3054,7 @@ par rapport au record historique libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -3374,7 +3382,7 @@ Valide jusqu’au apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -3926,7 +3934,7 @@ Platformes apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -4654,7 +4662,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5417,7 +5425,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 77 apps/client/src/app/components/header/header.component.ts @@ -7259,15 +7267,7 @@ Définir clé API apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 - - - - Want to stay updated? Click below to get notified as soon as it’s available. - Vous souhaitez rester informé ? Cliquez ci-dessous pour être informé dès qu’il sera disponible. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 + 83 @@ -7373,7 +7373,7 @@ sur apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -7381,7 +7381,7 @@ requêtes journalières apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -7389,7 +7389,7 @@ Retirer la clé API apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -7397,7 +7397,7 @@ Voulez-vous vraiment supprimer la clé API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 96 @@ -7408,20 +7408,12 @@ 41 - - Notify me - Me prévenir - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - - + I have an API key J’ai une clé API apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7565,7 +7557,7 @@ Accès anticipé apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 @@ -7933,6 +7925,42 @@ 33 + + Add asset to watchlist + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + + + Get Early Access + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index e8b29147f..52beb2cbe 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -165,6 +165,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -501,6 +505,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -545,6 +553,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1051,7 +1063,7 @@ oppure apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1299,7 +1311,7 @@ Tag apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1959,7 +1971,7 @@ Mercati apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -2139,11 +2151,11 @@ Partecipazioni apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -2213,6 +2225,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -2506,20 +2522,12 @@ 229 - - Index - Indice - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - Change from All Time High Variazione rispetto al massimo storico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -2527,7 +2535,7 @@ dal massimo storico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -3327,7 +3335,7 @@ Summario apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -3375,7 +3383,7 @@ Valido fino a apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -3927,7 +3935,7 @@ Piattaforme apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -4655,7 +4663,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5418,7 +5426,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 77 apps/client/src/app/components/header/header.component.ts @@ -7260,15 +7268,7 @@ Imposta API Key apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 - - - - Want to stay updated? Click below to get notified as soon as it’s available. - Vuoi seguire le novità? Clicca sotto per essere notificato appena è disponibile. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 + 83 @@ -7374,7 +7374,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -7382,7 +7382,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -7390,7 +7390,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -7398,7 +7398,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 96 @@ -7409,20 +7409,12 @@ 41 - - Notify me - Notify me - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - - + I have an API key I have an API key apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7566,7 +7558,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 @@ -7934,6 +7926,42 @@ 33 + + Add asset to watchlist + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + + + Get Early Access + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 3ea7934ae..b4c312517 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -164,6 +164,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -500,6 +504,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -544,6 +552,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1050,7 +1062,7 @@ of apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1298,7 +1310,7 @@ Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1958,7 +1970,7 @@ Markten apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -2138,11 +2150,11 @@ Posities apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -2212,6 +2224,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -2505,20 +2521,12 @@ 229 - - Index - Index - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - Change from All Time High Verandering van All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -2526,7 +2534,7 @@ van ATH libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -3326,7 +3334,7 @@ Samenvatting apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -3374,7 +3382,7 @@ Geldig tot apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -3926,7 +3934,7 @@ Platforms apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -4654,7 +4662,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5417,7 +5425,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 77 apps/client/src/app/components/header/header.component.ts @@ -7259,15 +7267,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 - - - - Want to stay updated? Click below to get notified as soon as it’s available. - Want to stay updated? Click below to get notified as soon as it’s available. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 + 83 @@ -7373,7 +7373,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -7381,7 +7381,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -7389,7 +7389,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -7397,7 +7397,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 96 @@ -7408,20 +7408,12 @@ 41 - - Notify me - Notify me - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - - + I have an API key I have an API key apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7565,7 +7557,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 @@ -7933,6 +7925,42 @@ 33 + + Add asset to watchlist + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + + + Get Early Access + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 99418ceb0..ef5caf612 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -272,7 +272,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 77 apps/client/src/app/components/header/header.component.ts @@ -997,6 +997,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -1365,6 +1369,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -1409,6 +1417,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1761,6 +1773,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -1991,7 +2007,7 @@ Platformy apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -1999,7 +2015,7 @@ Tagi apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -2451,7 +2467,7 @@ lub apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -3695,11 +3711,11 @@ Inwestycje apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -3715,7 +3731,7 @@ Podsumowanie apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -3727,7 +3743,7 @@ Rynki apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -4555,7 +4571,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5518,14 +5534,6 @@ 67 - - Index - Indeks - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - Last All Time High Ostatni Najwyższy Punkt w Historii @@ -5539,7 +5547,7 @@ Zmiana od Najwyższego Punktu w Historii libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -5547,7 +5555,7 @@ od ATH libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -6051,7 +6059,7 @@ Ważność do apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -7259,15 +7267,7 @@ Skonfiguruj klucz API apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 - - - - Want to stay updated? Click below to get notified as soon as it’s available. - Chcesz być na bieżąco? Kliknij poniżej, aby otrzymać powiadomienie, gdy tylko będzie dostępne. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 + 83 @@ -7373,7 +7373,7 @@ z apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -7381,7 +7381,7 @@ codzienne żądania apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -7389,7 +7389,7 @@ Usuń klucz API apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -7397,7 +7397,7 @@ Czy na pewno chcesz usunąć klucz API?? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 96 @@ -7408,20 +7408,12 @@ 41 - - Notify me - Powiadom mnie - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - - + I have an API key Posiadam klucz API apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7565,7 +7557,7 @@ Wczesny dostęp apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 @@ -7933,6 +7925,42 @@ 33 + + Add asset to watchlist + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + + + Get Early Access + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index f83a0c9c8..b4d2510be 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -172,6 +172,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -556,6 +560,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -600,6 +608,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1282,7 +1294,7 @@ ou apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1602,7 +1614,7 @@ Marcadores apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -2290,7 +2302,7 @@ Mercados apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -2360,6 +2372,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -2662,11 +2678,11 @@ Posições apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -2897,20 +2913,12 @@ 229 - - Index - Índice - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - Change from All Time High Diferença desde o Máximo Histórico libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -2918,7 +2926,7 @@ a partir do ATH (All Time High) libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -3274,7 +3282,7 @@ Sumário apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -3374,7 +3382,7 @@ Válido até apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -3926,7 +3934,7 @@ Plataformas apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -4654,7 +4662,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5417,7 +5425,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 77 apps/client/src/app/components/header/header.component.ts @@ -7259,15 +7267,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 - - - - Want to stay updated? Click below to get notified as soon as it’s available. - Want to stay updated? Click below to get notified as soon as it’s available. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 + 83 @@ -7373,7 +7373,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -7381,7 +7381,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -7389,7 +7389,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -7397,7 +7397,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 96 @@ -7408,20 +7408,12 @@ 41 - - Notify me - Notify me - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - - + I have an API key I have an API key apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7565,7 +7557,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 @@ -7933,6 +7925,42 @@ 33 + + Add asset to watchlist + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + + + Get Early Access + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 7b8f9fcf3..47a489c62 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -272,7 +272,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 77 apps/client/src/app/components/header/header.component.ts @@ -957,6 +957,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -1325,6 +1329,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -1369,6 +1377,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1665,6 +1677,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -1731,7 +1747,7 @@ Etiketler apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1895,7 +1911,7 @@ Platformlar apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -2299,7 +2315,7 @@ veya apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -3251,11 +3267,11 @@ Varlıklar apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -3271,7 +3287,7 @@ Özet apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -3283,7 +3299,7 @@ Piyasalar apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -4043,7 +4059,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -4923,7 +4939,7 @@ Geçerli tarih apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -5214,20 +5230,12 @@ 229 - - Index - Endeks - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - Change from All Time High Tüm Zamanların En Yüksek Seviyesinden (ATH) Değişim libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -5235,7 +5243,7 @@ Tüm Zamanların En Yüksek Seviyesinden libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -7259,15 +7267,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 - - - - Want to stay updated? Click below to get notified as soon as it’s available. - Want to stay updated? Click below to get notified as soon as it’s available. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 + 83 @@ -7373,7 +7373,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -7381,7 +7381,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -7389,7 +7389,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -7397,7 +7397,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 96 @@ -7408,20 +7408,12 @@ 41 - - Notify me - Notify me - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - - + I have an API key I have an API key apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7565,7 +7557,7 @@ Erken Erişim apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 @@ -7933,6 +7925,42 @@ 33 + + Add asset to watchlist + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + + + Get Early Access + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 8b887cfec..6f5611d46 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -653,7 +653,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 77 apps/client/src/app/components/header/header.component.ts @@ -1085,6 +1085,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -1817,6 +1821,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -1861,6 +1869,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1925,6 +1937,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -2155,7 +2171,7 @@ Дійсне до apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -2167,7 +2183,7 @@ з apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -2175,7 +2191,7 @@ щоденних запитів apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -2183,7 +2199,7 @@ Вилучити ключ API apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -2191,7 +2207,7 @@ Встановити ключ API apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 + 83 @@ -2199,7 +2215,7 @@ Платформи apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -2207,7 +2223,7 @@ Теги apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -2223,7 +2239,7 @@ Ви дійсно хочете видалити ключ API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 96 @@ -2234,28 +2250,12 @@ 57 - - Want to stay updated? Click below to get notified as soon as it’s available. - Хочете залишатися в курсі? Натисніть нижче, щоб отримати сповіщення, як тільки це буде доступно. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 - - - - Notify me - Сповістіть мене - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - or або apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -2282,12 +2282,12 @@ 29 - + I have an API key У мене є ключ API apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -4299,11 +4299,11 @@ Активи apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -4319,7 +4319,7 @@ Зведення apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -4331,7 +4331,7 @@ Ринки apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -5211,7 +5211,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6724,14 +6724,6 @@ 197 - - Index - Індекс - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - 50-Day Trend Тренд на 50 днів @@ -6761,7 +6753,7 @@ Зміна від Історичного Максимуму libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -6769,7 +6761,7 @@ від ІМ libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -7565,7 +7557,7 @@ Ранній доступ apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 @@ -7933,6 +7925,42 @@ 33 + + Add asset to watchlist + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + + + Get Early Access + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index aa91e90d0..cc48e4081 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -267,7 +267,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 77 apps/client/src/app/components/header/header.component.ts @@ -969,6 +969,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -1315,6 +1319,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -1358,6 +1366,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1703,6 +1715,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -1909,14 +1925,14 @@ Platforms apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -2321,7 +2337,7 @@ or apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -3442,11 +3458,11 @@ Holdings apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -3461,7 +3477,7 @@ Summary apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -3472,7 +3488,7 @@ Markets apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -4209,7 +4225,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5102,13 +5118,6 @@ 67 - - Index - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - 50-Day Trend @@ -5134,14 +5143,14 @@ Change from All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 from ATH libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -5584,7 +5593,7 @@ Valid until apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -6587,13 +6596,6 @@ 40 - - Want to stay updated? Click below to get notified as soon as it’s available. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 - - Ukraine @@ -6605,7 +6607,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 + 83 @@ -6707,42 +6709,35 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 - - - - Notify me - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 + 52 Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 96 - + I have an API key apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -6868,7 +6863,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 @@ -7172,6 +7167,38 @@ 33 + + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + + + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 6a18716da..c1c7ac5fa 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -273,7 +273,7 @@ apps/client/src/app/components/admin-settings/admin-settings.component.ts - 74 + 77 apps/client/src/app/components/header/header.component.ts @@ -1006,6 +1006,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 + + libs/ui/src/lib/benchmark/benchmark.component.html + 3 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -1374,6 +1378,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 25 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 15 + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 58 @@ -1418,6 +1426,10 @@ apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 32 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 22 + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html 135 @@ -1770,6 +1782,10 @@ apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 29 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 124 @@ -2000,7 +2016,7 @@ 平台 apps/client/src/app/components/admin-settings/admin-settings.component.html - 81 + 107 @@ -2008,7 +2024,7 @@ 标签 apps/client/src/app/components/admin-settings/admin-settings.component.html - 87 + 113 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -2460,7 +2476,7 @@ apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 36 + 32 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -3704,11 +3720,11 @@ 控股 apps/client/src/app/pages/home/home-page-routing.module.ts - 23 + 24 apps/client/src/app/pages/home/home-page-routing.module.ts - 28 + 29 apps/client/src/app/pages/home/home-page.component.ts @@ -3724,7 +3740,7 @@ 概括 apps/client/src/app/pages/home/home-page-routing.module.ts - 33 + 34 apps/client/src/app/pages/home/home-page.component.ts @@ -3736,7 +3752,7 @@ 市场 apps/client/src/app/pages/home/home-page-routing.module.ts - 38 + 39 apps/client/src/app/pages/home/home-page.component.ts @@ -4564,7 +4580,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 137 + 141 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5559,14 +5575,6 @@ 67 - - Index - 指数 - - libs/ui/src/lib/benchmark/benchmark.component.html - 3 - - 50-Day Trend 50 天趋势 @@ -5596,7 +5604,7 @@ 从历史最高点开始变化 libs/ui/src/lib/benchmark/benchmark.component.html - 81 + 83 @@ -5604,7 +5612,7 @@ 来自 ATH libs/ui/src/lib/benchmark/benchmark.component.html - 83 + 85 @@ -6108,7 +6116,7 @@ 有效期至 apps/client/src/app/components/admin-settings/admin-settings.component.html - 28 + 36 libs/ui/src/lib/membership-card/membership-card.component.html @@ -7260,15 +7268,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 70 - - - - Want to stay updated? Click below to get notified as soon as it’s available. - Want to stay updated? Click below to get notified as soon as it’s available. - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 23 + 83 @@ -7374,7 +7374,7 @@ of apps/client/src/app/components/admin-settings/admin-settings.component.html - 42 + 52 @@ -7382,7 +7382,7 @@ daily requests apps/client/src/app/components/admin-settings/admin-settings.component.html - 44 + 54 @@ -7390,7 +7390,7 @@ Remove API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 58 + 71 @@ -7398,7 +7398,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 93 + 96 @@ -7409,20 +7409,12 @@ 41 - - Notify me - Notify me - - apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 32 - - - + I have an API key I have an API key apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html - 43 + 39 @@ -7566,7 +7558,7 @@ Early Access apps/client/src/app/components/admin-settings/admin-settings.component.html - 16 + 29 @@ -7934,6 +7926,42 @@ 33 + + Add asset to watchlist + Add asset to watchlist + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + Watchlist + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + + Watchlist + Watchlist + + apps/client/src/app/pages/home/home-page-routing.module.ts + 44 + + + apps/client/src/app/pages/home/home-page.component.ts + 58 + + + + Get Early Access + Get Early Access + + apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html + 29 + + diff --git a/libs/common/src/lib/interfaces/admin-data.interface.ts b/libs/common/src/lib/interfaces/admin-data.interface.ts index e14429493..dba85d3ef 100644 --- a/libs/common/src/lib/interfaces/admin-data.interface.ts +++ b/libs/common/src/lib/interfaces/admin-data.interface.ts @@ -1,4 +1,7 @@ +import { DataProviderInfo } from './data-provider-info.interface'; + export interface AdminData { + dataProviders: DataProviderInfo[]; settings: { [key: string]: boolean | object | string | string[] }; transactionCount: number; userCount: number; diff --git a/libs/common/src/lib/interfaces/data-provider-info.interface.ts b/libs/common/src/lib/interfaces/data-provider-info.interface.ts index 79d7d6940..9fba0e62d 100644 --- a/libs/common/src/lib/interfaces/data-provider-info.interface.ts +++ b/libs/common/src/lib/interfaces/data-provider-info.interface.ts @@ -1,4 +1,7 @@ +import { DataSource } from '@prisma/client'; + export interface DataProviderInfo { + dataSource?: DataSource; isPremium: boolean; name?: string; url?: string; diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index c93ab2d27..b83b6d5f8 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -57,6 +57,7 @@ import type { PortfolioPerformanceResponse } from './responses/portfolio-perform import type { PortfolioReportResponse } from './responses/portfolio-report.interface'; import type { PublicPortfolioResponse } from './responses/public-portfolio-response.interface'; import type { QuotesResponse } from './responses/quotes-response.interface'; +import type { WatchlistResponse } from './responses/watchlist-response.interface'; import type { ScraperConfiguration } from './scraper-configuration.interface'; import type { Statistics } from './statistics.interface'; import type { SubscriptionOffer } from './subscription-offer.interface'; @@ -135,5 +136,6 @@ export { ToggleOption, User, UserSettings, + WatchlistResponse, XRayRulesSettings }; diff --git a/libs/common/src/lib/interfaces/responses/watchlist-response.interface.ts b/libs/common/src/lib/interfaces/responses/watchlist-response.interface.ts new file mode 100644 index 000000000..3cdc834b4 --- /dev/null +++ b/libs/common/src/lib/interfaces/responses/watchlist-response.interface.ts @@ -0,0 +1,5 @@ +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; + +export interface WatchlistResponse { + watchlist: AssetProfileIdentifier[]; +} diff --git a/libs/ui/src/lib/benchmark/benchmark.component.html b/libs/ui/src/lib/benchmark/benchmark.component.html index 8867e1c9e..14ff7f9f2 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.html +++ b/libs/ui/src/lib/benchmark/benchmark.component.html @@ -1,6 +1,6 @@ - + @@ -66,11 +66,13 @@ @@ -83,18 +85,20 @@ from ATH @@ -109,6 +113,39 @@ + + + + + (); + + public displayedColumns = [ + 'name', + 'date', + 'change', + 'marketCondition', + 'actions' + ]; public isLoading = true; + public isNumber = isNumber; public resolveMarketCondition = resolveMarketCondition; public translate = translate; @@ -56,6 +75,7 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy { public constructor( private dialog: MatDialog, + private notificationService: NotificationService, private route: ActivatedRoute, private router: Router ) { @@ -87,11 +107,22 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy { 'trend200d', 'date', 'change', - 'marketCondition' + 'marketCondition', + 'actions' ]; } } + public onDeleteItem({ dataSource, symbol }: AssetProfileIdentifier) { + this.notificationService.confirm({ + confirmFn: () => { + this.itemDeleted.emit({ dataSource, symbol }); + }, + confirmType: ConfirmationDialogType.Warn, + title: $localize`Do you really want to delete this item?` + }); + } + public onOpenBenchmarkDialog({ dataSource, symbol }: AssetProfileIdentifier) { this.router.navigate([], { queryParams: { dataSource, symbol, benchmarkDetailDialog: true } diff --git a/package-lock.json b/package-lock.json index 4557a6c61..54ce11db7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.156.0", + "version": "2.157.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.156.0", + "version": "2.157.1", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 111232548..42e173d4c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.156.0", + "version": "2.157.1", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio",
IndexName {{ element?.name }}
- + @if (element?.performances?.allTimeHigh?.date) { + + }
- + @if (isNumber(element?.performances?.allTimeHigh?.performancePercent)) { + + } + @if (hasPermissionToDeleteItem) { + + } + + + +