From 1bced964609a2843ecb39449a7c1e69312738aeb Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 3 May 2025 20:47:02 +0200 Subject: [PATCH 1/8] Feature/deprecate portfolio position endpoints (#4648) * Deprecate api/v1/portfolio/position endpoints * Update changelog --- CHANGELOG.md | 7 ++ apps/api/src/app/import/import.service.ts | 2 +- .../src/app/portfolio/portfolio.controller.ts | 74 +++++++++++++++++-- .../src/app/portfolio/portfolio.service.ts | 8 +- apps/client/src/app/services/data.service.ts | 8 +- libs/common/src/lib/interfaces/index.ts | 2 + .../portfolio-holding-response.interface.ts | 2 +- 7 files changed, 88 insertions(+), 15 deletions(-) rename apps/api/src/app/portfolio/interfaces/portfolio-holding-detail.interface.ts => libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts (96%) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9f4a443e..95d1e00e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Changed + +- Deprecated the endpoint to get a portfolio position in favor of get a holding +- Deprecated the endpoint to update portfolio position tags in favor of update holding tags + ## 2.159.0 - 2025-05-02 ### Added diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index b6fe0d949..4cb6d46c2 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -50,7 +50,7 @@ export class ImportService { }: AssetProfileIdentifier): Promise { try { const { firstBuyDate, historicalData, orders } = - await this.portfolioService.getPosition(dataSource, undefined, symbol); + await this.portfolioService.getHolding(dataSource, undefined, symbol); const [[assetProfile], dividends] = await Promise.all([ this.symbolProfileService.getSymbolProfiles([ diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index c3e46d50d..5b68f58e0 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -20,6 +20,7 @@ import { import { PortfolioDetails, PortfolioDividends, + PortfolioHoldingResponse, PortfolioHoldingsResponse, PortfolioInvestments, PortfolioPerformanceResponse, @@ -56,7 +57,6 @@ import { AssetClass, AssetSubClass, DataSource } from '@prisma/client'; import { Big } from 'big.js'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; -import { PortfolioHoldingDetail } from './interfaces/portfolio-holding-detail.interface'; import { PortfolioService } from './portfolio.service'; import { UpdateHoldingTagsDto } from './update-holding-tags.dto'; @@ -365,6 +365,32 @@ export class PortfolioController { return { dividends }; } + @Get('holding/:dataSource/:symbol') + @UseInterceptors(RedactValuesInResponseInterceptor) + @UseInterceptors(TransformDataSourceInRequestInterceptor) + @UseInterceptors(TransformDataSourceInResponseInterceptor) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + public async getHolding( + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, + @Param('dataSource') dataSource: DataSource, + @Param('symbol') symbol: string + ): Promise { + const holding = await this.portfolioService.getHolding( + dataSource, + impersonationId, + symbol + ); + + if (!holding) { + throw new HttpException( + getReasonPhrase(StatusCodes.NOT_FOUND), + StatusCodes.NOT_FOUND + ); + } + + return holding; + } + @Get('holdings') @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(RedactValuesInResponseInterceptor) @@ -583,6 +609,9 @@ export class PortfolioController { return performanceInformation; } + /** + * @deprecated + */ @Get('position/:dataSource/:symbol') @UseInterceptors(RedactValuesInResponseInterceptor) @UseInterceptors(TransformDataSourceInRequestInterceptor) @@ -592,8 +621,8 @@ export class PortfolioController { @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, @Param('dataSource') dataSource: DataSource, @Param('symbol') symbol: string - ): Promise { - const holding = await this.portfolioService.getPosition( + ): Promise { + const holding = await this.portfolioService.getHolding( dataSource, impersonationId, symbol @@ -634,7 +663,7 @@ export class PortfolioController { } @HasPermission(permissions.updateOrder) - @Put('position/:dataSource/:symbol/tags') + @Put('holding/:dataSource/:symbol/tags') @UseInterceptors(TransformDataSourceInRequestInterceptor) @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async updateHoldingTags( @@ -643,7 +672,42 @@ export class PortfolioController { @Param('dataSource') dataSource: DataSource, @Param('symbol') symbol: string ): Promise { - const holding = await this.portfolioService.getPosition( + const holding = await this.portfolioService.getHolding( + dataSource, + impersonationId, + symbol + ); + + if (!holding) { + throw new HttpException( + getReasonPhrase(StatusCodes.NOT_FOUND), + StatusCodes.NOT_FOUND + ); + } + + await this.portfolioService.updateTags({ + dataSource, + impersonationId, + symbol, + tags: data.tags, + userId: this.request.user.id + }); + } + + /** + * @deprecated + */ + @HasPermission(permissions.updateOrder) + @Put('position/:dataSource/:symbol/tags') + @UseInterceptors(TransformDataSourceInRequestInterceptor) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + public async updatePositionTags( + @Body() data: UpdateHoldingTagsDto, + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, + @Param('dataSource') dataSource: DataSource, + @Param('symbol') symbol: string + ): Promise { + const holding = await this.portfolioService.getHolding( dataSource, impersonationId, symbol diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index a24809740..26265e8c8 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -41,6 +41,7 @@ import { HistoricalDataItem, InvestmentItem, PortfolioDetails, + PortfolioHoldingResponse, PortfolioInvestments, PortfolioPerformanceResponse, PortfolioPosition, @@ -87,7 +88,6 @@ import { isEmpty } from 'lodash'; import { PortfolioCalculator } from './calculator/portfolio-calculator'; import { PortfolioCalculatorFactory } from './calculator/portfolio-calculator.factory'; -import { PortfolioHoldingDetail } from './interfaces/portfolio-holding-detail.interface'; import { RulesService } from './rules.service'; const asiaPacificMarkets = require('../../assets/countries/asia-pacific-markets.json'); @@ -631,11 +631,11 @@ export class PortfolioService { }; } - public async getPosition( + public async getHolding( aDataSource: DataSource, aImpersonationId: string, aSymbol: string - ): Promise { + ): Promise { const userId = await this.getUserId(aImpersonationId, this.request.user.id); const user = await this.userService.user({ id: userId }); const userCurrency = this.getUserCurrency(user); @@ -927,7 +927,7 @@ export class PortfolioService { } } - public async getPositions({ + public async getHoldings({ dateRange = 'max', filters, impersonationId diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index 830543dda..41cde8c87 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -13,7 +13,6 @@ import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto'; -import { PortfolioHoldingDetail } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-holding-detail.interface'; import { SymbolItem } from '@ghostfolio/api/app/symbol/interfaces/symbol-item.interface'; import { DeleteOwnUserDto } from '@ghostfolio/api/app/user/delete-own-user.dto'; import { UserItem } from '@ghostfolio/api/app/user/interfaces/user-item.interface'; @@ -40,6 +39,7 @@ import { OAuthResponse, PortfolioDetails, PortfolioDividends, + PortfolioHoldingResponse, PortfolioHoldingsResponse, PortfolioInvestments, PortfolioPerformanceResponse, @@ -406,8 +406,8 @@ export class DataService { symbol: string; }) { return this.http - .get( - `/api/v1/portfolio/position/${dataSource}/${symbol}` + .get( + `/api/v1/portfolio/holding/${dataSource}/${symbol}` ) .pipe( map((data) => { @@ -776,7 +776,7 @@ export class DataService { tags }: { tags: Tag[] } & AssetProfileIdentifier) { return this.http.put( - `/api/v1/portfolio/position/${dataSource}/${symbol}/tags`, + `/api/v1/portfolio/holding/${dataSource}/${symbol}/tags`, { tags } ); } diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index 3e0528fd7..bdf982f55 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -52,6 +52,7 @@ import type { ImportResponse } from './responses/import-response.interface'; import type { LookupResponse } from './responses/lookup-response.interface'; import type { MarketDataDetailsResponse } from './responses/market-data-details-response.interface'; import type { OAuthResponse } from './responses/oauth-response.interface'; +import { PortfolioHoldingResponse } from './responses/portfolio-holding-response.interface'; import type { PortfolioHoldingsResponse } from './responses/portfolio-holdings-response.interface'; import type { PortfolioPerformanceResponse } from './responses/portfolio-performance-response.interface'; import type { PortfolioReportResponse } from './responses/portfolio-report.interface'; @@ -112,6 +113,7 @@ export { PortfolioChart, PortfolioDetails, PortfolioDividends, + PortfolioHoldingResponse, PortfolioHoldingsResponse, PortfolioInvestments, PortfolioItem, diff --git a/apps/api/src/app/portfolio/interfaces/portfolio-holding-detail.interface.ts b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts similarity index 96% rename from apps/api/src/app/portfolio/interfaces/portfolio-holding-detail.interface.ts rename to libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts index 79e4d40dc..cfdc1611d 100644 --- a/apps/api/src/app/portfolio/interfaces/portfolio-holding-detail.interface.ts +++ b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts @@ -7,7 +7,7 @@ import { import { Tag } from '@prisma/client'; -export interface PortfolioHoldingDetail { +export interface PortfolioHoldingResponse { averagePrice: number; dataProviderInfo: DataProviderInfo; dividendInBaseCurrency: number; From 3646fb7f7769bdce495d995ee6d69c222f3e647a Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 4 May 2025 09:48:43 +0200 Subject: [PATCH 2/8] Feature/refactor portfolio holding response (#4649) * Refactor portfolio holding response * maxPrice -> marketPriceMax * minPrice -> marketPriceMin * orders -> activities --- apps/api/src/app/import/import.service.ts | 6 +-- .../src/app/portfolio/portfolio.service.ts | 52 +++++++++++-------- .../holding-detail-dialog.component.ts | 12 ++--- .../holding-detail-dialog.html | 12 ++--- apps/client/src/app/services/data.service.ts | 4 +- .../portfolio-holding-response.interface.ts | 6 +-- 6 files changed, 49 insertions(+), 43 deletions(-) diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 4cb6d46c2..7afb2cd72 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -49,7 +49,7 @@ export class ImportService { symbol }: AssetProfileIdentifier): Promise { try { - const { firstBuyDate, historicalData, orders } = + const { activities, firstBuyDate, historicalData } = await this.portfolioService.getHolding(dataSource, undefined, symbol); const [[assetProfile], dividends] = await Promise.all([ @@ -68,7 +68,7 @@ export class ImportService { }) ]); - const accounts = orders + const accounts = activities .filter(({ Account }) => { return !!Account; }) @@ -88,7 +88,7 @@ export class ImportService { const value = new Big(quantity).mul(marketPrice).toNumber(); const date = parseDate(dateString); - const isDuplicate = orders.some((activity) => { + const isDuplicate = activities.some((activity) => { return ( activity.accountId === Account?.id && activity.SymbolProfile.currency === assetProfile.currency && diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 26265e8c8..47c773e80 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -648,6 +648,7 @@ export class PortfolioService { if (activities.length === 0) { return { + activities: [], averagePrice: undefined, dataProviderInfo: undefined, dividendInBaseCurrency: undefined, @@ -662,13 +663,12 @@ export class PortfolioService { historicalData: [], investment: undefined, marketPrice: undefined, - maxPrice: undefined, - minPrice: undefined, + marketPriceMax: undefined, + marketPriceMin: undefined, netPerformance: undefined, netPerformancePercent: undefined, netPerformancePercentWithCurrencyEffect: undefined, netPerformanceWithCurrencyEffect: undefined, - orders: [], quantity: undefined, SymbolProfile: undefined, tags: [], @@ -714,7 +714,7 @@ export class PortfolioService { transactionCount } = position; - const activitiesOfPosition = activities.filter(({ SymbolProfile }) => { + const activitiesOfHolding = activities.filter(({ SymbolProfile }) => { return ( SymbolProfile.dataSource === dataSource && SymbolProfile.symbol === symbol @@ -748,12 +748,12 @@ export class PortfolioService { ); const historicalDataArray: HistoricalDataItem[] = []; - let maxPrice = Math.max( - activitiesOfPosition[0].unitPriceInAssetProfileCurrency, + let marketPriceMax = Math.max( + activitiesOfHolding[0].unitPriceInAssetProfileCurrency, marketPrice ); - let minPrice = Math.min( - activitiesOfPosition[0].unitPriceInAssetProfileCurrency, + let marketPriceMin = Math.min( + activitiesOfHolding[0].unitPriceInAssetProfileCurrency, marketPrice ); @@ -793,27 +793,31 @@ export class PortfolioService { quantity: currentQuantity }); - maxPrice = Math.max(marketPrice ?? 0, maxPrice); - minPrice = Math.min(marketPrice ?? Number.MAX_SAFE_INTEGER, minPrice); + marketPriceMax = Math.max(marketPrice ?? 0, marketPriceMax); + marketPriceMin = Math.min( + marketPrice ?? Number.MAX_SAFE_INTEGER, + marketPriceMin + ); } } else { // Add historical entry for buy date, if no historical data available historicalDataArray.push({ - averagePrice: activitiesOfPosition[0].unitPriceInAssetProfileCurrency, + averagePrice: activitiesOfHolding[0].unitPriceInAssetProfileCurrency, date: firstBuyDate, - marketPrice: activitiesOfPosition[0].unitPriceInAssetProfileCurrency, - quantity: activitiesOfPosition[0].quantity + marketPrice: activitiesOfHolding[0].unitPriceInAssetProfileCurrency, + quantity: activitiesOfHolding[0].quantity }); } return { firstBuyDate, marketPrice, - maxPrice, - minPrice, + marketPriceMax, + marketPriceMin, SymbolProfile, tags, transactionCount, + activities: activitiesOfHolding, averagePrice: averagePrice.toNumber(), dataProviderInfo: portfolioCalculator.getDataProviderInfos()?.[0], dividendInBaseCurrency: dividendInBaseCurrency.toNumber(), @@ -842,7 +846,6 @@ export class PortfolioService { ]?.toNumber(), netPerformanceWithCurrencyEffect: position.netPerformanceWithCurrencyEffectMap?.['max']?.toNumber(), - orders: activitiesOfPosition, quantity: quantity.toNumber(), value: this.exchangeRateDataService.toCurrency( quantity.mul(marketPrice ?? 0).toNumber(), @@ -881,8 +884,8 @@ export class PortfolioService { } const historicalDataArray: HistoricalDataItem[] = []; - let maxPrice = marketPrice; - let minPrice = marketPrice; + let marketPriceMax = marketPrice; + let marketPriceMin = marketPrice; for (const [date, { marketPrice }] of Object.entries( historicalData[aSymbol] @@ -892,15 +895,19 @@ export class PortfolioService { value: marketPrice }); - maxPrice = Math.max(marketPrice ?? 0, maxPrice); - minPrice = Math.min(marketPrice ?? Number.MAX_SAFE_INTEGER, minPrice); + marketPriceMax = Math.max(marketPrice ?? 0, marketPriceMax); + marketPriceMin = Math.min( + marketPrice ?? Number.MAX_SAFE_INTEGER, + marketPriceMin + ); } return { marketPrice, - maxPrice, - minPrice, + marketPriceMax, + marketPriceMin, SymbolProfile, + activities: [], averagePrice: 0, dataProviderInfo: undefined, dividendInBaseCurrency: 0, @@ -918,7 +925,6 @@ export class PortfolioService { netPerformancePercent: undefined, netPerformancePercentWithCurrencyEffect: undefined, netPerformanceWithCurrencyEffect: undefined, - orders: [], quantity: 0, tags: [], transactionCount: undefined, diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts index 25317e0c5..925a64429 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts @@ -105,8 +105,8 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { public investmentPrecision = 2; public marketDataItems: MarketData[] = []; public marketPrice: number; - public maxPrice: number; - public minPrice: number; + public marketPriceMax: number; + public marketPriceMin: number; public netPerformance: number; public netPerformancePrecision = 2; public netPerformancePercent: number; @@ -234,8 +234,8 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { historicalData, investment, marketPrice, - maxPrice, - minPrice, + marketPriceMax, + marketPriceMin, netPerformance, netPerformancePercent, netPerformancePercentWithCurrencyEffect, @@ -297,8 +297,8 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { } this.marketPrice = marketPrice; - this.maxPrice = maxPrice; - this.minPrice = minPrice; + this.marketPriceMax = marketPriceMax; + this.marketPriceMin = marketPriceMin; this.netPerformance = netPerformance; if ( diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html index 9e8855d71..d18dc479b 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -106,11 +106,11 @@ [locale]="data.locale" [ngClass]="{ 'text-danger': - minPrice?.toFixed(2) === marketPrice?.toFixed(2) && - maxPrice?.toFixed(2) !== minPrice?.toFixed(2) + marketPriceMin?.toFixed(2) === marketPrice?.toFixed(2) && + marketPriceMax?.toFixed(2) !== marketPriceMin?.toFixed(2) }" [unit]="SymbolProfile?.currency" - [value]="minPrice" + [value]="marketPriceMin" >Minimum Price @@ -122,11 +122,11 @@ [locale]="data.locale" [ngClass]="{ 'text-success': - maxPrice?.toFixed(2) === marketPrice?.toFixed(2) && - maxPrice?.toFixed(2) !== minPrice?.toFixed(2) + marketPriceMax?.toFixed(2) === marketPrice?.toFixed(2) && + marketPriceMax?.toFixed(2) !== marketPriceMin?.toFixed(2) }" [unit]="SymbolProfile?.currency" - [value]="maxPrice" + [value]="marketPriceMax" >Maximum Price diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index 41cde8c87..e3bd9f27b 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -411,8 +411,8 @@ export class DataService { ) .pipe( map((data) => { - if (data.orders) { - for (const order of data.orders) { + if (data.activities) { + for (const order of data.activities) { order.createdAt = parseISO(order.createdAt as unknown as string); order.date = parseISO(order.date as unknown as string); } diff --git a/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts index cfdc1611d..c460242af 100644 --- a/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts @@ -8,6 +8,7 @@ import { import { Tag } from '@prisma/client'; export interface PortfolioHoldingResponse { + activities: Activity[]; averagePrice: number; dataProviderInfo: DataProviderInfo; dividendInBaseCurrency: number; @@ -22,13 +23,12 @@ export interface PortfolioHoldingResponse { historicalData: HistoricalDataItem[]; investment: number; marketPrice: number; - maxPrice: number; - minPrice: number; + marketPriceMax: number; + marketPriceMin: number; netPerformance: number; netPerformancePercent: number; netPerformancePercentWithCurrencyEffect: number; netPerformanceWithCurrencyEffect: number; - orders: Activity[]; quantity: number; SymbolProfile: EnhancedSymbolProfile; tags: Tag[]; From 308dfaa58dcd6e5af65bc73c58462e551ad76ddf Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 4 May 2025 11:16:32 +0200 Subject: [PATCH 3/8] Feature/upgrade prisma to version 6.7.0 (#4647) * Upgrade prisma to version 6.7.0 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 72 +++++++++++++++++++++++------------------------ package.json | 4 +-- 3 files changed, 39 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95d1e00e8..ea0e682f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Deprecated the endpoint to get a portfolio position in favor of get a holding - Deprecated the endpoint to update portfolio position tags in favor of update holding tags +- Upgraded `prisma` from version `6.6.0` to `6.7.0` ## 2.159.0 - 2025-05-02 diff --git a/package-lock.json b/package-lock.json index 6e4e2c308..cd38cff6a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "@nestjs/platform-express": "10.4.15", "@nestjs/schedule": "4.1.2", "@nestjs/serve-static": "4.0.2", - "@prisma/client": "6.6.0", + "@prisma/client": "6.7.0", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", "@stripe/stripe-js": "5.4.0", @@ -150,7 +150,7 @@ "nx": "20.8.1", "prettier": "3.5.3", "prettier-plugin-organize-attributes": "1.0.0", - "prisma": "6.6.0", + "prisma": "6.7.0", "react": "18.2.0", "react-dom": "18.2.0", "replace-in-file": "8.3.0", @@ -9631,9 +9631,9 @@ "license": "MIT" }, "node_modules/@prisma/client": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.6.0.tgz", - "integrity": "sha512-vfp73YT/BHsWWOAuthKQ/1lBgESSqYqAWZEYyTdGXyFAHpmewwWL2Iz6ErIzkj4aHbuc6/cGSsE6ZY+pBO04Cg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.7.0.tgz", + "integrity": "sha512-+k61zZn1XHjbZul8q6TdQLpuI/cvyfil87zqK2zpreNIXyXtpUv3+H/oM69hcsFcZXaokHJIzPAt5Z8C8eK2QA==", "hasInstallScript": true, "license": "Apache-2.0", "engines": { @@ -9653,9 +9653,9 @@ } }, "node_modules/@prisma/config": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.6.0.tgz", - "integrity": "sha512-d8FlXRHsx72RbN8nA2QCRORNv5AcUnPXgtPvwhXmYkQSMF/j9cKaJg+9VcUzBRXGy9QBckNzEQDEJZdEOZ+ubA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.7.0.tgz", + "integrity": "sha512-di8QDdvSz7DLUi3OOcCHSwxRNeW7jtGRUD2+Z3SdNE3A+pPiNT8WgUJoUyOwJmUr5t+JA2W15P78C/N+8RXrOA==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -9664,53 +9664,53 @@ } }, "node_modules/@prisma/debug": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.6.0.tgz", - "integrity": "sha512-DL6n4IKlW5k2LEXzpN60SQ1kP/F6fqaCgU/McgaYsxSf43GZ8lwtmXLke9efS+L1uGmrhtBUP4npV/QKF8s2ZQ==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.7.0.tgz", + "integrity": "sha512-RabHn9emKoYFsv99RLxvfG2GHzWk2ZI1BuVzqYtmMSIcuGboHY5uFt3Q3boOREM9de6z5s3bQoyKeWnq8Fz22w==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/engines": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.6.0.tgz", - "integrity": "sha512-nC0IV4NHh7500cozD1fBoTwTD1ydJERndreIjpZr/S3mno3P6tm8qnXmIND5SwUkibNeSJMpgl4gAnlqJ/gVlg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.7.0.tgz", + "integrity": "sha512-3wDMesnOxPrOsq++e5oKV9LmIiEazFTRFZrlULDQ8fxdub5w4NgRBoxtWbvXmj2nJVCnzuz6eFix3OhIqsZ1jw==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.6.0", - "@prisma/engines-version": "6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a", - "@prisma/fetch-engine": "6.6.0", - "@prisma/get-platform": "6.6.0" + "@prisma/debug": "6.7.0", + "@prisma/engines-version": "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed", + "@prisma/fetch-engine": "6.7.0", + "@prisma/get-platform": "6.7.0" } }, "node_modules/@prisma/engines-version": { - "version": "6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a.tgz", - "integrity": "sha512-JzRaQ5Em1fuEcbR3nUsMNYaIYrOT1iMheenjCvzZblJcjv/3JIuxXN7RCNT5i6lRkLodW5ojCGhR7n5yvnNKrw==", + "version": "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed.tgz", + "integrity": "sha512-EvpOFEWf1KkJpDsBCrih0kg3HdHuaCnXmMn7XFPObpFTzagK1N0Q0FMnYPsEhvARfANP5Ok11QyoTIRA2hgJTA==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/fetch-engine": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.6.0.tgz", - "integrity": "sha512-Ohfo8gKp05LFLZaBlPUApM0M7k43a0jmo86YY35u1/4t+vuQH9mRGU7jGwVzGFY3v+9edeb/cowb1oG4buM1yw==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.7.0.tgz", + "integrity": "sha512-zLlAGnrkmioPKJR4Yf7NfW3hftcvqeNNEHleMZK9yX7RZSkhmxacAYyfGsCcqRt47jiZ7RKdgE0Wh2fWnm7WsQ==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.6.0", - "@prisma/engines-version": "6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a", - "@prisma/get-platform": "6.6.0" + "@prisma/debug": "6.7.0", + "@prisma/engines-version": "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed", + "@prisma/get-platform": "6.7.0" } }, "node_modules/@prisma/get-platform": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.6.0.tgz", - "integrity": "sha512-3qCwmnT4Jh5WCGUrkWcc6VZaw0JY7eWN175/pcb5Z6FiLZZ3ygY93UX0WuV41bG51a6JN/oBH0uywJ90Y+V5eA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.7.0.tgz", + "integrity": "sha512-i9IH5lO4fQwnMLvQLYNdgVh9TK3PuWBfQd7QLk/YurnAIg+VeADcZDbmhAi4XBBDD+hDif9hrKyASu0hbjwabw==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.6.0" + "@prisma/debug": "6.7.0" } }, "node_modules/@redis/bloom": { @@ -28457,15 +28457,15 @@ } }, "node_modules/prisma": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.6.0.tgz", - "integrity": "sha512-SYCUykz+1cnl6Ugd8VUvtTQq5+j1Q7C0CtzKPjQ8JyA2ALh0EEJkMCS+KgdnvKW1lrxjtjCyJSHOOT236mENYg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.7.0.tgz", + "integrity": "sha512-vArg+4UqnQ13CVhc2WUosemwh6hr6cr6FY2uzDvCIFwH8pu8BXVv38PktoMLVjtX7sbYThxbnZF5YiR8sN2clw==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/config": "6.6.0", - "@prisma/engines": "6.6.0" + "@prisma/config": "6.7.0", + "@prisma/engines": "6.7.0" }, "bin": { "prisma": "build/index.js" diff --git a/package.json b/package.json index f591c9333..161aa5395 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "@nestjs/platform-express": "10.4.15", "@nestjs/schedule": "4.1.2", "@nestjs/serve-static": "4.0.2", - "@prisma/client": "6.6.0", + "@prisma/client": "6.7.0", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", "@stripe/stripe-js": "5.4.0", @@ -196,7 +196,7 @@ "nx": "20.8.1", "prettier": "3.5.3", "prettier-plugin-organize-attributes": "1.0.0", - "prisma": "6.6.0", + "prisma": "6.7.0", "react": "18.2.0", "react-dom": "18.2.0", "replace-in-file": "8.3.0", From 620ae023d9ac8c1f3450c8f4285a373b6b57a130 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 4 May 2025 11:17:15 +0200 Subject: [PATCH 4/8] Feature/move watchlist to general availability (#4653) * Add watchlist to features page * Move watchlist to general availability * Update changelog --- CHANGELOG.md | 5 +++ .../src/app/pages/features/features-page.html | 45 +++++++++++++------ .../src/app/pages/home/home-page.component.ts | 12 ++--- 3 files changed, 42 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea0e682f8..a124432f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- Added the watchlist to the features page + ### Changed +- Moved the watchlist from experimental to general availability - Deprecated the endpoint to get a portfolio position in favor of get a holding - Deprecated the endpoint to update portfolio position tags in favor of update holding tags - Upgraded `prisma` from version `6.6.0` to `6.7.0` diff --git a/apps/client/src/app/pages/features/features-page.html b/apps/client/src/app/pages/features/features-page.html index aa2ae3725..30b1af29c 100644 --- a/apps/client/src/app/pages/features/features-page.html +++ b/apps/client/src/app/pages/features/features-page.html @@ -175,10 +175,15 @@
-

Dark Mode

+

+ Static Analysis + @if (hasPermissionForSubscription) { + + } +

- Ghostfolio automatically switches to a dark color theme based - on your operating system's preferences. + Identify potential risks in your portfolio with Ghostfolio + X-ray, the static portfolio analysis.

@@ -188,10 +193,14 @@
-

Zen Mode

+

+ Watchlist + @if (hasPermissionForSubscription) { + + } +

- Keep calm and activate Zen Mode if the markets are going - crazy. + Follow assets you are interested in closely on your watchlist.

@@ -221,15 +230,23 @@
-

- Static Analysis - @if (hasPermissionForSubscription) { - - } -

+

Dark Mode

- Identify potential risks in your portfolio with Ghostfolio - X-ray, the static portfolio analysis. + Ghostfolio automatically switches to a dark color theme based + on your operating system's preferences. +

+
+
+
+ +
+ + +
+

Zen Mode

+

+ Keep calm and activate Zen Mode if the markets are going + crazy.

diff --git a/apps/client/src/app/pages/home/home-page.component.ts b/apps/client/src/app/pages/home/home-page.component.ts index 928ad2931..ec49143a8 100644 --- a/apps/client/src/app/pages/home/home-page.component.ts +++ b/apps/client/src/app/pages/home/home-page.component.ts @@ -48,18 +48,18 @@ export class HomePageComponent implements OnDestroy, OnInit { label: $localize`Summary`, path: ['/home', 'summary'] }, + { + iconName: 'bookmark-outline', + label: $localize`Watchlist`, + path: ['/home', 'watchlist'] + }, { iconName: 'newspaper-outline', label: $localize`Markets`, path: ['/home', 'market'] - }, - { - iconName: 'bookmark-outline', - label: $localize`Watchlist`, - path: ['/home', 'watchlist'], - showCondition: this.user?.settings?.isExperimentalFeatures } ]; + this.user = state.user; this.changeDetectorRef.markForCheck(); From b93671c74006de66c8a3b227228fcf33a00204a8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 4 May 2025 12:03:30 +0200 Subject: [PATCH 5/8] Feature/update locales (#4654) Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.ca.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.de.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.es.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.fr.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.it.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.nl.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.pl.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.pt.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.tr.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.uk.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.xlf | 24 ++++++++++++++---------- apps/client/src/locales/messages.zh.xlf | 24 ++++++++++++++---------- 12 files changed, 168 insertions(+), 120 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 5dd6bfbd2..0896d6b03 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -354,7 +354,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -3491,7 +3491,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -4035,7 +4035,7 @@ Dark Mode apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -4043,7 +4043,7 @@ Market Mood apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -4051,7 +4051,7 @@ Static Analysis apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -4059,7 +4059,7 @@ Multi-Language apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -4067,7 +4067,7 @@ Open Source Software apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -4075,7 +4075,7 @@ Get Started apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -4123,7 +4123,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -7944,6 +7944,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7954,7 +7958,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 00ad01434..428e12436 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -1002,7 +1002,7 @@ Registrieren apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -1766,7 +1766,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -1994,7 +1994,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -3238,7 +3238,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -4278,7 +4278,7 @@ Dark Mode apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -4286,7 +4286,7 @@ Marktstimmung apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -4294,7 +4294,7 @@ Statische Analyse apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -4302,7 +4302,7 @@ Mehrsprachigkeit apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -4310,7 +4310,7 @@ Open Source Software apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -7944,6 +7944,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7954,7 +7958,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 46bd07d47..0969f6e09 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -987,7 +987,7 @@ Empezar apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -1751,7 +1751,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -1979,7 +1979,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -3223,7 +3223,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -4255,7 +4255,7 @@ Dark Mode apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -4263,7 +4263,7 @@ Market Mood apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -4271,7 +4271,7 @@ Static Analysis apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -4279,7 +4279,7 @@ Multi-Language apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -4287,7 +4287,7 @@ Open Source Software apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -7945,6 +7945,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7955,7 +7959,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index e554ce9ff..1ec966c7c 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -2034,7 +2034,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -2098,7 +2098,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -2398,7 +2398,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -2866,7 +2866,7 @@ Démarrer apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -4254,7 +4254,7 @@ Mode Sombre apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -4262,7 +4262,7 @@ Sentiment du Marché apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -4270,7 +4270,7 @@ Analyse statique apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -4278,7 +4278,7 @@ Multi-Langue apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -4286,7 +4286,7 @@ Logiciel Open Source apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -7944,6 +7944,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7954,7 +7958,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index cbc8d5792..ca395c91d 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -987,7 +987,7 @@ Inizia apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -1751,7 +1751,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -1979,7 +1979,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -3223,7 +3223,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -4255,7 +4255,7 @@ Modalità scura apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -4263,7 +4263,7 @@ Umore del mercato apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -4271,7 +4271,7 @@ Analisi statica apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -4279,7 +4279,7 @@ Multilingue apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -4287,7 +4287,7 @@ Software open source apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -7945,6 +7945,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7955,7 +7959,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index d53e7845c..c97acc600 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -986,7 +986,7 @@ Aan de slag apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -1750,7 +1750,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -1978,7 +1978,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -3222,7 +3222,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -4254,7 +4254,7 @@ Dark Mode apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -4262,7 +4262,7 @@ Marktsentiment apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -4270,7 +4270,7 @@ Statische Analyse apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -4278,7 +4278,7 @@ Meerdere talen apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -4286,7 +4286,7 @@ Open Source Software apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -7944,6 +7944,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7954,7 +7958,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 85ef03d3a..5ed3b1d1d 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -787,7 +787,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -3195,7 +3195,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -3663,7 +3663,7 @@ Ciemny motyw apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -3671,7 +3671,7 @@ Nastrój rynku apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -3679,7 +3679,7 @@ Analiza statyczna apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -3687,7 +3687,7 @@ Wielo-językowość apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -3695,7 +3695,7 @@ Oprogramowanie Open Source apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -3703,7 +3703,7 @@ Rozpocznij apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -3751,7 +3751,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -7944,6 +7944,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7954,7 +7958,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index d270243db..d32e34e0a 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -2010,7 +2010,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -2310,7 +2310,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -2762,7 +2762,7 @@ Começar apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -3266,7 +3266,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -4254,7 +4254,7 @@ Modo escuro apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -4262,7 +4262,7 @@ Humor do mercado apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -4270,7 +4270,7 @@ Análise estática apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -4278,7 +4278,7 @@ Multilíngua apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -4286,7 +4286,7 @@ Software de código aberto apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -7944,6 +7944,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7954,7 +7958,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 9ec4a5836..cb37e4f18 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -759,7 +759,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -3207,7 +3207,7 @@ Karanlık Mod apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -3219,7 +3219,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -3227,7 +3227,7 @@ Piyasa Modu apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -3235,7 +3235,7 @@ Statik Analiz apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -3243,7 +3243,7 @@ Çoklu Dil apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -3251,7 +3251,7 @@ Açık Kaynak Yazılım apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -3259,7 +3259,7 @@ Başla apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -3307,7 +3307,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -7944,6 +7944,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7954,7 +7958,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 17a42efbf..02ec03d84 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -354,7 +354,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -3715,7 +3715,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -4251,7 +4251,7 @@ Темний режим apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -4259,7 +4259,7 @@ Ринковий настрій apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -4267,7 +4267,7 @@ Статичний аналіз apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -4275,7 +4275,7 @@ Багатомовність apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -4283,7 +4283,7 @@ Програмне забезпечення з відкритим кодом apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -4291,7 +4291,7 @@ Почати apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -4339,7 +4339,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -7944,6 +7944,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7954,7 +7958,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 5a96dd108..40e054665 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -765,7 +765,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -2995,7 +2995,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -3416,42 +3416,42 @@ Dark Mode apps/client/src/app/pages/features/features-page.html - 178 + 233 Market Mood apps/client/src/app/pages/features/features-page.html - 206 + 215 Static Analysis apps/client/src/app/pages/features/features-page.html - 225 + 179 Multi-Language apps/client/src/app/pages/features/features-page.html - 242 + 259 Open Source Software apps/client/src/app/pages/features/features-page.html - 279 + 296 Get Started apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -3496,7 +3496,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -7186,7 +7186,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 @@ -7195,6 +7195,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Get Early Access diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 385b4aefd..9ba7a63b4 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -788,7 +788,7 @@ apps/client/src/app/pages/features/features-page.html - 260 + 277 @@ -3204,7 +3204,7 @@ apps/client/src/app/pages/features/features-page.html - 191 + 246 @@ -3672,7 +3672,7 @@ 深色模式 apps/client/src/app/pages/features/features-page.html - 178 + 233 @@ -3680,7 +3680,7 @@ 市场情绪 apps/client/src/app/pages/features/features-page.html - 206 + 215 @@ -3688,7 +3688,7 @@ 静态分析 apps/client/src/app/pages/features/features-page.html - 225 + 179 @@ -3696,7 +3696,7 @@ 多语言 apps/client/src/app/pages/features/features-page.html - 242 + 259 @@ -3704,7 +3704,7 @@ 开源软件 apps/client/src/app/pages/features/features-page.html - 279 + 296 @@ -3712,7 +3712,7 @@ 立即开始 apps/client/src/app/pages/features/features-page.html - 304 + 321 apps/client/src/app/pages/public/public-page.html @@ -3760,7 +3760,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 53 + 58 apps/client/src/app/pages/markets/markets-page-routing.module.ts @@ -7945,6 +7945,10 @@ apps/client/src/app/components/home-watchlist/home-watchlist.html 4 + + apps/client/src/app/pages/features/features-page.html + 197 + Watchlist @@ -7955,7 +7959,7 @@ apps/client/src/app/pages/home/home-page.component.ts - 58 + 53 From ecffb53f07ecc3feed23be2e31be63c061fb6f4c Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 4 May 2025 15:54:54 +0200 Subject: [PATCH 6/8] Feature/extend faq pages (#4655) * Extend FAQ pages * Update changelog --- CHANGELOG.md | 1 + .../overview/faq-overview-page.component.ts | 3 + .../pages/faq/overview/faq-overview-page.html | 24 ++++++-- .../faq/overview/faq-overview-page.module.ts | 9 ++- .../app/pages/faq/saas/saas-page.component.ts | 4 +- .../src/app/pages/faq/saas/saas-page.html | 59 +++++++++++++------ .../app/pages/faq/saas/saas-page.module.ts | 9 ++- .../self-hosting-page.component.ts | 4 ++ .../faq/self-hosting/self-hosting-page.html | 19 ++++++ .../self-hosting/self-hosting-page.module.ts | 9 ++- 10 files changed, 113 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a124432f3..3fb6bfeba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Added the watchlist to the features page +- Extended the content of the Frequently Asked Questions (FAQ) pages ### Changed diff --git a/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts b/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts index 9232ca3bd..ddafa5730 100644 --- a/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts +++ b/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts @@ -12,6 +12,9 @@ import { Subject, takeUntil } from 'rxjs'; standalone: false }) export class FaqOverviewPageComponent implements OnDestroy { + public pricingUrl = + `https://ghostfol.io/${document.documentElement.lang}/` + + $localize`:snake-case:pricing`; public routerLinkFeatures = ['/' + $localize`:snake-case:features`]; public user: User; diff --git a/apps/client/src/app/pages/faq/overview/faq-overview-page.html b/apps/client/src/app/pages/faq/overview/faq-overview-page.html index fea3bba55..f8fd62eb0 100644 --- a/apps/client/src/app/pages/faq/overview/faq-overview-page.html +++ b/apps/client/src/app/pages/faq/overview/faq-overview-page.html @@ -59,9 +59,14 @@ world. The source code is fully available as open source software (OSS). Thanks to our generous - Ghostfolio Premium users - and sponsors we - have the ability to run a free, limited plan for novice + Ghostfolio Premium + users and + sponsors we have + the ability to run a free, limited plan for novice investors.
@@ -82,8 +87,11 @@ By offering - Ghostfolio Premium, a - subscription plan with a managed hosting service and enhanced + Ghostfolio Premium, a subscription plan with a managed hosting service and enhanced features, we fund our business while providing added value to our users. @@ -105,7 +113,11 @@ Any support for Ghostfolio is welcome. Be it with a - Ghostfolio Premium + Ghostfolio Premium subscription to finance the hosting infrastructure, a positive rating in the How do I start? - You can sign up via the “Get Started” button at the top of the page. You have multiple options to join - Ghostfolio: Create an account with a security token or - Google Sign. We will guide you to set up your portfolio. + You can sign up via the + Get Started button at the top + of the page. You have multiple options to join Ghostfolio: Create an + account with a security token or Google Sign. We will guide you + to set up your portfolio. @@ -38,8 +38,8 @@ > Yes, it is! Our - pricing page details - everything you get for free.pricing page + details everything you get for free. @@ -49,12 +49,20 @@ > Ghostfolio Premium is a fully - managed Ghostfolio cloud offering for ambitious investors. Revenue is - used to cover the costs of the hosting infrastructure and to fund - ongoing development. It is the Open Source code base with some extras - like the markets overview and - a professional data provider.Ghostfolio Premium + is a fully managed Ghostfolio cloud offering for ambitious investors. + Revenue is used to cover the costs of the hosting infrastructure and + to fund ongoing development. It is the Open Source code base with some + extras like the + markets overview and a + professional data provider. @@ -65,8 +73,15 @@ > Yes, you can try - Ghostfolio Premium by signing - up for Ghostfolio and applying for a trial (see + Ghostfolio Premium + by signing up for Ghostfolio and applying for a trial (see Membership). It is easy, free and there is no commitment. You can stop using it at any time. No, Ghostfolio Premium does - not include auto-renewal. Upon expiration, you can choose whether to - start a new subscription.No, + Ghostfolio Premium + does not include auto-renewal. Upon expiration, you can choose whether + to start a new subscription. @if (user?.subscription?.type === 'Premium') { diff --git a/apps/client/src/app/pages/faq/saas/saas-page.module.ts b/apps/client/src/app/pages/faq/saas/saas-page.module.ts index 4ddcf9d24..81cd2b524 100644 --- a/apps/client/src/app/pages/faq/saas/saas-page.module.ts +++ b/apps/client/src/app/pages/faq/saas/saas-page.module.ts @@ -1,3 +1,5 @@ +import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatCardModule } from '@angular/material/card'; @@ -7,7 +9,12 @@ import { SaasPageComponent } from './saas-page.component'; @NgModule({ declarations: [SaasPageComponent], - imports: [CommonModule, MatCardModule, SaasPageRoutingModule], + imports: [ + CommonModule, + GfPremiumIndicatorComponent, + MatCardModule, + SaasPageRoutingModule + ], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) export class SaasPageModule {} diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts index 387187be0..f0ff7dbc3 100644 --- a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts +++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts @@ -9,6 +9,10 @@ import { Subject } from 'rxjs'; standalone: false }) export class SelfHostingPageComponent implements OnDestroy { + public pricingUrl = + `https://ghostfol.io/${document.documentElement.lang}/` + + $localize`:snake-case:pricing`; + private unsubscribeSubject = new Subject(); public ngOnDestroy() { diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html index dcb48aa54..a30854156 100644 --- a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html +++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html @@ -140,6 +140,25 @@ providers are considered experimental. + + + Can I get access to a professional data provider? + + Yes, access to a professional data provider is included with a + Ghostfolio Premium + subscription via an API key. + How do I set up a benchmark? diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.module.ts b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.module.ts index 65f9969a3..931f24aa6 100644 --- a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.module.ts +++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.module.ts @@ -1,3 +1,5 @@ +import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; + import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatCardModule } from '@angular/material/card'; @@ -7,7 +9,12 @@ import { SelfHostingPageComponent } from './self-hosting-page.component'; @NgModule({ declarations: [SelfHostingPageComponent], - imports: [CommonModule, MatCardModule, SelfHostingPageRoutingModule], + imports: [ + CommonModule, + GfPremiumIndicatorComponent, + MatCardModule, + SelfHostingPageRoutingModule + ], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) export class SelfHostingPageModule {} From d661cdc78fbc01729deaf8b48c27fe939a02de15 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 4 May 2025 15:55:31 +0200 Subject: [PATCH 7/8] Feature/rename account to accounts in platform database schema (#4656) * Rename Account to accounts in platform database schema * Update changelog --- CHANGELOG.md | 1 + apps/api/src/app/platform/platform.service.ts | 4 ++-- prisma/schema.prisma | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fb6bfeba..0f59ee6dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Moved the watchlist from experimental to general availability - Deprecated the endpoint to get a portfolio position in favor of get a holding - Deprecated the endpoint to update portfolio position tags in favor of update holding tags +- Renamed `Account` to `accounts` in the `Platform` database schema - Upgraded `prisma` from version `6.6.0` to `6.7.0` ## 2.159.0 - 2025-05-02 diff --git a/apps/api/src/app/platform/platform.service.ts b/apps/api/src/app/platform/platform.service.ts index db827569d..200b4de00 100644 --- a/apps/api/src/app/platform/platform.service.ts +++ b/apps/api/src/app/platform/platform.service.ts @@ -54,7 +54,7 @@ export class PlatformService { await this.prismaService.platform.findMany({ include: { _count: { - select: { Account: true } + select: { accounts: true } } } }); @@ -64,7 +64,7 @@ export class PlatformService { id, name, url, - accountCount: _count.Account + accountCount: _count.accounts }; }); } diff --git a/prisma/schema.prisma b/prisma/schema.prisma index c33f7d6cc..863c196ac 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -147,10 +147,10 @@ model Order { } model Platform { - id String @id @default(uuid()) - name String? - url String @unique - Account Account[] + accounts Account[] + id String @id @default(uuid()) + name String? + url String @unique @@index([name]) } From 5b6447b60d81abbece874bcb21770a3b397afd99 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 4 May 2025 15:58:24 +0200 Subject: [PATCH 8/8] Feature/update locales (#4658) Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.ca.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.de.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.es.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.fr.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.it.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.nl.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.pl.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.pt.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.tr.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.uk.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.xlf | 16 ++++++++++++---- apps/client/src/locales/messages.zh.xlf | 16 ++++++++++++---- 12 files changed, 144 insertions(+), 48 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 0896d6b03..305fa508a 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -591,7 +591,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -632,7 +632,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -711,9 +711,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -746,7 +754,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 428e12436..47c1a1340 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -5256,7 +5256,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -5432,7 +5432,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -5511,9 +5511,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -5546,7 +5554,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 0969f6e09..8541df0bc 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -5233,7 +5233,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -5409,7 +5409,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -5488,9 +5488,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -5523,7 +5531,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 1ec966c7c..165a03292 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -5232,7 +5232,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -5408,7 +5408,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -5487,9 +5487,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -5522,7 +5530,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index ca395c91d..d1b32c6ce 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -5233,7 +5233,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -5409,7 +5409,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -5488,9 +5488,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -5523,7 +5531,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index c97acc600..378f1a42e 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -5232,7 +5232,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -5408,7 +5408,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -5487,9 +5487,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -5522,7 +5530,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 5ed3b1d1d..714c83bdb 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -193,7 +193,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -251,7 +251,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -330,9 +330,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -382,7 +390,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index d32e34e0a..4a9ec251c 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -5232,7 +5232,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -5408,7 +5408,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -5487,9 +5487,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -5522,7 +5530,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index cb37e4f18..717fe544a 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -193,7 +193,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -251,7 +251,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -330,9 +330,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -382,7 +390,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 02ec03d84..7945267a0 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -591,7 +591,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -632,7 +632,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -711,9 +711,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -746,7 +754,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 40e054665..33d3e2f0c 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -191,7 +191,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -247,7 +247,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -325,9 +325,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -375,7 +383,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 9ba7a63b4..2853b6138 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -194,7 +194,7 @@ apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts - 15 + 18 apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -252,7 +252,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 15 + 18 apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -331,9 +331,17 @@ apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts 15 + + apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts + 17 + apps/client/src/app/pages/faq/saas/saas-page.component.ts - 16 + 17 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts + 14 libs/ui/src/lib/membership-card/membership-card.component.ts @@ -383,7 +391,7 @@ apps/client/src/app/pages/faq/saas/saas-page.component.ts - 17 + 19 apps/client/src/app/pages/features/features-page.component.ts