diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index ffee37bee..22a2ca789 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -36,6 +36,9 @@ The Issue tracker is **ONLY** used for reporting bugs. New features should be di +- [ ] Cloud +- [ ] Self-hosted + - Ghostfolio Version X.Y.Z - Browser - OS diff --git a/CHANGELOG.md b/CHANGELOG.md index 40dbecfc9..d0b160b19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,39 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Added a stepper to the activities import dialog +- Added a link to manage the benchmarks to the benchmark comparator +- Added support for localized routes + +## 1.272.0 - 2023-05-26 + +### Added + +- Added support to set an asset profile as a benchmark + +### Changed + +- Decreased the density of the `@angular/material` tables +- Improved the portfolio proportion chart component by supporting case insensitive names +- Improved the breadcrumb navigation style in the blog post pages for mobile +- Improved the error handling in the delete user endpoint +- Improved the style of the _Changelog & License_ button on the about page +- Upgraded `ionicons` from version `6.1.2` to `7.1.0` + +## 1.271.0 - 2023-05-20 + +### Added + +- Added the historical data and search functionality for the `FINANCIAL_MODELING_PREP` data source type +- Added a blog post: _Unlock your Financial Potential with Ghostfolio_ + +### Changed + +- Improved the local number formatting in the value component +- Changed the uptime to the last 90 days on the _Open Startup_ (`/open`) page + +### Fixed + +- Fixed the vertical alignment in the toggle component ## 1.270.1 - 2023-05-19 @@ -253,7 +286,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Changed the slide toggles to checkboxes on the account page - Changed the slide toggles to checkboxes in the admin control panel -- Decreased the density of the theme +- Increased the density of the theme - Migrated the style of various components to `@angular/material` `15` (mdc) - Upgraded `@angular/cdk` and `@angular/material` from version `15.2.5` to `15.2.6` - Upgraded `bull` from version `4.10.2` to `4.10.4` diff --git a/apps/api/src/app/benchmark/benchmark.controller.ts b/apps/api/src/app/benchmark/benchmark.controller.ts index 4daa14009..d59a231ff 100644 --- a/apps/api/src/app/benchmark/benchmark.controller.ts +++ b/apps/api/src/app/benchmark/benchmark.controller.ts @@ -1,24 +1,36 @@ import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request.interceptor'; import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response.interceptor'; -import { +import type { BenchmarkMarketDataDetails, - BenchmarkResponse + BenchmarkResponse, + UniqueAsset } from '@ghostfolio/common/interfaces'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import type { RequestWithUser } from '@ghostfolio/common/types'; import { + Body, Controller, Get, + HttpException, + Inject, Param, + Post, UseGuards, UseInterceptors } from '@nestjs/common'; +import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; import { DataSource } from '@prisma/client'; +import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { BenchmarkService } from './benchmark.service'; @Controller('benchmark') export class BenchmarkController { - public constructor(private readonly benchmarkService: BenchmarkService) {} + public constructor( + private readonly benchmarkService: BenchmarkService, + @Inject(REQUEST) private readonly request: RequestWithUser + ) {} @Get() @UseInterceptors(TransformDataSourceInRequestInterceptor) @@ -45,4 +57,41 @@ export class BenchmarkController { symbol }); } + + @Post() + @UseGuards(AuthGuard('jwt')) + public async addBenchmark(@Body() { dataSource, symbol }: UniqueAsset) { + if ( + !hasPermission( + this.request.user.permissions, + permissions.accessAdminControl + ) + ) { + throw new HttpException( + getReasonPhrase(StatusCodes.FORBIDDEN), + StatusCodes.FORBIDDEN + ); + } + + try { + const benchmark = await this.benchmarkService.addBenchmark({ + dataSource, + symbol + }); + + if (!benchmark) { + throw new HttpException( + getReasonPhrase(StatusCodes.NOT_FOUND), + StatusCodes.NOT_FOUND + ); + } + + return benchmark; + } catch { + throw new HttpException( + getReasonPhrase(StatusCodes.INTERNAL_SERVER_ERROR), + StatusCodes.INTERNAL_SERVER_ERROR + ); + } + } } diff --git a/apps/api/src/app/benchmark/benchmark.module.ts b/apps/api/src/app/benchmark/benchmark.module.ts index 71b08c191..c2cc3fbb5 100644 --- a/apps/api/src/app/benchmark/benchmark.module.ts +++ b/apps/api/src/app/benchmark/benchmark.module.ts @@ -3,6 +3,7 @@ import { SymbolModule } from '@ghostfolio/api/app/symbol/symbol.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; +import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; import { Module } from '@nestjs/common'; @@ -17,6 +18,7 @@ import { BenchmarkService } from './benchmark.service'; ConfigurationModule, DataProviderModule, MarketDataModule, + PrismaModule, PropertyModule, RedisCacheModule, SymbolModule, diff --git a/apps/api/src/app/benchmark/benchmark.service.spec.ts b/apps/api/src/app/benchmark/benchmark.service.spec.ts index 833dbcdfc..5fa2c3e7b 100644 --- a/apps/api/src/app/benchmark/benchmark.service.spec.ts +++ b/apps/api/src/app/benchmark/benchmark.service.spec.ts @@ -4,7 +4,15 @@ describe('BenchmarkService', () => { let benchmarkService: BenchmarkService; beforeAll(async () => { - benchmarkService = new BenchmarkService(null, null, null, null, null, null); + benchmarkService = new BenchmarkService( + null, + null, + null, + null, + null, + null, + null + ); }); it('calculateChangeInPercentage', async () => { diff --git a/apps/api/src/app/benchmark/benchmark.service.ts b/apps/api/src/app/benchmark/benchmark.service.ts index 4e87b26f9..73b48068b 100644 --- a/apps/api/src/app/benchmark/benchmark.service.ts +++ b/apps/api/src/app/benchmark/benchmark.service.ts @@ -2,6 +2,7 @@ import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.s import { SymbolService } from '@ghostfolio/api/app/symbol/symbol.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; +import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { @@ -11,6 +12,7 @@ import { import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { BenchmarkMarketDataDetails, + BenchmarkProperty, BenchmarkResponse, UniqueAsset } from '@ghostfolio/common/interfaces'; @@ -18,6 +20,7 @@ import { Injectable } from '@nestjs/common'; import { SymbolProfile } from '@prisma/client'; import Big from 'big.js'; import { format } from 'date-fns'; +import { uniqBy } from 'lodash'; import ms from 'ms'; @Injectable() @@ -27,6 +30,7 @@ export class BenchmarkService { public constructor( private readonly dataProviderService: DataProviderService, private readonly marketDataService: MarketDataService, + private readonly prismaService: PrismaService, private readonly propertyService: PropertyService, private readonly redisCacheService: RedisCacheService, private readonly symbolProfileService: SymbolProfileService, @@ -116,9 +120,9 @@ export class BenchmarkService { public async getBenchmarkAssetProfiles(): Promise[]> { const symbolProfileIds: string[] = ( - ((await this.propertyService.getByKey(PROPERTY_BENCHMARKS)) as { - symbolProfileId: string; - }[]) ?? [] + ((await this.propertyService.getByKey( + PROPERTY_BENCHMARKS + )) as BenchmarkProperty[]) ?? [] ).map(({ symbolProfileId }) => { return symbolProfileId; }); @@ -204,6 +208,43 @@ export class BenchmarkService { return response; } + public async addBenchmark({ + dataSource, + symbol + }: UniqueAsset): Promise> { + const assetProfile = await this.prismaService.symbolProfile.findFirst({ + where: { + dataSource, + symbol + } + }); + + if (!assetProfile) { + return; + } + + let benchmarks = + ((await this.propertyService.getByKey( + PROPERTY_BENCHMARKS + )) as BenchmarkProperty[]) ?? []; + + benchmarks.push({ symbolProfileId: assetProfile.id }); + + benchmarks = uniqBy(benchmarks, 'symbolProfileId'); + + await this.propertyService.put({ + key: PROPERTY_BENCHMARKS, + value: JSON.stringify(benchmarks) + }); + + return { + dataSource, + symbol, + id: assetProfile.id, + name: assetProfile.name + }; + } + private getMarketCondition(aPerformanceInPercent: number) { return aPerformanceInPercent <= -0.2 ? 'BEAR_MARKET' : 'NEUTRAL_MARKET'; } diff --git a/apps/api/src/app/frontend.middleware.ts b/apps/api/src/app/frontend.middleware.ts index 58e39a5ea..b028f7996 100644 --- a/apps/api/src/app/frontend.middleware.ts +++ b/apps/api/src/app/frontend.middleware.ts @@ -94,6 +94,13 @@ export class FrontendMiddleware implements NestMiddleware { ) { featureGraphicPath = 'assets/images/blog/1000-stars-on-github.jpg'; title = `Ghostfolio reaches 1’000 Stars on GitHub - ${title}`; + } else if ( + request.path.startsWith( + '/en/blog/2023/05/unlock-your-financial-potential-with-ghostfolio' + ) + ) { + featureGraphicPath = 'assets/images/blog/20230520.jpg'; + title = `Unlock your Financial Potential with Ghostfolio - ${title}`; } if ( diff --git a/apps/api/src/app/info/info.service.ts b/apps/api/src/app/info/info.service.ts index 4da329667..187135a35 100644 --- a/apps/api/src/app/info/info.service.ts +++ b/apps/api/src/app/info/info.service.ts @@ -17,19 +17,22 @@ import { ghostfolioFearAndGreedIndexDataSource } from '@ghostfolio/common/config'; import { + DATE_FORMAT, encodeDataSource, extractNumberFromString } from '@ghostfolio/common/helper'; -import { InfoItem } from '@ghostfolio/common/interfaces'; -import { Statistics } from '@ghostfolio/common/interfaces/statistics.interface'; -import { Subscription } from '@ghostfolio/common/interfaces/subscription.interface'; +import { + InfoItem, + Statistics, + Subscription +} from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; import { SubscriptionOffer } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; import * as bent from 'bent'; import * as cheerio from 'cheerio'; -import { subDays } from 'date-fns'; +import { format, subDays } from 'date-fns'; @Injectable() export class InfoService { @@ -344,7 +347,10 @@ export class InfoService { )) as string; const get = bent( - `https://betteruptime.com/api/v2/monitors/${monitorId}/sla`, + `https://betteruptime.com/api/v2/monitors/${monitorId}/sla?from=${format( + subDays(new Date(), 90), + DATE_FORMAT + )}&to${format(new Date(), DATE_FORMAT)}`, 'GET', 'json', 200, diff --git a/apps/api/src/app/subscription/subscription.service.ts b/apps/api/src/app/subscription/subscription.service.ts index 591721f84..37b49ee34 100644 --- a/apps/api/src/app/subscription/subscription.service.ts +++ b/apps/api/src/app/subscription/subscription.service.ts @@ -4,7 +4,7 @@ import { DEFAULT_LANGUAGE_CODE, PROPERTY_STRIPE_CONFIG } from '@ghostfolio/common/config'; -import { Subscription as SubscriptionInterface } from '@ghostfolio/common/interfaces/subscription.interface'; +import { Subscription as SubscriptionInterface } from '@ghostfolio/common/interfaces'; import { UserWithSettings } from '@ghostfolio/common/types'; import { SubscriptionType } from '@ghostfolio/common/types/subscription-type.type'; import { Injectable, Logger } from '@nestjs/common'; diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index 56807e10a..26736e88d 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -304,21 +304,29 @@ export class UserService { } public async deleteUser(where: Prisma.UserWhereUniqueInput): Promise { - await this.prismaService.access.deleteMany({ - where: { OR: [{ granteeUserId: where.id }, { userId: where.id }] } - }); + try { + await this.prismaService.access.deleteMany({ + where: { OR: [{ granteeUserId: where.id }, { userId: where.id }] } + }); + } catch {} - await this.prismaService.account.deleteMany({ - where: { userId: where.id } - }); + try { + await this.prismaService.account.deleteMany({ + where: { userId: where.id } + }); + } catch {} - await this.prismaService.analytics.delete({ - where: { userId: where.id } - }); + try { + await this.prismaService.analytics.delete({ + where: { userId: where.id } + }); + } catch {} - await this.prismaService.order.deleteMany({ - where: { userId: where.id } - }); + try { + await this.prismaService.order.deleteMany({ + where: { userId: where.id } + }); + } catch {} try { await this.prismaService.settings.delete({ 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 387c71be2..c05fc3e4f 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -11,8 +11,7 @@ import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { PROPERTY_DATA_SOURCE_MAPPING } from '@ghostfolio/common/config'; import { DATE_FORMAT, getStartOfUtcDate } from '@ghostfolio/common/helper'; -import { UserWithSettings } from '@ghostfolio/common/types'; -import { Granularity } from '@ghostfolio/common/types'; +import type { Granularity, UserWithSettings } from '@ghostfolio/common/types'; import { Inject, Injectable, Logger } from '@nestjs/common'; import { DataSource, MarketData, SymbolProfile } from '@prisma/client'; import { format, isValid } from 'date-fns'; 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 d4fe3325b..bcee3c5e7 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 @@ -5,11 +5,13 @@ import { IDataProviderHistoricalResponse, IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; +import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper'; import { DataProviderInfo } from '@ghostfolio/common/interfaces'; import { Granularity } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; import { DataSource, SymbolProfile } from '@prisma/client'; import bent from 'bent'; +import { format, isAfter, isBefore, isSameDay } from 'date-fns'; @Injectable() export class FinancialModelingPrepService implements DataProviderInterface { @@ -61,9 +63,42 @@ export class FinancialModelingPrepService implements DataProviderInterface { ): Promise<{ [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; }> { - return { - [aSymbol]: {} - }; + try { + const get = bent( + `${this.URL}/historical-price-full/${aSymbol}?apikey=${this.apiKey}`, + 'GET', + 'json', + 200 + ); + const { historical } = await get(); + + const result: { + [symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; + } = { + [aSymbol]: {} + }; + + for (const { close, date } of historical) { + if ( + (isSameDay(parseDate(date), from) || + isAfter(parseDate(date), from)) && + isBefore(parseDate(date), to) + ) { + result[aSymbol][date] = { + marketPrice: close + }; + } + } + + return result; + } catch (error) { + throw new Error( + `Could not get historical market data for ${aSymbol} (${this.getName()}) from ${format( + from, + DATE_FORMAT + )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}` + ); + } } public getName(): DataSource { @@ -109,7 +144,32 @@ export class FinancialModelingPrepService implements DataProviderInterface { } public async search(aQuery: string): Promise<{ items: LookupItem[] }> { - return { items: [] }; + let items: LookupItem[] = []; + + try { + const get = bent( + `${this.URL}/search?query=${aQuery}&apikey=${this.apiKey}`, + 'GET', + 'json', + 200 + ); + const result = await get(); + + items = result.map(({ currency, name, symbol }) => { + return { + // TODO: Add assetClass + // TODO: Add assetSubClass + currency, + name, + symbol, + dataSource: this.getName() + }; + }); + } catch (error) { + Logger.error(error, 'FinancialModelingPrepService'); + } + + return { items }; } private getDataProviderInfo(): DataProviderInfo { 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 b0d94baf6..e47713680 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 @@ -138,8 +138,7 @@ export class YahooFinanceService implements DataProviderInterface { marketPrice: this.getConvertedValue({ symbol: aSymbol, value: historicalItem.close - }), - performance: historicalItem.open - historicalItem.close + }) }; } diff --git a/apps/api/src/services/interfaces/interfaces.ts b/apps/api/src/services/interfaces/interfaces.ts index 58f25243c..15505db63 100644 --- a/apps/api/src/services/interfaces/interfaces.ts +++ b/apps/api/src/services/interfaces/interfaces.ts @@ -23,7 +23,6 @@ export interface IOrder { export interface IDataProviderHistoricalResponse { marketPrice: number; - performance?: number; } export interface IDataProviderResponse { diff --git a/apps/client/src/app/app-routing.module.ts b/apps/client/src/app/app-routing.module.ts index 0f6acd870..e824862f7 100644 --- a/apps/client/src/app/app-routing.module.ts +++ b/apps/client/src/app/app-routing.module.ts @@ -5,25 +5,27 @@ import { PageTitleStrategy } from '@ghostfolio/client/services/page-title.strate import { ModulePreloadService } from './core/module-preload.service'; const routes: Routes = [ - { - path: 'about', + ...['about', 'ueber-uns'].map((path) => ({ + path, loadChildren: () => import('./pages/about/about-page.module').then((m) => m.AboutPageModule) - }, - { - path: 'about/changelog', + })), + ...['about/changelog', 'ueber-uns/changelog'].map((path) => ({ + path, loadChildren: () => import('./pages/about/changelog/changelog-page.module').then( (m) => m.ChangelogPageModule ) - }, - { - path: 'about/privacy-policy', - loadChildren: () => - import('./pages/about/privacy-policy/privacy-policy-page.module').then( - (m) => m.PrivacyPolicyPageModule - ) - }, + })), + ...['about/privacy-policy', 'ueber-uns/datenschutzbestimmungen'].map( + (path) => ({ + path, + loadChildren: () => + import('./pages/about/privacy-policy/privacy-policy-page.module').then( + (m) => m.PrivacyPolicyPageModule + ) + }) + ), { path: 'account', loadChildren: () => @@ -48,11 +50,11 @@ const routes: Routes = [ loadChildren: () => import('./pages/auth/auth-page.module').then((m) => m.AuthPageModule) }, - { - path: 'blog', + ...['blog'].map((path) => ({ + path, loadChildren: () => import('./pages/blog/blog-page.module').then((m) => m.BlogPageModule) - }, + })), { path: 'blog/2021/07/hallo-ghostfolio', loadChildren: () => @@ -137,35 +139,42 @@ const routes: Routes = [ './pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.module' ).then((m) => m.ThousandStarsOnGitHubPageModule) }, + { + path: 'blog/2023/05/unlock-your-financial-potential-with-ghostfolio', + loadChildren: () => + import( + './pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.module' + ).then((m) => m.UnlockYourFinancialPotentialWithGhostfolioPageModule) + }, { path: 'demo', loadChildren: () => import('./pages/demo/demo-page.module').then((m) => m.DemoPageModule) }, - { - path: 'faq', + ...['faq', 'haeufig-gestellte-fragen'].map((path) => ({ + path, loadChildren: () => import('./pages/faq/faq-page.module').then((m) => m.FaqPageModule) - }, - { - path: 'features', + })), + ...['features'].map((path) => ({ + path, loadChildren: () => import('./pages/features/features-page.module').then( (m) => m.FeaturesPageModule ) - }, + })), { path: 'home', loadChildren: () => import('./pages/home/home-page.module').then((m) => m.HomePageModule) }, - { - path: 'markets', + ...['markets', 'maerkte'].map((path) => ({ + path, loadChildren: () => import('./pages/markets/markets-page.module').then( (m) => m.MarketsPageModule ) - }, + })), { path: 'open', loadChildren: () => @@ -185,27 +194,27 @@ const routes: Routes = [ (m) => m.PortfolioPageModule ) }, - { - path: 'pricing', + ...['pricing', 'preise'].map((path) => ({ + path, loadChildren: () => import('./pages/pricing/pricing-page.module').then( (m) => m.PricingPageModule ) - }, - { - path: 'register', + })), + ...['register', 'registrierung'].map((path) => ({ + path, loadChildren: () => import('./pages/register/register-page.module').then( (m) => m.RegisterPageModule ) - }, - { - path: 'resources', + })), + ...['resources', 'ressourcen'].map((path) => ({ + path, loadChildren: () => import('./pages/resources/resources-page.module').then( (m) => m.ResourcesPageModule ) - }, + })), { path: 'start', loadChildren: () => diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.html b/apps/client/src/app/components/admin-market-data/admin-market-data.html index 36beae6dd..bb9322a68 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.html +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -143,18 +143,6 @@ - - + diff --git a/apps/client/src/app/components/admin-overview/admin-overview.html b/apps/client/src/app/components/admin-overview/admin-overview.html index 80a285ffd..0f4127e51 100644 --- a/apps/client/src/app/components/admin-overview/admin-overview.html +++ b/apps/client/src/app/components/admin-overview/admin-overview.html @@ -72,19 +72,6 @@ -
-
Benchmarks
-
- - - - -
{{ benchmark.symbol }}
-
-
Compare with... {{ symbolProfile.name }} + Manage Benchmarks
diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts index 9e6cc9be3..9a6bd1d30 100644 --- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts +++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -23,6 +23,7 @@ import { parseDate } from '@ghostfolio/common/helper'; import { LineChartItem, User } from '@ghostfolio/common/interfaces'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { ColorScheme } from '@ghostfolio/common/types'; import { SymbolProfile } from '@prisma/client'; import { @@ -59,6 +60,7 @@ export class BenchmarkComparatorComponent implements OnChanges, OnDestroy { @ViewChild('chartCanvas') chartCanvas; public chart: Chart<'line'>; + public hasPermissionToAccessAdminControl: boolean; public constructor() { Chart.register( @@ -76,6 +78,11 @@ export class BenchmarkComparatorComponent implements OnChanges, OnDestroy { } public ngOnChanges() { + this.hasPermissionToAccessAdminControl = hasPermission( + this.user?.permissions, + permissions.accessAdminControl + ); + if (this.performanceDataItems) { this.initialize(); } diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.module.ts b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.module.ts index 23b0a48a1..5280404dd 100644 --- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.module.ts +++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.module.ts @@ -2,6 +2,7 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatSelectModule } from '@angular/material/select'; +import { RouterModule } from '@angular/router'; import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; @@ -16,7 +17,8 @@ import { BenchmarkComparatorComponent } from './benchmark-comparator.component'; GfPremiumIndicatorModule, MatSelectModule, NgxSkeletonLoaderModule, - ReactiveFormsModule + ReactiveFormsModule, + RouterModule ] }) export class GfBenchmarkComparatorModule {} diff --git a/apps/client/src/app/components/toggle/toggle.component.html b/apps/client/src/app/components/toggle/toggle.component.html index 582aa433e..fd923fdf5 100644 --- a/apps/client/src/app/components/toggle/toggle.component.html +++ b/apps/client/src/app/components/toggle/toggle.component.html @@ -1,10 +1,11 @@ Ghostfolio is a lightweight wealth management application for individuals to keep track of stocks, ETFs or cryptocurrencies and make - solid, data-driven investment decisions. We share aggregated - open source software + (OSS) under the + AGPL-3.0 license + and we share aggregated + key metrics - of our platform’s performance and the source code is fully available - as open source software (OSS). The project has been initiated by + of the platform’s performance. The project has been initiated by Thomas Kaul @@ -130,6 +144,7 @@ Active Users @@ -138,6 +153,7 @@ New Users @@ -146,6 +162,7 @@ Active Users @@ -154,6 +171,7 @@ Users in Slack community @@ -166,6 +184,7 @@ > Contributors on GitHub @@ -178,6 +197,7 @@ > Stars on GitHub @@ -201,7 +221,7 @@
Blog - diff --git a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html index 891d91631..e10e75b79 100644 --- a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html +++ b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html @@ -182,7 +182,10 @@ - diff --git a/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.html b/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.html index 902aee546..d7b498a11 100644 --- a/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.html +++ b/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.html @@ -179,7 +179,10 @@ - diff --git a/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.html b/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.html index 54ede8fef..b78010dd4 100644 --- a/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.html +++ b/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.html @@ -182,7 +182,10 @@ - diff --git a/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.html b/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.html index 72dec1fad..a9c0085fe 100644 --- a/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.html +++ b/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.html @@ -208,7 +208,10 @@ - diff --git a/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.html b/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.html index 474ec4a04..21098139a 100644 --- a/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.html +++ b/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.html @@ -191,7 +191,10 @@ - diff --git a/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.html b/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.html index 788cc8115..46792b5b3 100644 --- a/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.html +++ b/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.html @@ -177,7 +177,10 @@ - diff --git a/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.html b/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.html index 53726b54c..50476e70e 100644 --- a/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.html +++ b/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.html @@ -137,7 +137,10 @@ - diff --git a/apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.html b/apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.html index bbaa3d4c4..ed87c7913 100644 --- a/apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.html +++ b/apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.html @@ -167,7 +167,10 @@ - diff --git a/apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.html b/apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.html index 4145657fe..4da21fafa 100644 --- a/apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.html +++ b/apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.html @@ -177,7 +177,10 @@ - diff --git a/apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.html b/apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.html index 0191d777e..13eff6898 100644 --- a/apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.html +++ b/apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.html @@ -199,7 +199,10 @@ - diff --git a/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.html b/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.html index ce0dbe16e..9e1ae8a74 100644 --- a/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.html +++ b/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.html @@ -244,7 +244,10 @@ - diff --git a/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page-routing.module.ts b/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page-routing.module.ts new file mode 100644 index 000000000..355e8b714 --- /dev/null +++ b/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page-routing.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; + +import { UnlockYourFinancialPotentialWithGhostfolioPageComponent } from './unlock-your-financial-potential-with-ghostfolio-page.component'; + +const routes: Routes = [ + { + canActivate: [AuthGuard], + component: UnlockYourFinancialPotentialWithGhostfolioPageComponent, + path: '', + title: 'Unlock your Financial Potential with Ghostfolio' + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class UnlockYourFinancialPotentialWithGhostfolioRoutingModule {} diff --git a/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts b/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts new file mode 100644 index 000000000..313642587 --- /dev/null +++ b/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + host: { class: 'page' }, + selector: 'gf-unlock-your-financial-potential-with-ghostfolio-page', + styleUrls: ['./unlock-your-financial-potential-with-ghostfolio-page.scss'], + templateUrl: './unlock-your-financial-potential-with-ghostfolio-page.html' +}) +export class UnlockYourFinancialPotentialWithGhostfolioPageComponent {} diff --git a/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.html b/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.html new file mode 100644 index 000000000..d6226dafe --- /dev/null +++ b/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.html @@ -0,0 +1,244 @@ +
+
+
+
+
+

Unlock your Financial Potential with Ghostfolio

+
2023-05-20
+ Unlock your financial potential with Ghostfolio Teaser +
+
+

+ Managing personal finances effectively is crucial for those striving + for a secure future and financial independence. In today’s digital + age, having a reliable wealth management software can greatly + simplify the process. Ghostfolio is a powerful + open source solution + for individuals trading stocks, ETFs, or cryptocurrencies on + multiple platforms. This article explores the key reasons why + Ghostfolio is the ideal choice for those embracing diversification, + pursuing a buy & hold strategy, and seeking portfolio insights while + valuing privacy. +

+
+
+

Effortless Management for Multi-Platform Investors

+

+ Ghostfolio offers a holistic solution to efficiently monitor and + manage investment portfolios across multiple platforms. By + consolidating data from various accounts, Ghostfolio eliminates the + need to switch between platforms, saving users valuable time and + effort. +

+
+
+

Empowering Buy & Hold Strategies

+

+ For those committed to a + buy & hold strategy, Ghostfolio + provides an intuitive interface to monitor long-term investments. + Users can track performance over time, gaining insights into + portfolio growth and stability. With strong visualizations and + reporting features, Ghostfolio + equips users to make well-informed decisions aligned with their + long-term investment goals. +

+
+
+

Deep Portfolio Insights

+

+ Understanding portfolio composition is vital for making informed + financial decisions. Ghostfolio provides comprehensive insights into + asset allocation, sector exposure, geographical diversification, and + individual asset performance. These detailed analytics empower users + to assess portfolio strengths and weaknesses, making necessary + adjustments to optimize their allocation. +

+
+
+

Privacy and Data Ownership

+

+ In the age of growing data security concerns, Ghostfolio sets itself + apart by giving the highest priority to privacy and data ownership. + As an open-source software, Ghostfolio ensures that users retain + complete control over their financial data. By eliminating the need + to trust third-party platforms with sensitive information, + Ghostfolio offers peace of mind to those who value privacy and data + security. +

+
+
+

Streamlined Minimalism for Financial Efficiency

+

+ Ghostfolio embraces a lightweight approach to personal finance + management, focusing on essential features without overwhelming + users. Its streamlined user interface and clean design provide a + seamless and clutter-free experience. This minimalist approach + enhances user satisfaction and boosts efficiency by eliminating + distractions and simplifying the financial management process. +

+
+
+

Driving Financial Independence (FIRE)

+

+ Achieving + financial independence + including early retirement (FIRE) requires careful planning, + monitoring, and forecasting. Ghostfolio’s robust features equip + individuals with tools to analyze, optimize and simulate investment + strategies. By providing insights, performance tracking, and + portfolio analysis, Ghostfolio serves as a valuable companion in the + pursuit of financial freedom. +

+
+
+

Farewell to Spreadsheet Hassles

+

+ While spreadsheets have traditionally been used to manage personal + finances, they can be time-consuming and prone to errors. Ghostfolio + offers a user-friendly alternative by automating data aggregation, + analysis, and reporting. Users can bid farewell to manual data entry + and complex formulas, relying instead on Ghostfolio’s user-friendly + and intuitive interface to efficiently manage their finances. +

+
+
+

Your Path to Financial Success with Ghostfolio

+

+ Ghostfolio, the open-source personal finance software, provides a + wide range of benefits for individuals involved in trading stocks, + ETFs, or cryptocurrencies. Whether you are pursuing a buy & hold + strategy, seeking valuable portfolio insights, or diversifying + financial resources while prioritizing privacy and data ownership, + Ghostfolio proves to be an invaluable tool on your journey towards + unlocking your financial potential. Say goodbye to spreadsheets and + embrace the power of Ghostfolio for simplified, secure, and + successful financial management. +

+
+
+

+ Would you like to unlock your + financial potential? +

+

+ Ghostfolio empowers you to manage your personal finances + effectively. +

+ +
+
+
    +
  • + App +
  • +
  • + Analysis +
  • +
  • + Assets +
  • +
  • + Budgeting +
  • +
  • + Buy & Hold +
  • +
  • + Cryptocurrencies +
  • +
  • + Diversification +
  • +
  • + ETFs +
  • +
  • + Finance +
  • +
  • + Fintech +
  • +
  • + FIRE +
  • +
  • + Ghostfolio +
  • +
  • + Investment +
  • +
  • + Management +
  • +
  • + Minimalism +
  • +
  • + Monitoring +
  • +
  • + Open Source +
  • +
  • + Personal Finance +
  • +
  • + Planning +
  • +
  • + Portfolio Tracker +
  • +
  • + Privacy +
  • +
  • + Retirement +
  • +
  • + Software +
  • +
  • + Spreadsheet +
  • +
  • + Stock +
  • +
  • + Strategy +
  • +
  • + Wealth +
  • +
+
+ +
+
+
+
diff --git a/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.module.ts b/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.module.ts new file mode 100644 index 000000000..7aeb7f1a2 --- /dev/null +++ b/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.module.ts @@ -0,0 +1,19 @@ +import { CommonModule } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { UnlockYourFinancialPotentialWithGhostfolioRoutingModule } from './unlock-your-financial-potential-with-ghostfolio-page-routing.module'; +import { UnlockYourFinancialPotentialWithGhostfolioPageComponent } from './unlock-your-financial-potential-with-ghostfolio-page.component'; + +@NgModule({ + declarations: [UnlockYourFinancialPotentialWithGhostfolioPageComponent], + imports: [ + CommonModule, + MatButtonModule, + RouterModule, + UnlockYourFinancialPotentialWithGhostfolioRoutingModule + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class UnlockYourFinancialPotentialWithGhostfolioPageModule {} diff --git a/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.scss b/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.scss new file mode 100644 index 000000000..5d4e87f30 --- /dev/null +++ b/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.scss @@ -0,0 +1,3 @@ +:host { + display: block; +} diff --git a/apps/client/src/app/pages/blog/blog-page.html b/apps/client/src/app/pages/blog/blog-page.html index e0808556e..dd663fe05 100644 --- a/apps/client/src/app/pages/blog/blog-page.html +++ b/apps/client/src/app/pages/blog/blog-page.html @@ -2,6 +2,32 @@

Blog

+ + + + +
diff --git a/apps/client/src/app/pages/landing/landing-page.component.ts b/apps/client/src/app/pages/landing/landing-page.component.ts index 201105d46..453534299 100644 --- a/apps/client/src/app/pages/landing/landing-page.component.ts +++ b/apps/client/src/app/pages/landing/landing-page.component.ts @@ -1,6 +1,6 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import { DataService } from '@ghostfolio/client/services/data.service'; -import { Statistics } from '@ghostfolio/common/interfaces/statistics.interface'; +import { Statistics } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { format } from 'date-fns'; import { DeviceDetectorService } from 'ngx-device-detector'; diff --git a/apps/client/src/app/pages/open/open-page.component.ts b/apps/client/src/app/pages/open/open-page.component.ts index 554ab3bef..cf438a816 100644 --- a/apps/client/src/app/pages/open/open-page.component.ts +++ b/apps/client/src/app/pages/open/open-page.component.ts @@ -1,7 +1,8 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; +import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DataService } from '@ghostfolio/client/services/data.service'; -import { Statistics } from '@ghostfolio/common/interfaces/statistics.interface'; -import { Subject } from 'rxjs'; +import { UserService } from '@ghostfolio/client/services/user/user.service'; +import { Statistics, User } from '@ghostfolio/common/interfaces'; +import { Subject, takeUntil } from 'rxjs'; @Component({ host: { class: 'page' }, @@ -11,16 +12,31 @@ import { Subject } from 'rxjs'; }) export class OpenPageComponent implements OnDestroy, OnInit { public statistics: Statistics; + public user: User; private unsubscribeSubject = new Subject(); - public constructor(private dataService: DataService) { + public constructor( + private changeDetectorRef: ChangeDetectorRef, + private dataService: DataService, + private userService: UserService + ) { const { statistics } = this.dataService.fetchInfo(); this.statistics = statistics; } - public ngOnInit() {} + public ngOnInit() { + this.userService.stateChanged + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((state) => { + if (state?.user) { + this.user = state.user; + + this.changeDetectorRef.markForCheck(); + } + }); + } public ngOnDestroy() { this.unsubscribeSubject.next(); diff --git a/apps/client/src/app/pages/open/open-page.html b/apps/client/src/app/pages/open/open-page.html index 2de588429..62503e387 100644 --- a/apps/client/src/app/pages/open/open-page.html +++ b/apps/client/src/app/pages/open/open-page.html @@ -4,15 +4,21 @@

Open Startup

- At Ghostfolio, transparency is at the core of our values. We openly - share aggregated key metrics of our platform’s performance and publish + At Ghostfolio, transparency is at the core of our values. We publish the source code as open source software - (OSS). + (OSS) under the + AGPL-3.0 license + and we openly share aggregated key metrics of the platform’s + performance.

@@ -27,6 +33,7 @@ Active Users @@ -35,6 +42,7 @@ New Users @@ -43,6 +51,7 @@ Active Users @@ -51,6 +60,7 @@ Users in Slack community @@ -63,6 +73,7 @@ > Contributors on GitHub @@ -75,6 +86,7 @@ > Stars on GitHub @@ -87,6 +99,7 @@ > Pulls on Docker Hub @@ -96,7 +109,9 @@ Uptime(`/api/v1/account`, aAccount); } + public postBenchmark(benchmark: UniqueAsset) { + return this.http.post(`/api/v1/benchmark`, benchmark); + } + public postOrder(aOrder: CreateOrderDto) { return this.http.post(`/api/v1/order`, aOrder); } diff --git a/apps/client/src/assets/images/blog/20230520.jpg b/apps/client/src/assets/images/blog/20230520.jpg new file mode 100644 index 000000000..dd170944e Binary files /dev/null and b/apps/client/src/assets/images/blog/20230520.jpg differ diff --git a/apps/client/src/assets/robots.txt b/apps/client/src/assets/robots.txt index 059aea258..3b0250e72 100644 --- a/apps/client/src/assets/robots.txt +++ b/apps/client/src/assets/robots.txt @@ -1,6 +1,19 @@ User-agent: * Allow: / +Disallow: /de/about/* +Disallow: /de/faq +Disallow: /de/markets +Disallow: /de/portfolio/* +Disallow: /de/pricing +Disallow: /de/register +Disallow: /de/resources +Disallow: /de/ueber-uns/datenschutzbestimmungen Disallow: /en/about/privacy-policy Disallow: /en/p/* +Disallow: /en/portfolio/* +Disallow: /portfolio/* +Disallow: /pricing/* +Disallow: /register/* +Disallow: /resources/* Sitemap: https://ghostfol.io/sitemap.xml diff --git a/apps/client/src/assets/sitemap.xml b/apps/client/src/assets/sitemap.xml index 56e7872c7..98d5bf777 100644 --- a/apps/client/src/assets/sitemap.xml +++ b/apps/client/src/assets/sitemap.xml @@ -6,106 +6,142 @@ http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> https://ghostfol.io - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/de/blog - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/de/blog/2021/07/hallo-ghostfolio - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/de/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 - - https://ghostfol.io/de/pricing - 2023-05-15T00:00:00+00:00 + + https://ghostfol.io/de/features + 2023-05-27T00:00:00+00:00 + + + https://ghostfol.io/de/haeufig-gestellte-fragen + 2023-05-27T00:00:00+00:00 + + + https://ghostfol.io/de/maerkte + 2023-05-27T00:00:00+00:00 + + + https://ghostfol.io/de/open + 2023-05-27T00:00:00+00:00 + + + https://ghostfol.io/de/preise + 2023-05-27T00:00:00+00:00 + + + https://ghostfol.io/de/registrierung + 2023-05-27T00:00:00+00:00 + + + https://ghostfol.io/de/ressourcen + 2023-05-27T00:00:00+00:00 + + + https://ghostfol.io/de/ueber-uns + 2023-05-27T00:00:00+00:00 + + + https://ghostfol.io/de/ueber-uns/changelog + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/about - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/about/changelog - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/blog - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/blog/2021/07/hello-ghostfolio - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/blog/2022/01/ghostfolio-first-months-in-open-source - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/blog/2022/07/ghostfolio-meets-internet-identity - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/blog/2022/07/how-do-i-get-my-finances-in-order - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/blog/2022/08/500-stars-on-github - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/blog/2022/10/hacktoberfest-2022 - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/blog/2022/11/black-friday-2022 - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/blog/2022/12/the-importance-of-tracking-your-personal-finances - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/blog/2023/02/ghostfolio-meets-umbrel - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/blog/2023/03/ghostfolio-reaches-1000-stars-on-github - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 + + + https://ghostfol.io/en/blog/2023/05/unlock-your-financial-potential-with-ghostfolio + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/demo - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/faq - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/features - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/markets - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/open - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/pricing - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/register - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 https://ghostfol.io/en/resources - 2023-05-15T00:00:00+00:00 + 2023-05-27T00:00:00+00:00 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 836bca3ae..bb12bf743 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -94,7 +94,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 81 + 88 apps/client/src/app/components/admin-users/admin-users.html @@ -210,7 +210,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 163 + 151 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -250,7 +250,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 57 + 64 @@ -386,7 +386,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 180 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -422,7 +422,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 180 + 187 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -450,7 +450,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 72 + 79 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -552,10 +552,6 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html 132 - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 156 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 38 @@ -582,7 +578,7 @@ Systemmeldung apps/client/src/app/components/admin-overview/admin-overview.html - 122 + 109 @@ -590,7 +586,7 @@ Systemmeldung setzen apps/client/src/app/components/admin-overview/admin-overview.html - 144 + 131 @@ -598,7 +594,7 @@ Lese-Modus apps/client/src/app/components/admin-overview/admin-overview.html - 112 + 99 @@ -606,7 +602,7 @@ Gutscheincodes apps/client/src/app/components/admin-overview/admin-overview.html - 152 + 139 @@ -614,7 +610,7 @@ Hinzufügen apps/client/src/app/components/admin-overview/admin-overview.html - 194 + 181 @@ -622,7 +618,7 @@ Verwaltung apps/client/src/app/components/admin-overview/admin-overview.html - 201 + 188 @@ -630,7 +626,7 @@ Cache leeren apps/client/src/app/components/admin-overview/admin-overview.html - 205 + 192 @@ -1134,7 +1130,7 @@ Sektoren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 125 + 132 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1150,7 +1146,7 @@ Länder apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 135 + 142 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1162,7 +1158,7 @@ Tags apps/client/src/app/components/admin-overview/admin-overview.html - 92 + 79 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1356,6 +1352,10 @@ apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.html 245 + + apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.html + 231 + apps/client/src/app/pages/blog/blog-page.html 4 @@ -1626,7 +1626,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 62 + 69 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2042,7 +2042,7 @@ Kommentar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 160 + 167 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -2058,7 +2058,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 86 + 93 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2110,7 +2110,7 @@ Portfolio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 102 + 109 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2430,7 +2430,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 95 + 102 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2446,7 +2446,7 @@ Sektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 110 + 117 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2458,7 +2458,7 @@ Land apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 119 + 126 apps/client/src/app/components/admin-users/admin-users.html @@ -2653,20 +2653,12 @@ 253 - - Benchmarks - Benchmarks - - apps/client/src/app/components/admin-overview/admin-overview.html - 79 - - Compare with... Vergleichen mit... apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html - 18 + 17 @@ -2674,7 +2666,7 @@ Benchmark apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 111 + 118 @@ -2918,7 +2910,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 369 + 373 @@ -2926,11 +2918,11 @@ Keine Daten verfügbar libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 371 + 375 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 384 + 388 @@ -3046,7 +3038,7 @@ Symbol Zuordnung apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 149 + 156 @@ -3078,7 +3070,7 @@ Benutzer Registrierung apps/client/src/app/components/admin-overview/admin-overview.html - 102 + 89 @@ -3608,10 +3600,6 @@ Gather Historical Data Historische Daten herunterladen - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 150 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 30 @@ -3813,6 +3801,22 @@ 14 + + Set as Benchmark + Als Benchmark setzen + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 45 + + + + Manage Benchmarks + Benchmarks verwalten + + apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html + 34 + + diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 4f602cfb5..7f9533d77 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -95,7 +95,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 81 + 88 apps/client/src/app/components/admin-users/admin-users.html @@ -211,7 +211,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 163 + 151 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -251,7 +251,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 57 + 64 @@ -387,7 +387,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 180 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -423,7 +423,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 180 + 187 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -451,7 +451,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 72 + 79 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -553,10 +553,6 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html 132 - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 156 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 38 @@ -583,7 +579,7 @@ Mensaje del sistema apps/client/src/app/components/admin-overview/admin-overview.html - 122 + 109 @@ -591,7 +587,7 @@ Establecer mensaje apps/client/src/app/components/admin-overview/admin-overview.html - 144 + 131 @@ -599,7 +595,7 @@ Modo de solo lectura apps/client/src/app/components/admin-overview/admin-overview.html - 112 + 99 @@ -607,7 +603,7 @@ Cupones apps/client/src/app/components/admin-overview/admin-overview.html - 152 + 139 @@ -615,7 +611,7 @@ Añadir apps/client/src/app/components/admin-overview/admin-overview.html - 194 + 181 @@ -623,7 +619,7 @@ Tareas domésticas apps/client/src/app/components/admin-overview/admin-overview.html - 201 + 188 @@ -631,7 +627,7 @@ Limpiar caché apps/client/src/app/components/admin-overview/admin-overview.html - 205 + 192 @@ -1135,7 +1131,7 @@ Sectores apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 125 + 132 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1151,7 +1147,7 @@ Países apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 135 + 142 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1163,7 +1159,7 @@ Etiquetas apps/client/src/app/components/admin-overview/admin-overview.html - 92 + 79 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1357,6 +1353,10 @@ apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.html 245 + + apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.html + 231 + apps/client/src/app/pages/blog/blog-page.html 4 @@ -1627,7 +1627,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 62 + 69 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2043,7 +2043,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 160 + 167 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -2059,7 +2059,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 86 + 93 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2111,7 +2111,7 @@ Cartera apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 102 + 109 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2411,7 +2411,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 95 + 102 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2467,7 +2467,7 @@ Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 110 + 117 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2479,7 +2479,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 119 + 126 apps/client/src/app/components/admin-users/admin-users.html @@ -2659,15 +2659,7 @@ Benchmark apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 111 - - - - Benchmarks - Benchmark - - apps/client/src/app/components/admin-overview/admin-overview.html - 79 + 118 @@ -2675,7 +2667,7 @@ Comparar con... apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html - 18 + 17 @@ -2919,7 +2911,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 369 + 373 @@ -2927,11 +2919,11 @@ Sin datos disponibles libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 371 + 375 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 384 + 388 @@ -3047,7 +3039,7 @@ Mapeo de símbolos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 149 + 156 @@ -3079,7 +3071,7 @@ User Signup apps/client/src/app/components/admin-overview/admin-overview.html - 102 + 89 @@ -3601,10 +3593,6 @@ Gather Historical Data Gather Historical Data - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 150 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 30 @@ -3814,6 +3802,22 @@ 14 + + Set as Benchmark + Set as Benchmark + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 45 + + + + Manage Benchmarks + Manage Benchmarks + + apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html + 34 + + diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 467ded612..2d80790a8 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -118,7 +118,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 81 + 88 apps/client/src/app/components/admin-users/admin-users.html @@ -186,7 +186,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 62 + 69 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -274,7 +274,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 163 + 151 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -306,7 +306,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 57 + 64 @@ -450,7 +450,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 180 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -486,7 +486,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 180 + 187 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -522,7 +522,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 86 + 93 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -542,7 +542,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 95 + 102 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -562,7 +562,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 72 + 79 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -624,10 +624,6 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html 132 - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 156 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 38 @@ -646,7 +642,7 @@ Secteur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 110 + 117 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -658,7 +654,7 @@ Pays apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 119 + 126 apps/client/src/app/components/admin-users/admin-users.html @@ -674,7 +670,7 @@ Secteurs apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 125 + 132 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -690,7 +686,7 @@ Pays apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 135 + 142 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -702,7 +698,7 @@ Équivalence de Symboles apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 149 + 156 @@ -710,7 +706,7 @@ Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 160 + 167 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -797,20 +793,12 @@ 70 - - Benchmarks - Références - - apps/client/src/app/components/admin-overview/admin-overview.html - 79 - - Tags Étiquettes apps/client/src/app/components/admin-overview/admin-overview.html - 92 + 79 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -826,7 +814,7 @@ Inscription de Nouveaux Utilisateurs apps/client/src/app/components/admin-overview/admin-overview.html - 102 + 89 @@ -834,7 +822,7 @@ Mode Lecture Seule apps/client/src/app/components/admin-overview/admin-overview.html - 112 + 99 @@ -842,7 +830,7 @@ Message Système apps/client/src/app/components/admin-overview/admin-overview.html - 122 + 109 @@ -850,7 +838,7 @@ Définir Message apps/client/src/app/components/admin-overview/admin-overview.html - 144 + 131 @@ -858,7 +846,7 @@ Codes promotionnels apps/client/src/app/components/admin-overview/admin-overview.html - 152 + 139 @@ -866,7 +854,7 @@ Ajouter apps/client/src/app/components/admin-overview/admin-overview.html - 194 + 181 @@ -874,7 +862,7 @@ Maintenance apps/client/src/app/components/admin-overview/admin-overview.html - 201 + 188 @@ -882,7 +870,7 @@ Vider le Cache apps/client/src/app/components/admin-overview/admin-overview.html - 205 + 192 @@ -974,7 +962,7 @@ Comparer avec... apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html - 18 + 17 @@ -982,7 +970,7 @@ Portefeuille apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 102 + 109 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -994,7 +982,7 @@ Référence apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 111 + 118 @@ -2108,6 +2096,10 @@ apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.html 245 + + apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.html + 231 + apps/client/src/app/pages/blog/blog-page.html 4 @@ -2961,7 +2953,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 369 + 373 @@ -3145,11 +3137,11 @@ Pas de données disponibles libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 371 + 375 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 384 + 388 @@ -3599,10 +3591,6 @@ Gather Historical Data Gather Historical Data - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 150 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 30 @@ -3812,6 +3800,22 @@ 14 + + Set as Benchmark + Set as Benchmark + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 45 + + + + Manage Benchmarks + Manage Benchmarks + + apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html + 34 + + diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index c978a04f4..43fd65372 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -95,7 +95,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 81 + 88 apps/client/src/app/components/admin-users/admin-users.html @@ -211,7 +211,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 163 + 151 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -251,7 +251,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 57 + 64 @@ -387,7 +387,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 180 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -423,7 +423,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 180 + 187 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -451,7 +451,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 72 + 79 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -553,10 +553,6 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html 132 - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 156 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 38 @@ -583,7 +579,7 @@ Messaggio di sistema apps/client/src/app/components/admin-overview/admin-overview.html - 122 + 109 @@ -591,7 +587,7 @@ Imposta messaggio apps/client/src/app/components/admin-overview/admin-overview.html - 144 + 131 @@ -599,7 +595,7 @@ Modalità di sola lettura apps/client/src/app/components/admin-overview/admin-overview.html - 112 + 99 @@ -607,7 +603,7 @@ Buoni sconto apps/client/src/app/components/admin-overview/admin-overview.html - 152 + 139 @@ -615,7 +611,7 @@ Aggiungi apps/client/src/app/components/admin-overview/admin-overview.html - 194 + 181 @@ -623,7 +619,7 @@ Bilancio domestico apps/client/src/app/components/admin-overview/admin-overview.html - 201 + 188 @@ -631,7 +627,7 @@ Svuota la cache apps/client/src/app/components/admin-overview/admin-overview.html - 205 + 192 @@ -1135,7 +1131,7 @@ Settori apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 125 + 132 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1151,7 +1147,7 @@ Paesi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 135 + 142 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1163,7 +1159,7 @@ Tag apps/client/src/app/components/admin-overview/admin-overview.html - 92 + 79 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1357,6 +1353,10 @@ apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.html 245 + + apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.html + 231 + apps/client/src/app/pages/blog/blog-page.html 4 @@ -1627,7 +1627,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 62 + 69 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2043,7 +2043,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 160 + 167 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -2059,7 +2059,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 86 + 93 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2111,7 +2111,7 @@ Portafoglio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 102 + 109 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2411,7 +2411,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 95 + 102 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2467,7 +2467,7 @@ Settore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 110 + 117 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2479,7 +2479,7 @@ Paese apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 119 + 126 apps/client/src/app/components/admin-users/admin-users.html @@ -2659,15 +2659,7 @@ Benchmark apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 111 - - - - Benchmarks - Benchmark - - apps/client/src/app/components/admin-overview/admin-overview.html - 79 + 118 @@ -2675,7 +2667,7 @@ Confronta con... apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html - 18 + 17 @@ -2919,7 +2911,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 369 + 373 @@ -2927,11 +2919,11 @@ No data available libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 371 + 375 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 384 + 388 @@ -3047,7 +3039,7 @@ Symbol Mapping apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 149 + 156 @@ -3079,7 +3071,7 @@ User Signup apps/client/src/app/components/admin-overview/admin-overview.html - 102 + 89 @@ -3601,10 +3593,6 @@ Gather Historical Data Gather Historical Data - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 150 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 30 @@ -3814,6 +3802,22 @@ 14 + + Set as Benchmark + Set as Benchmark + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 45 + + + + Manage Benchmarks + Manage Benchmarks + + apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html + 34 + + diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index e7f592aea..65868a700 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -94,7 +94,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 81 + 88 apps/client/src/app/components/admin-users/admin-users.html @@ -210,7 +210,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 163 + 151 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -250,7 +250,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 57 + 64 @@ -386,7 +386,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 180 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -422,7 +422,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 180 + 187 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -450,7 +450,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 72 + 79 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -552,10 +552,6 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html 132 - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 156 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 38 @@ -582,7 +578,7 @@ Systeembericht apps/client/src/app/components/admin-overview/admin-overview.html - 122 + 109 @@ -590,7 +586,7 @@ Bericht instellen apps/client/src/app/components/admin-overview/admin-overview.html - 144 + 131 @@ -598,7 +594,7 @@ Alleen lezen apps/client/src/app/components/admin-overview/admin-overview.html - 112 + 99 @@ -606,7 +602,7 @@ Coupons apps/client/src/app/components/admin-overview/admin-overview.html - 152 + 139 @@ -614,7 +610,7 @@ Toevoegen apps/client/src/app/components/admin-overview/admin-overview.html - 194 + 181 @@ -622,7 +618,7 @@ Huishouding apps/client/src/app/components/admin-overview/admin-overview.html - 201 + 188 @@ -630,7 +626,7 @@ Cache legen apps/client/src/app/components/admin-overview/admin-overview.html - 205 + 192 @@ -1134,7 +1130,7 @@ Sectoren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 125 + 132 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1150,7 +1146,7 @@ Landen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 135 + 142 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1162,7 +1158,7 @@ Tags apps/client/src/app/components/admin-overview/admin-overview.html - 92 + 79 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1356,6 +1352,10 @@ apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.html 245 + + apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.html + 231 + apps/client/src/app/pages/blog/blog-page.html 4 @@ -1626,7 +1626,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 62 + 69 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2042,7 +2042,7 @@ Opmerking apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 160 + 167 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -2058,7 +2058,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 86 + 93 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2110,7 +2110,7 @@ Portefeuille apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 102 + 109 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2410,7 +2410,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 95 + 102 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2466,7 +2466,7 @@ Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 110 + 117 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2478,7 +2478,7 @@ Land apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 119 + 126 apps/client/src/app/components/admin-users/admin-users.html @@ -2658,15 +2658,7 @@ Benchmark apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 111 - - - - Benchmarks - Benchmarks - - apps/client/src/app/components/admin-overview/admin-overview.html - 79 + 118 @@ -2674,7 +2666,7 @@ Vergelijk met... apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html - 18 + 17 @@ -2918,7 +2910,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 369 + 373 @@ -2926,11 +2918,11 @@ Geen gegevens beschikbaar libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 371 + 375 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 384 + 388 @@ -3046,7 +3038,7 @@ Symbool toewijzen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 149 + 156 @@ -3078,7 +3070,7 @@ Account aanmaken apps/client/src/app/components/admin-overview/admin-overview.html - 102 + 89 @@ -3608,10 +3600,6 @@ Gather Historical Data Gather Historical Data - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 150 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 30 @@ -3813,6 +3801,22 @@ 14 + + Set as Benchmark + Set as Benchmark + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 45 + + + + Manage Benchmarks + Manage Benchmarks + + apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html + 34 + + diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 36fe7bc78..39b679157 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -118,7 +118,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 81 + 88 apps/client/src/app/components/admin-users/admin-users.html @@ -186,7 +186,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 62 + 69 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -274,7 +274,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 163 + 151 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -306,7 +306,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 57 + 64 @@ -450,7 +450,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 180 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -486,7 +486,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 180 + 187 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -522,7 +522,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 86 + 93 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -542,7 +542,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 95 + 102 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -562,7 +562,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 72 + 79 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -624,10 +624,6 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html 132 - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 156 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 38 @@ -705,20 +701,12 @@ 70 - - Benchmarks - Benchmarks - - apps/client/src/app/components/admin-overview/admin-overview.html - 79 - - System Message System Message apps/client/src/app/components/admin-overview/admin-overview.html - 122 + 109 @@ -726,7 +714,7 @@ Set Message apps/client/src/app/components/admin-overview/admin-overview.html - 144 + 131 @@ -734,7 +722,7 @@ Read-only Mode apps/client/src/app/components/admin-overview/admin-overview.html - 112 + 99 @@ -742,7 +730,7 @@ Coupons apps/client/src/app/components/admin-overview/admin-overview.html - 152 + 139 @@ -750,7 +738,7 @@ Add apps/client/src/app/components/admin-overview/admin-overview.html - 194 + 181 @@ -758,7 +746,7 @@ Housekeeping apps/client/src/app/components/admin-overview/admin-overview.html - 201 + 188 @@ -766,7 +754,7 @@ Flush Cache apps/client/src/app/components/admin-overview/admin-overview.html - 205 + 192 @@ -858,7 +846,7 @@ Compare with... apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html - 18 + 17 @@ -866,7 +854,7 @@ Portfolio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 102 + 109 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -878,7 +866,7 @@ Benchmark apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 111 + 118 @@ -1458,7 +1446,7 @@ Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 110 + 117 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1470,7 +1458,7 @@ Country apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 119 + 126 apps/client/src/app/components/admin-users/admin-users.html @@ -1486,7 +1474,7 @@ Sectors apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 125 + 132 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1502,7 +1490,7 @@ Countries apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 135 + 142 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1514,7 +1502,7 @@ Tags apps/client/src/app/components/admin-overview/admin-overview.html - 92 + 79 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2052,6 +2040,10 @@ apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.html 245 + + apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.html + 231 + apps/client/src/app/pages/blog/blog-page.html 4 @@ -2210,7 +2202,7 @@ Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 160 + 167 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -2846,7 +2838,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 369 + 373 @@ -3022,11 +3014,11 @@ No data available libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 371 + 375 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 384 + 388 @@ -3050,7 +3042,7 @@ Symbol Mapping apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 149 + 156 @@ -3058,7 +3050,7 @@ User Signup apps/client/src/app/components/admin-overview/admin-overview.html - 102 + 89 @@ -3600,10 +3592,6 @@ Gather Historical Data Gather Historical Data - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 150 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 30 @@ -3813,6 +3801,22 @@ 14 + + Set as Benchmark + Set as Benchmark + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 45 + + + + Manage Benchmarks + Manage Benchmarks + + apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html + 34 + + diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 96322b005..f0180872e 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -87,7 +87,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 81 + 88 apps/client/src/app/components/admin-users/admin-users.html @@ -198,7 +198,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 163 + 151 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -235,7 +235,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 57 + 64 @@ -357,7 +357,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 180 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -392,7 +392,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 180 + 187 apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html @@ -419,7 +419,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 72 + 79 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -509,10 +509,6 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html 132 - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 156 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 38 @@ -536,49 +532,49 @@ System Message apps/client/src/app/components/admin-overview/admin-overview.html - 122 + 109 Set Message apps/client/src/app/components/admin-overview/admin-overview.html - 144 + 131 Read-only Mode apps/client/src/app/components/admin-overview/admin-overview.html - 112 + 99 Coupons apps/client/src/app/components/admin-overview/admin-overview.html - 152 + 139 Add apps/client/src/app/components/admin-overview/admin-overview.html - 194 + 181 Housekeeping apps/client/src/app/components/admin-overview/admin-overview.html - 201 + 188 Flush Cache apps/client/src/app/components/admin-overview/admin-overview.html - 205 + 192 @@ -1033,7 +1029,7 @@ Sectors apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 125 + 132 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1048,7 +1044,7 @@ Countries apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 135 + 142 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1059,7 +1055,7 @@ Tags apps/client/src/app/components/admin-overview/admin-overview.html - 92 + 79 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1238,6 +1234,10 @@ apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.html 245 + + apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.html + 231 + apps/client/src/app/pages/blog/blog-page.html 4 @@ -1476,7 +1476,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 62 + 69 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1853,7 +1853,7 @@ Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 160 + 167 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -1868,7 +1868,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 86 + 93 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -1915,7 +1915,7 @@ Portfolio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 102 + 109 apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2182,7 +2182,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 95 + 102 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2233,7 +2233,7 @@ Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 110 + 117 apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -2244,7 +2244,7 @@ Country apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 119 + 126 apps/client/src/app/components/admin-users/admin-users.html @@ -2405,21 +2405,14 @@ Benchmark apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 111 - - - - Benchmarks - - apps/client/src/app/components/admin-overview/admin-overview.html - 79 + 118 Compare with... apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html - 18 + 17 @@ -2622,11 +2615,11 @@ No data available libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 371 + 375 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 384 + 388 @@ -2644,7 +2637,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 369 + 373 @@ -2740,7 +2733,7 @@ Symbol Mapping apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 149 + 156 @@ -2775,7 +2768,7 @@ User Signup apps/client/src/app/components/admin-overview/admin-overview.html - 102 + 89 @@ -3252,10 +3245,6 @@ Gather Historical Data - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 150 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 30 @@ -3434,6 +3423,20 @@ 14 + + Manage Benchmarks + + apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html + 34 + + + + Set as Benchmark + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 45 + + diff --git a/apps/client/src/styles.scss b/apps/client/src/styles.scss index 942e75294..a84fbab03 100644 --- a/apps/client/src/styles.scss +++ b/apps/client/src/styles.scss @@ -327,10 +327,13 @@ ngx-skeleton-loader { .breadcrumb { background-color: unset; + flex-wrap: nowrap; padding: unset; } .breadcrumb-item { + flex-wrap: nowrap; + &.active { color: unset; } diff --git a/apps/client/src/styles/theme.scss b/apps/client/src/styles/theme.scss index 118d53336..5dcbb10ff 100644 --- a/apps/client/src/styles/theme.scss +++ b/apps/client/src/styles/theme.scss @@ -86,6 +86,7 @@ $gf-theme-default: mat.define-light-theme( ); @include mat.all-component-themes($gf-theme-default); @include mat.button-density(0); +@include mat.table-density(-1); // Create dark theme $gf-theme-dark: mat.define-dark-theme( @@ -101,6 +102,7 @@ $gf-theme-dark: mat.define-dark-theme( .is-dark-theme { @include mat.all-component-colors($gf-theme-dark); @include mat.button-density(0); + @include mat.table-density(-1); } :root { diff --git a/libs/common/src/lib/interfaces/benchmark-market-data-details.interface.ts b/libs/common/src/lib/interfaces/benchmark-market-data-details.interface.ts index 10fdeff32..ed693b9af 100644 --- a/libs/common/src/lib/interfaces/benchmark-market-data-details.interface.ts +++ b/libs/common/src/lib/interfaces/benchmark-market-data-details.interface.ts @@ -1,4 +1,4 @@ -import { LineChartItem } from './line-chart-item.interface'; +import { LineChartItem } from '@ghostfolio/common/interfaces'; export interface BenchmarkMarketDataDetails { marketData: LineChartItem[]; diff --git a/libs/common/src/lib/interfaces/benchmark-property.interface.ts b/libs/common/src/lib/interfaces/benchmark-property.interface.ts new file mode 100644 index 000000000..bccf4ed78 --- /dev/null +++ b/libs/common/src/lib/interfaces/benchmark-property.interface.ts @@ -0,0 +1,3 @@ +export interface BenchmarkProperty { + symbolProfileId: string; +} diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index b197add39..93268153b 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -1,46 +1,49 @@ -import { Access } from './access.interface'; -import { Accounts } from './accounts.interface'; -import { AdminData } from './admin-data.interface'; -import { AdminJobs } from './admin-jobs.interface'; -import { AdminMarketDataDetails } from './admin-market-data-details.interface'; -import { +import type { Access } from './access.interface'; +import type { Accounts } from './accounts.interface'; +import type { AdminData } from './admin-data.interface'; +import type { AdminJobs } from './admin-jobs.interface'; +import type { AdminMarketDataDetails } from './admin-market-data-details.interface'; +import type { AdminMarketData, AdminMarketDataItem } from './admin-market-data.interface'; -import { BenchmarkMarketDataDetails } from './benchmark-market-data-details.interface'; -import { Benchmark } from './benchmark.interface'; -import { Coupon } from './coupon.interface'; -import { DataProviderInfo } from './data-provider-info.interface'; -import { EnhancedSymbolProfile } from './enhanced-symbol-profile.interface'; -import { Export } from './export.interface'; -import { FilterGroup } from './filter-group.interface'; -import { Filter } from './filter.interface'; -import { HistoricalDataItem } from './historical-data-item.interface'; -import { InfoItem } from './info-item.interface'; -import { LineChartItem } from './line-chart-item.interface'; -import { PortfolioChart } from './portfolio-chart.interface'; -import { PortfolioDetails } from './portfolio-details.interface'; -import { PortfolioDividends } from './portfolio-dividends.interface'; -import { PortfolioInvestments } from './portfolio-investments.interface'; -import { PortfolioItem } from './portfolio-item.interface'; -import { PortfolioOverview } from './portfolio-overview.interface'; -import { PortfolioPerformance } from './portfolio-performance.interface'; -import { PortfolioPosition } from './portfolio-position.interface'; -import { PortfolioPublicDetails } from './portfolio-public-details.interface'; -import { PortfolioReportRule } from './portfolio-report-rule.interface'; -import { PortfolioReport } from './portfolio-report.interface'; -import { PortfolioSummary } from './portfolio-summary.interface'; -import { Position } from './position.interface'; -import { BenchmarkResponse } from './responses/benchmark-response.interface'; -import { ResponseError } from './responses/errors.interface'; -import { ImportResponse } from './responses/import-response.interface'; -import { OAuthResponse } from './responses/oauth-response.interface'; -import { PortfolioPerformanceResponse } from './responses/portfolio-performance-response.interface'; -import { ScraperConfiguration } from './scraper-configuration.interface'; -import { TimelinePosition } from './timeline-position.interface'; -import { UniqueAsset } from './unique-asset.interface'; -import { UserSettings } from './user-settings.interface'; -import { User } from './user.interface'; +import type { BenchmarkMarketDataDetails } from './benchmark-market-data-details.interface'; +import type { BenchmarkProperty } from './benchmark-property.interface'; +import type { Benchmark } from './benchmark.interface'; +import type { Coupon } from './coupon.interface'; +import type { DataProviderInfo } from './data-provider-info.interface'; +import type { EnhancedSymbolProfile } from './enhanced-symbol-profile.interface'; +import type { Export } from './export.interface'; +import type { FilterGroup } from './filter-group.interface'; +import type { Filter } from './filter.interface'; +import type { HistoricalDataItem } from './historical-data-item.interface'; +import type { InfoItem } from './info-item.interface'; +import type { LineChartItem } from './line-chart-item.interface'; +import type { PortfolioChart } from './portfolio-chart.interface'; +import type { PortfolioDetails } from './portfolio-details.interface'; +import type { PortfolioDividends } from './portfolio-dividends.interface'; +import type { PortfolioInvestments } from './portfolio-investments.interface'; +import type { PortfolioItem } from './portfolio-item.interface'; +import type { PortfolioOverview } from './portfolio-overview.interface'; +import type { PortfolioPerformance } from './portfolio-performance.interface'; +import type { PortfolioPosition } from './portfolio-position.interface'; +import type { PortfolioPublicDetails } from './portfolio-public-details.interface'; +import type { PortfolioReportRule } from './portfolio-report-rule.interface'; +import type { PortfolioReport } from './portfolio-report.interface'; +import type { PortfolioSummary } from './portfolio-summary.interface'; +import type { Position } from './position.interface'; +import type { BenchmarkResponse } from './responses/benchmark-response.interface'; +import type { ResponseError } from './responses/errors.interface'; +import type { ImportResponse } from './responses/import-response.interface'; +import type { OAuthResponse } from './responses/oauth-response.interface'; +import type { PortfolioPerformanceResponse } from './responses/portfolio-performance-response.interface'; +import type { ScraperConfiguration } from './scraper-configuration.interface'; +import type { Statistics } from './statistics.interface'; +import type { Subscription } from './subscription.interface'; +import type { TimelinePosition } from './timeline-position.interface'; +import type { UniqueAsset } from './unique-asset.interface'; +import type { UserSettings } from './user-settings.interface'; +import type { User } from './user.interface'; export { Access, @@ -52,6 +55,7 @@ export { AdminMarketDataItem, Benchmark, BenchmarkMarketDataDetails, + BenchmarkProperty, BenchmarkResponse, Coupon, DataProviderInfo, @@ -80,6 +84,8 @@ export { Position, ResponseError, ScraperConfiguration, + Statistics, + Subscription, TimelinePosition, UniqueAsset, User, diff --git a/libs/common/src/lib/interfaces/responses/benchmark-response.interface.ts b/libs/common/src/lib/interfaces/responses/benchmark-response.interface.ts index 262d55fba..d47cf1864 100644 --- a/libs/common/src/lib/interfaces/responses/benchmark-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/benchmark-response.interface.ts @@ -1,4 +1,4 @@ -import { Benchmark } from '../benchmark.interface'; +import { Benchmark } from '@ghostfolio/common/interfaces'; export interface BenchmarkResponse { benchmarks: Benchmark[]; diff --git a/libs/common/src/lib/types/index.ts b/libs/common/src/lib/types/index.ts index 258ce211d..dc6f154dc 100644 --- a/libs/common/src/lib/types/index.ts +++ b/libs/common/src/lib/types/index.ts @@ -1,17 +1,17 @@ import type { AccessWithGranteeUser } from './access-with-grantee-user.type'; -import { AccountWithPlatform } from './account-with-platform.type'; -import { AccountWithValue } from './account-with-value.type'; +import type { AccountWithPlatform } from './account-with-platform.type'; +import type { AccountWithValue } from './account-with-value.type'; import type { ColorScheme } from './color-scheme.type'; import type { DateRange } from './date-range.type'; import type { Granularity } from './granularity.type'; -import { GroupBy } from './group-by.type'; -import { MarketState } from './market-state.type'; -import { Market } from './market.type'; +import type { GroupBy } from './group-by.type'; +import type { MarketState } from './market-state.type'; +import type { Market } from './market.type'; import type { OrderWithAccount } from './order-with-account.type'; import type { RequestWithUser } from './request-with-user.type'; -import { SubscriptionOffer } from './subscription-offer.type'; -import { ToggleOption } from './toggle-option.type'; -import { UserWithSettings } from './user-with-settings.type'; +import type { SubscriptionOffer } from './subscription-offer.type'; +import type { ToggleOption } from './toggle-option.type'; +import type { UserWithSettings } from './user-with-settings.type'; import type { ViewMode } from './view-mode.type'; export type { diff --git a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts index 36991d763..452cd8f35 100644 --- a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts +++ b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -100,38 +100,42 @@ export class PortfolioProportionChartComponent }; Object.keys(this.positions).forEach((symbol) => { - if (this.positions[symbol][this.keys[0]]) { - if (chartData[this.positions[symbol][this.keys[0]]]) { - chartData[this.positions[symbol][this.keys[0]]].value = chartData[ - this.positions[symbol][this.keys[0]] - ].value.plus(this.positions[symbol].value); + if (this.positions[symbol][this.keys[0]].toUpperCase()) { + if (chartData[this.positions[symbol][this.keys[0]].toUpperCase()]) { + chartData[this.positions[symbol][this.keys[0]].toUpperCase()].value = + chartData[ + this.positions[symbol][this.keys[0]].toUpperCase() + ].value.plus(this.positions[symbol].value); if ( - chartData[this.positions[symbol][this.keys[0]]].subCategory[ - this.positions[symbol][this.keys[1]] - ] + chartData[this.positions[symbol][this.keys[0]].toUpperCase()] + .subCategory[this.positions[symbol][this.keys[1]]] ) { - chartData[this.positions[symbol][this.keys[0]]].subCategory[ - this.positions[symbol][this.keys[1]] - ].value = chartData[ - this.positions[symbol][this.keys[0]] - ].subCategory[this.positions[symbol][this.keys[1]]].value.plus( - this.positions[symbol].value - ); + chartData[ + this.positions[symbol][this.keys[0]].toUpperCase() + ].subCategory[this.positions[symbol][this.keys[1]]].value = + chartData[ + this.positions[symbol][this.keys[0]].toUpperCase() + ].subCategory[this.positions[symbol][this.keys[1]]].value.plus( + this.positions[symbol].value + ); } else { - chartData[this.positions[symbol][this.keys[0]]].subCategory[ - this.positions[symbol][this.keys[1]] ?? UNKNOWN_KEY - ] = { value: new Big(this.positions[symbol].value) }; + chartData[ + this.positions[symbol][this.keys[0]].toUpperCase() + ].subCategory[this.positions[symbol][this.keys[1]] ?? UNKNOWN_KEY] = + { value: new Big(this.positions[symbol].value) }; } } else { - chartData[this.positions[symbol][this.keys[0]]] = { - name: this.positions[symbol].name, + chartData[this.positions[symbol][this.keys[0]].toUpperCase()] = { + name: this.positions[symbol][this.keys[0]], subCategory: {}, value: new Big(this.positions[symbol].value ?? 0) }; if (this.positions[symbol][this.keys[1]]) { - chartData[this.positions[symbol][this.keys[0]]].subCategory = { + chartData[ + this.positions[symbol][this.keys[0]].toUpperCase() + ].subCategory = { [this.positions[symbol][this.keys[1]]]: { value: new Big(this.positions[symbol].value) } @@ -232,8 +236,8 @@ export class PortfolioProportionChartComponent } ]; - let labels = chartDataSorted.map(([label]) => { - return label; + let labels = chartDataSorted.map(([symbol, { name }]) => { + return name; }); if (this.keys[1]) { diff --git a/libs/ui/src/lib/value/value.component.ts b/libs/ui/src/lib/value/value.component.ts index e4b7779e9..959ae2002 100644 --- a/libs/ui/src/lib/value/value.component.ts +++ b/libs/ui/src/lib/value/value.component.ts @@ -21,7 +21,7 @@ export class ValueComponent implements OnChanges { @Input() isCurrency = false; @Input() isDate = false; @Input() isPercent = false; - @Input() locale = getLocale(); + @Input() locale: string | undefined; @Input() position = ''; @Input() precision: number | undefined; @Input() size: 'large' | 'medium' | 'small' = 'small'; @@ -92,7 +92,7 @@ export class ValueComponent implements OnChanges { }); } catch {} } else { - this.formattedValue = this.value?.toString(); + this.formattedValue = this.value?.toLocaleString(this.locale); } if (this.isAbsolute) { @@ -128,6 +128,11 @@ export class ValueComponent implements OnChanges { this.formattedValue = ''; this.isNumber = false; this.isString = false; + + if (!this.locale) { + this.locale = getLocale(); + } + this.useAbsoluteValue = false; } } diff --git a/package.json b/package.json index 3ec808f90..618593dbd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "1.270.1", + "version": "1.272.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "scripts": { @@ -106,7 +106,7 @@ "envalid": "7.3.1", "google-spreadsheet": "3.2.0", "http-status-codes": "2.2.0", - "ionicons": "6.1.2", + "ionicons": "7.1.0", "lodash": "4.17.21", "marked": "4.2.12", "ms": "3.0.0-canary.1", diff --git a/yarn.lock b/yarn.lock index 4e9fc465f..224e66b60 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11221,10 +11221,10 @@ invert-kv@^2.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== -ionicons@6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/ionicons/-/ionicons-6.1.2.tgz#805ed1ce272b653ac07a85f83514e5afa2c9677d" - integrity sha512-EL3jjlUzjPo8h2PfI+BUEjVMF9weSfLAFriNlk9pHFMTJq+7G12sAJBZ3AnRN8nTWA2pOS279PvFIWS3hbat+w== +ionicons@7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/ionicons/-/ionicons-7.1.0.tgz#25daa91345acedcb0f4fb7da670f5aff2e1f266a" + integrity sha512-iE4GuEdEHARJpp0sWL7WJZCzNCf5VxpNRhAjW0fLnZPnNL5qZOJUcfup2Z2Ty7Jk8Q5hacrHfGEB1lCwOdXqGg== dependencies: "@stencil/core" "^2.18.0"