diff --git a/CHANGELOG.md b/CHANGELOG.md index 3834e1cc4..645c324e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- Added support for multiple subscription offers + ### Changed - Improved the portfolio evolution chart (ignore first item) diff --git a/apps/api/src/app/info/info.service.ts b/apps/api/src/app/info/info.service.ts index 19647a8b8..6c4d37047 100644 --- a/apps/api/src/app/info/info.service.ts +++ b/apps/api/src/app/info/info.service.ts @@ -22,6 +22,7 @@ import { InfoItem } from '@ghostfolio/common/interfaces'; import { Statistics } from '@ghostfolio/common/interfaces/statistics.interface'; import { Subscription } from '@ghostfolio/common/interfaces/subscription.interface'; 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'; @@ -304,19 +305,17 @@ export class InfoService { return statistics; } - private async getSubscriptions(): Promise { + private async getSubscriptions(): Promise<{ + [offer in SubscriptionOffer]: Subscription; + }> { if (!this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { return undefined; } - let subscriptions: Subscription[] = []; - const stripeConfig = (await this.prismaService.property.findUnique({ where: { key: PROPERTY_STRIPE_CONFIG } })) ?? { value: '{}' }; - subscriptions = [JSON.parse(stripeConfig.value)]; - - return subscriptions; + return JSON.parse(stripeConfig.value); } } diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 1677ffc29..4e8813630 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -37,8 +37,7 @@ import { PortfolioSummary, Position, TimelinePosition, - UserSettings, - UserWithSettings + UserSettings } from '@ghostfolio/common/interfaces'; import { InvestmentItem } from '@ghostfolio/common/interfaces/investment-item.interface'; import type { @@ -47,7 +46,8 @@ import type { GroupBy, Market, OrderWithAccount, - RequestWithUser + RequestWithUser, + UserWithSettings } from '@ghostfolio/common/types'; import { Inject, Injectable } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; diff --git a/apps/api/src/app/subscription/subscription.service.ts b/apps/api/src/app/subscription/subscription.service.ts index 71d12627b..b339538fc 100644 --- a/apps/api/src/app/subscription/subscription.service.ts +++ b/apps/api/src/app/subscription/subscription.service.ts @@ -4,9 +4,9 @@ import { DEFAULT_LANGUAGE_CODE, PROPERTY_STRIPE_CONFIG } from '@ghostfolio/common/config'; -import { UserWithSettings } from '@ghostfolio/common/interfaces'; import { Subscription as SubscriptionInterface } from '@ghostfolio/common/interfaces/subscription.interface'; -import { SubscriptionType } from '@ghostfolio/common/types/subscription.type'; +import { UserWithSettings } from '@ghostfolio/common/types'; +import { SubscriptionType } from '@ghostfolio/common/types/subscription-type.type'; import { Injectable, Logger } from '@nestjs/common'; import { Subscription } from '@prisma/client'; import { addMilliseconds, isBefore } from 'date-fns'; @@ -123,7 +123,9 @@ export class SubscriptionService { } } - public getSubscription(aSubscriptions: Subscription[]) { + public getSubscription( + aSubscriptions: Subscription[] + ): UserWithSettings['subscription'] { if (aSubscriptions.length > 0) { const latestSubscription = aSubscriptions.reduce((a, b) => { return new Date(a.expiresAt) > new Date(b.expiresAt) ? a : b; @@ -131,12 +133,14 @@ export class SubscriptionService { return { expiresAt: latestSubscription.expiresAt, + offer: latestSubscription.price === 0 ? 'default' : 'renewal', type: isBefore(new Date(), latestSubscription.expiresAt) ? SubscriptionType.Premium : SubscriptionType.Basic }; } else { return { + offer: 'default', type: SubscriptionType.Basic }; } diff --git a/apps/api/src/app/symbol/symbol.service.ts b/apps/api/src/app/symbol/symbol.service.ts index 718387b3b..066752388 100644 --- a/apps/api/src/app/symbol/symbol.service.ts +++ b/apps/api/src/app/symbol/symbol.service.ts @@ -5,10 +5,8 @@ import { } from '@ghostfolio/api/services/interfaces/interfaces'; import { MarketDataService } from '@ghostfolio/api/services/market-data.service'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; -import { - HistoricalDataItem, - UserWithSettings -} from '@ghostfolio/common/interfaces'; +import { HistoricalDataItem } from '@ghostfolio/common/interfaces'; +import { UserWithSettings } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; import { format, subDays } from 'date-fns'; diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index 1630a74aa..420fa0874 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -4,16 +4,13 @@ import { PrismaService } from '@ghostfolio/api/services/prisma.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { TagService } from '@ghostfolio/api/services/tag/tag.service'; import { PROPERTY_IS_READ_ONLY_MODE, locale } from '@ghostfolio/common/config'; -import { - User as IUser, - UserSettings, - UserWithSettings -} from '@ghostfolio/common/interfaces'; +import { User as IUser, UserSettings } from '@ghostfolio/common/interfaces'; import { getPermissions, hasRole, permissions } from '@ghostfolio/common/permissions'; +import { UserWithSettings } from '@ghostfolio/common/types'; import { Injectable } from '@nestjs/common'; import { Prisma, Role, User } from '@prisma/client'; import { sortBy } from 'lodash'; 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 ad8929eee..39bb2e19b 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -8,7 +8,7 @@ import { } from '@ghostfolio/api/services/interfaces/interfaces'; import { PrismaService } from '@ghostfolio/api/services/prisma.service'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; -import { UserWithSettings } from '@ghostfolio/common/interfaces'; +import { UserWithSettings } from '@ghostfolio/common/types'; import { Granularity } from '@ghostfolio/common/types'; import { Inject, Injectable, Logger } from '@nestjs/common'; import { DataSource, MarketData, SymbolProfile } from '@prisma/client'; diff --git a/apps/client/src/app/pages/account/account-page.component.ts b/apps/client/src/app/pages/account/account-page.component.ts index 56e43c755..eacbe4c36 100644 --- a/apps/client/src/app/pages/account/account-page.component.ts +++ b/apps/client/src/app/pages/account/account-page.component.ts @@ -91,8 +91,6 @@ export class AccountPageComponent implements OnDestroy, OnInit { this.dataService.fetchInfo(); this.baseCurrency = baseCurrency; - this.coupon = subscriptions?.[0]?.coupon; - this.couponId = subscriptions?.[0]?.couponId; this.currencies = currencies; this.hasPermissionForSubscription = hasPermission( @@ -105,9 +103,6 @@ export class AccountPageComponent implements OnDestroy, OnInit { permissions.deleteAccess ); - this.price = subscriptions?.[0]?.price; - this.priceId = subscriptions?.[0]?.priceId; - this.userService.stateChanged .pipe(takeUntil(this.unsubscribeSubject)) .subscribe((state) => { @@ -141,6 +136,12 @@ export class AccountPageComponent implements OnDestroy, OnInit { this.locales.push(this.user.settings.locale); this.locales = uniq(this.locales.sort()); + this.coupon = subscriptions?.[this.user.subscription.offer]?.coupon; + this.couponId = + subscriptions?.[this.user.subscription.offer]?.couponId; + this.price = subscriptions?.[this.user.subscription.offer]?.price; + this.priceId = subscriptions?.[this.user.subscription.offer]?.priceId; + this.changeDetectorRef.markForCheck(); } }); diff --git a/apps/client/src/app/pages/account/account-page.html b/apps/client/src/app/pages/account/account-page.html index 749a3d7be..e049a8428 100644 --- a/apps/client/src/app/pages/account/account-page.html +++ b/apps/client/src/app/pages/account/account-page.html @@ -34,7 +34,16 @@ mat-flat-button (click)="onCheckout(priceId)" > - Upgrade + Upgrade + Renew
{ if (state?.user) { this.user = state.user; + this.coupon = subscriptions?.[this.user?.subscription?.offer]?.coupon; + this.price = subscriptions?.[this.user?.subscription?.offer]?.price; + this.changeDetectorRef.markForCheck(); } }); diff --git a/apps/client/src/app/pages/pricing/pricing-page.html b/apps/client/src/app/pages/pricing/pricing-page.html index bc9e707cc..293f1d568 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.html +++ b/apps/client/src/app/pages/pricing/pricing-page.html @@ -324,13 +324,13 @@ *ngIf="user?.subscription?.type === 'Basic'" class="mt-3 text-center" > - - Upgrade Plan + + Upgrade Plan + Renew Plan

One-time payment, no auto-renewal. diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index ea0ecaadc..187b8a246 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -390,7 +390,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 115 + 116 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1262,7 +1262,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 113 + 114 @@ -1382,7 +1382,7 @@ Bitte gebe deinen Gutscheincode ein: apps/client/src/app/pages/account/account-page.component.ts - 236 + 237 @@ -1390,7 +1390,7 @@ Gutscheincode konnte nicht eingelöst werden apps/client/src/app/pages/account/account-page.component.ts - 246 + 247 @@ -1398,7 +1398,7 @@ Gutscheincode wurde eingelöst apps/client/src/app/pages/account/account-page.component.ts - 258 + 259 @@ -1406,7 +1406,7 @@ Neu laden apps/client/src/app/pages/account/account-page.component.ts - 259 + 260 @@ -1414,7 +1414,7 @@ Möchtest du diese Anmeldemethode wirklich löschen? apps/client/src/app/pages/account/account-page.component.ts - 305 + 306 @@ -1446,7 +1446,7 @@ Upgrade apps/client/src/app/pages/account/account-page.html - 37 + 40 @@ -1454,7 +1454,7 @@ pro Jahr apps/client/src/app/pages/account/account-page.html - 48 + 57 @@ -1462,7 +1462,7 @@ Premium ausprobieren apps/client/src/app/pages/account/account-page.html - 56 + 65 @@ -1470,7 +1470,7 @@ Gutschein einlösen apps/client/src/app/pages/account/account-page.html - 68 + 77 @@ -1478,7 +1478,7 @@ Präsentationsansicht apps/client/src/app/pages/account/account-page.html - 75 + 84 @@ -1486,7 +1486,7 @@ Basiswährung apps/client/src/app/pages/account/account-page.html - 94 + 103 @@ -1494,7 +1494,7 @@ Lokalität apps/client/src/app/pages/account/account-page.html - 160 + 169 @@ -1502,7 +1502,7 @@ Datums- und Zahlenformat apps/client/src/app/pages/account/account-page.html - 162 + 171 @@ -1510,7 +1510,7 @@ Zen Modus apps/client/src/app/pages/account/account-page.html - 214 + 223 @@ -1518,7 +1518,7 @@ Einloggen mit Fingerabdruck apps/client/src/app/pages/account/account-page.html - 229 + 238 @@ -1526,7 +1526,7 @@ Benutzer ID apps/client/src/app/pages/account/account-page.html - 259 + 268 @@ -1534,7 +1534,7 @@ Zugangsberechtigung apps/client/src/app/pages/account/account-page.html - 268 + 277 @@ -2018,7 +2018,7 @@ Daten importieren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 95 @@ -2026,7 +2026,7 @@ Der Import wurde abgeschlossen apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 102 + 103 @@ -2266,7 +2266,7 @@ Sprache apps/client/src/app/pages/account/account-page.html - 118 + 127 @@ -2298,7 +2298,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 112 + 113 @@ -2310,7 +2310,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 110 + 111 @@ -2582,7 +2582,7 @@ Experimentelle Funktionen apps/client/src/app/pages/account/account-page.html - 244 + 253 @@ -2654,7 +2654,7 @@ Aussehen apps/client/src/app/pages/account/account-page.html - 188 + 197 @@ -2662,7 +2662,7 @@ Automatisch apps/client/src/app/pages/account/account-page.html - 203 + 212 @@ -2670,7 +2670,7 @@ Hell apps/client/src/app/pages/account/account-page.html - 204 + 213 @@ -2678,7 +2678,7 @@ Dunkel apps/client/src/app/pages/account/account-page.html - 205 + 214 @@ -2934,7 +2934,7 @@ Zurück apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 107 + 108 @@ -2942,19 +2942,19 @@ Community apps/client/src/app/pages/account/account-page.html - 135 + 144 apps/client/src/app/pages/account/account-page.html - 139 + 148 apps/client/src/app/pages/account/account-page.html - 143 + 152 apps/client/src/app/pages/account/account-page.html - 147 + 156 @@ -3018,7 +3018,7 @@ Daten validieren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 153 + 154 @@ -3026,7 +3026,7 @@ Importieren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 122 + 123 @@ -3166,7 +3166,7 @@ Ausblenden von sensiblen Informationen wie absoluter Performance und Stückzahl apps/client/src/app/pages/account/account-page.html - 76,79 + 85,88 @@ -3174,7 +3174,7 @@ Unbeschwertes Erlebnis für turbulente Zeiten apps/client/src/app/pages/account/account-page.html - 215,217 + 224,226 @@ -3182,7 +3182,7 @@ Vorschau auf kommende Funktionalität apps/client/src/app/pages/account/account-page.html - 245,247 + 254,256 @@ -3280,6 +3280,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 51 + + apps/client/src/app/pages/pricing/pricing-page.html + 329 + For tech-savvy investors who prefer to run Ghostfolio on their own infrastructure. @@ -3385,14 +3389,6 @@ 215,218 - - Upgrade Plan - Abonnement abschliessen - - apps/client/src/app/pages/pricing/pricing-page.html - 332,334 - - One-time payment, no auto-renewal. Einmalige Zahlung, keine automatische Erneuerung. @@ -3547,7 +3543,7 @@ Professional Data Provider - Professioneller Datenanbieter + Professioneller Datenanbieter apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 34 @@ -3573,6 +3569,22 @@ 6,10 + + Renew + Erneuern + + apps/client/src/app/pages/account/account-page.html + 45 + + + + Renew Plan + Abonnement erneuern + + apps/client/src/app/pages/pricing/pricing-page.html + 332 + + diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 689ba167d..bf9c70826 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -391,7 +391,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 115 + 116 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1263,7 +1263,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 113 + 114 @@ -1383,7 +1383,7 @@ Por favor, ingresa tu código de cupón: apps/client/src/app/pages/account/account-page.component.ts - 236 + 237 @@ -1391,7 +1391,7 @@ No se puede canjear este código de cupón apps/client/src/app/pages/account/account-page.component.ts - 246 + 247 @@ -1399,7 +1399,7 @@ El codigo de cupón ha sido canjeado apps/client/src/app/pages/account/account-page.component.ts - 258 + 259 @@ -1407,7 +1407,7 @@ Refrescar apps/client/src/app/pages/account/account-page.component.ts - 259 + 260 @@ -1415,7 +1415,7 @@ ¿Estás seguro de eliminar este método de acceso? apps/client/src/app/pages/account/account-page.component.ts - 305 + 306 @@ -1447,7 +1447,7 @@ Mejorar apps/client/src/app/pages/account/account-page.html - 37 + 40 @@ -1455,7 +1455,7 @@ por año apps/client/src/app/pages/account/account-page.html - 48 + 57 @@ -1463,7 +1463,7 @@ Prueba Premium apps/client/src/app/pages/account/account-page.html - 56 + 65 @@ -1471,7 +1471,7 @@ Canjea el cupón apps/client/src/app/pages/account/account-page.html - 68 + 77 @@ -1479,7 +1479,7 @@ Vista del presentador apps/client/src/app/pages/account/account-page.html - 75 + 84 @@ -1487,7 +1487,7 @@ Divisa base apps/client/src/app/pages/account/account-page.html - 94 + 103 @@ -1495,7 +1495,7 @@ Ubicación apps/client/src/app/pages/account/account-page.html - 160 + 169 @@ -1503,7 +1503,7 @@ Formato de fecha y número apps/client/src/app/pages/account/account-page.html - 162 + 171 @@ -1511,7 +1511,7 @@ Modo Zen apps/client/src/app/pages/account/account-page.html - 214 + 223 @@ -1519,7 +1519,7 @@ Accede con huella digital apps/client/src/app/pages/account/account-page.html - 229 + 238 @@ -1527,7 +1527,7 @@ ID usuario apps/client/src/app/pages/account/account-page.html - 259 + 268 @@ -1535,7 +1535,7 @@ Acceso concedido apps/client/src/app/pages/account/account-page.html - 268 + 277 @@ -2019,7 +2019,7 @@ Importando datos... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 95 @@ -2027,7 +2027,7 @@ La importación se ha completado apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 102 + 103 @@ -2267,7 +2267,7 @@ Idioma apps/client/src/app/pages/account/account-page.html - 118 + 127 @@ -2295,7 +2295,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 110 + 111 @@ -2311,7 +2311,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 112 + 113 @@ -2583,7 +2583,7 @@ Funcionalidades experimentales apps/client/src/app/pages/account/account-page.html - 244 + 253 @@ -2655,7 +2655,7 @@ Apariencia apps/client/src/app/pages/account/account-page.html - 188 + 197 @@ -2663,7 +2663,7 @@ Automático apps/client/src/app/pages/account/account-page.html - 203 + 212 @@ -2671,7 +2671,7 @@ Claro apps/client/src/app/pages/account/account-page.html - 204 + 213 @@ -2679,7 +2679,7 @@ Oscuro apps/client/src/app/pages/account/account-page.html - 205 + 214 @@ -2935,7 +2935,7 @@ Volver apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 107 + 108 @@ -2943,19 +2943,19 @@ Comunidad apps/client/src/app/pages/account/account-page.html - 135 + 144 apps/client/src/app/pages/account/account-page.html - 139 + 148 apps/client/src/app/pages/account/account-page.html - 143 + 152 apps/client/src/app/pages/account/account-page.html - 147 + 156 @@ -3019,7 +3019,7 @@ Validating data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 153 + 154 @@ -3027,7 +3027,7 @@ Import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 122 + 123 @@ -3167,7 +3167,7 @@ Protection for sensitive information like absolute performances and quantity values apps/client/src/app/pages/account/account-page.html - 76,79 + 85,88 @@ -3175,7 +3175,7 @@ Distraction-free experience for turbulent times apps/client/src/app/pages/account/account-page.html - 215,217 + 224,226 @@ -3183,7 +3183,7 @@ Sneak peek at upcoming functionality apps/client/src/app/pages/account/account-page.html - 245,247 + 254,256 @@ -3281,6 +3281,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 51 + + apps/client/src/app/pages/pricing/pricing-page.html + 329 + For tech-savvy investors who prefer to run Ghostfolio on their own infrastructure. @@ -3386,14 +3390,6 @@ 215,218 - - Upgrade Plan - Upgrade Plan - - apps/client/src/app/pages/pricing/pricing-page.html - 332,334 - - One-time payment, no auto-renewal. One-time payment, no auto-renewal. @@ -3574,6 +3570,22 @@ 6,10 + + Renew + Renew + + apps/client/src/app/pages/account/account-page.html + 45 + + + + Renew Plan + Renew Plan + + apps/client/src/app/pages/pricing/pricing-page.html + 332 + + diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 74fdc6905..6b668665a 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -450,7 +450,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 115 + 116 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1594,7 +1594,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 112 + 113 @@ -1606,7 +1606,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 110 + 111 @@ -1618,7 +1618,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 113 + 114 @@ -1690,7 +1690,7 @@ Veuillez entrer votre code promotionnel : apps/client/src/app/pages/account/account-page.component.ts - 236 + 237 @@ -1698,7 +1698,7 @@ Le code promotionnel n'a pas pu être appliqué apps/client/src/app/pages/account/account-page.component.ts - 246 + 247 @@ -1706,7 +1706,7 @@ Le code promotionnel a été appliqué apps/client/src/app/pages/account/account-page.component.ts - 258 + 259 @@ -1714,7 +1714,7 @@ Rafraîchir apps/client/src/app/pages/account/account-page.component.ts - 259 + 260 @@ -1722,7 +1722,7 @@ Voulez-vous vraiment supprimer cette méthode de connexion ? apps/client/src/app/pages/account/account-page.component.ts - 305 + 306 @@ -1754,7 +1754,7 @@ Mettre à niveau apps/client/src/app/pages/account/account-page.html - 37 + 40 @@ -1762,7 +1762,7 @@ par an apps/client/src/app/pages/account/account-page.html - 48 + 57 @@ -1770,7 +1770,7 @@ Essayer Premium apps/client/src/app/pages/account/account-page.html - 56 + 65 @@ -1778,7 +1778,7 @@ Utiliser un Code Promotionnel apps/client/src/app/pages/account/account-page.html - 68 + 77 @@ -1786,7 +1786,7 @@ Vue de Présentation apps/client/src/app/pages/account/account-page.html - 75 + 84 @@ -1794,7 +1794,7 @@ Devise de Base apps/client/src/app/pages/account/account-page.html - 94 + 103 @@ -1802,7 +1802,7 @@ Langue apps/client/src/app/pages/account/account-page.html - 118 + 127 @@ -1810,19 +1810,19 @@ Communauté apps/client/src/app/pages/account/account-page.html - 135 + 144 apps/client/src/app/pages/account/account-page.html - 139 + 148 apps/client/src/app/pages/account/account-page.html - 143 + 152 apps/client/src/app/pages/account/account-page.html - 147 + 156 @@ -1830,7 +1830,7 @@ Paramètres régionaux apps/client/src/app/pages/account/account-page.html - 160 + 169 @@ -1838,7 +1838,7 @@ Format de date et d'heure apps/client/src/app/pages/account/account-page.html - 162 + 171 @@ -1846,7 +1846,7 @@ Apparence apps/client/src/app/pages/account/account-page.html - 188 + 197 @@ -1854,7 +1854,7 @@ Auto apps/client/src/app/pages/account/account-page.html - 203 + 212 @@ -1862,7 +1862,7 @@ Clair apps/client/src/app/pages/account/account-page.html - 204 + 213 @@ -1870,7 +1870,7 @@ Sombre apps/client/src/app/pages/account/account-page.html - 205 + 214 @@ -1878,7 +1878,7 @@ Mode Zen apps/client/src/app/pages/account/account-page.html - 214 + 223 @@ -1886,7 +1886,7 @@ Se connecter avec empreinte apps/client/src/app/pages/account/account-page.html - 229 + 238 @@ -1894,7 +1894,7 @@ Fonctionnalités expérimentales apps/client/src/app/pages/account/account-page.html - 244 + 253 @@ -1902,7 +1902,7 @@ ID d'utilisateur apps/client/src/app/pages/account/account-page.html - 259 + 268 @@ -1910,7 +1910,7 @@ Accès donné apps/client/src/app/pages/account/account-page.html - 268 + 277 @@ -2206,7 +2206,7 @@ Import des données... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 95 @@ -2214,7 +2214,7 @@ L'import est terminé apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 102 + 103 @@ -2222,7 +2222,7 @@ Validation des données... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 153 + 154 @@ -2246,7 +2246,7 @@ Retour apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 107 + 108 @@ -2254,7 +2254,7 @@ Importer apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 122 + 123 @@ -3165,7 +3165,7 @@ Protection for sensitive information like absolute performances and quantity values apps/client/src/app/pages/account/account-page.html - 76,79 + 85,88 @@ -3173,7 +3173,7 @@ Distraction-free experience for turbulent times apps/client/src/app/pages/account/account-page.html - 215,217 + 224,226 @@ -3181,7 +3181,7 @@ Sneak peek at upcoming functionality apps/client/src/app/pages/account/account-page.html - 245,247 + 254,256 @@ -3279,6 +3279,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 51 + + apps/client/src/app/pages/pricing/pricing-page.html + 329 + For tech-savvy investors who prefer to run Ghostfolio on their own infrastructure. @@ -3384,14 +3388,6 @@ 215,218 - - Upgrade Plan - Upgrade Plan - - apps/client/src/app/pages/pricing/pricing-page.html - 332,334 - - One-time payment, no auto-renewal. One-time payment, no auto-renewal. @@ -3572,6 +3568,22 @@ 6,10 + + Renew + Renew + + apps/client/src/app/pages/account/account-page.html + 45 + + + + Renew Plan + Renew Plan + + apps/client/src/app/pages/pricing/pricing-page.html + 332 + + diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 0397bbdb7..3ee270270 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -391,7 +391,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 115 + 116 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1263,7 +1263,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 113 + 114 @@ -1383,7 +1383,7 @@ Inserisci il tuo codice del buono: apps/client/src/app/pages/account/account-page.component.ts - 236 + 237 @@ -1391,7 +1391,7 @@ Impossibile riscattare il codice del buono apps/client/src/app/pages/account/account-page.component.ts - 246 + 247 @@ -1399,7 +1399,7 @@ Il codice del buono è stato riscattato apps/client/src/app/pages/account/account-page.component.ts - 258 + 259 @@ -1407,7 +1407,7 @@ Ricarica apps/client/src/app/pages/account/account-page.component.ts - 259 + 260 @@ -1415,7 +1415,7 @@ Vuoi davvero rimuovere questo metodo di accesso? apps/client/src/app/pages/account/account-page.component.ts - 305 + 306 @@ -1447,7 +1447,7 @@ Aggiornamento apps/client/src/app/pages/account/account-page.html - 37 + 40 @@ -1455,7 +1455,7 @@ per anno apps/client/src/app/pages/account/account-page.html - 48 + 57 @@ -1463,7 +1463,7 @@ Prova Premium apps/client/src/app/pages/account/account-page.html - 56 + 65 @@ -1471,7 +1471,7 @@ Riscatta il buono apps/client/src/app/pages/account/account-page.html - 68 + 77 @@ -1479,7 +1479,7 @@ Vista presentatore apps/client/src/app/pages/account/account-page.html - 75 + 84 @@ -1487,7 +1487,7 @@ Valuta base apps/client/src/app/pages/account/account-page.html - 94 + 103 @@ -1495,7 +1495,7 @@ Locale apps/client/src/app/pages/account/account-page.html - 160 + 169 @@ -1503,7 +1503,7 @@ Formato data e numero apps/client/src/app/pages/account/account-page.html - 162 + 171 @@ -1511,7 +1511,7 @@ Modalità Zen apps/client/src/app/pages/account/account-page.html - 214 + 223 @@ -1519,7 +1519,7 @@ Accesso con impronta digitale apps/client/src/app/pages/account/account-page.html - 229 + 238 @@ -1527,7 +1527,7 @@ ID utente apps/client/src/app/pages/account/account-page.html - 259 + 268 @@ -1535,7 +1535,7 @@ Accesso concesso apps/client/src/app/pages/account/account-page.html - 268 + 277 @@ -2019,7 +2019,7 @@ Importazione dei dati... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 95 @@ -2027,7 +2027,7 @@ L'importazione è stata completata apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 102 + 103 @@ -2267,7 +2267,7 @@ Lingua apps/client/src/app/pages/account/account-page.html - 118 + 127 @@ -2295,7 +2295,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 110 + 111 @@ -2311,7 +2311,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 112 + 113 @@ -2583,7 +2583,7 @@ Funzionalità sperimentali apps/client/src/app/pages/account/account-page.html - 244 + 253 @@ -2655,7 +2655,7 @@ Appearance apps/client/src/app/pages/account/account-page.html - 188 + 197 @@ -2663,7 +2663,7 @@ Auto apps/client/src/app/pages/account/account-page.html - 203 + 212 @@ -2671,7 +2671,7 @@ Light apps/client/src/app/pages/account/account-page.html - 204 + 213 @@ -2679,7 +2679,7 @@ Dark apps/client/src/app/pages/account/account-page.html - 205 + 214 @@ -2935,7 +2935,7 @@ Back apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 107 + 108 @@ -2943,19 +2943,19 @@ Community apps/client/src/app/pages/account/account-page.html - 135 + 144 apps/client/src/app/pages/account/account-page.html - 139 + 148 apps/client/src/app/pages/account/account-page.html - 143 + 152 apps/client/src/app/pages/account/account-page.html - 147 + 156 @@ -3019,7 +3019,7 @@ Validating data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 153 + 154 @@ -3027,7 +3027,7 @@ Import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 122 + 123 @@ -3167,7 +3167,7 @@ Protection for sensitive information like absolute performances and quantity values apps/client/src/app/pages/account/account-page.html - 76,79 + 85,88 @@ -3175,7 +3175,7 @@ Distraction-free experience for turbulent times apps/client/src/app/pages/account/account-page.html - 215,217 + 224,226 @@ -3183,7 +3183,7 @@ Sneak peek at upcoming functionality apps/client/src/app/pages/account/account-page.html - 245,247 + 254,256 @@ -3281,6 +3281,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 51 + + apps/client/src/app/pages/pricing/pricing-page.html + 329 + For tech-savvy investors who prefer to run Ghostfolio on their own infrastructure. @@ -3386,14 +3390,6 @@ 215,218 - - Upgrade Plan - Upgrade Plan - - apps/client/src/app/pages/pricing/pricing-page.html - 332,334 - - One-time payment, no auto-renewal. One-time payment, no auto-renewal. @@ -3574,6 +3570,22 @@ 6,10 + + Renew + Renew + + apps/client/src/app/pages/account/account-page.html + 45 + + + + Renew Plan + Renew Plan + + apps/client/src/app/pages/pricing/pricing-page.html + 332 + + diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index f35394cc0..a14e5bd52 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -390,7 +390,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 115 + 116 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1262,7 +1262,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 113 + 114 @@ -1382,7 +1382,7 @@ Voer uw couponcode in: apps/client/src/app/pages/account/account-page.component.ts - 236 + 237 @@ -1390,7 +1390,7 @@ Kon kortingscode niet inwisselen apps/client/src/app/pages/account/account-page.component.ts - 246 + 247 @@ -1398,7 +1398,7 @@ Couponcode is ingewisseld apps/client/src/app/pages/account/account-page.component.ts - 258 + 259 @@ -1406,7 +1406,7 @@ Herladen apps/client/src/app/pages/account/account-page.component.ts - 259 + 260 @@ -1414,7 +1414,7 @@ Wilt u deze aanmeldingsmethode echt verwijderen? apps/client/src/app/pages/account/account-page.component.ts - 305 + 306 @@ -1446,7 +1446,7 @@ Upgrade apps/client/src/app/pages/account/account-page.html - 37 + 40 @@ -1454,7 +1454,7 @@ per jaar apps/client/src/app/pages/account/account-page.html - 48 + 57 @@ -1462,7 +1462,7 @@ Probeer Premium apps/client/src/app/pages/account/account-page.html - 56 + 65 @@ -1470,7 +1470,7 @@ Coupon inwisselen apps/client/src/app/pages/account/account-page.html - 68 + 77 @@ -1478,7 +1478,7 @@ Presentatorweergave apps/client/src/app/pages/account/account-page.html - 75 + 84 @@ -1486,7 +1486,7 @@ Basisvaluta apps/client/src/app/pages/account/account-page.html - 94 + 103 @@ -1494,7 +1494,7 @@ Locale apps/client/src/app/pages/account/account-page.html - 160 + 169 @@ -1502,7 +1502,7 @@ Formaat datum en getal apps/client/src/app/pages/account/account-page.html - 162 + 171 @@ -1510,7 +1510,7 @@ Zen-modus apps/client/src/app/pages/account/account-page.html - 214 + 223 @@ -1518,7 +1518,7 @@ Aanmelden met vingerafdruk apps/client/src/app/pages/account/account-page.html - 229 + 238 @@ -1526,7 +1526,7 @@ Gebruikers-ID apps/client/src/app/pages/account/account-page.html - 259 + 268 @@ -1534,7 +1534,7 @@ Verleende toegang apps/client/src/app/pages/account/account-page.html - 268 + 277 @@ -2018,7 +2018,7 @@ Gegevens importeren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 95 @@ -2026,7 +2026,7 @@ Import is voltooid apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 102 + 103 @@ -2266,7 +2266,7 @@ Taal apps/client/src/app/pages/account/account-page.html - 118 + 127 @@ -2294,7 +2294,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 110 + 111 @@ -2310,7 +2310,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 112 + 113 @@ -2582,7 +2582,7 @@ Experimentele functies apps/client/src/app/pages/account/account-page.html - 244 + 253 @@ -2654,7 +2654,7 @@ Weergave apps/client/src/app/pages/account/account-page.html - 188 + 197 @@ -2662,7 +2662,7 @@ Automatisch apps/client/src/app/pages/account/account-page.html - 203 + 212 @@ -2670,7 +2670,7 @@ Licht apps/client/src/app/pages/account/account-page.html - 204 + 213 @@ -2678,7 +2678,7 @@ Donker apps/client/src/app/pages/account/account-page.html - 205 + 214 @@ -2934,7 +2934,7 @@ Terug apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 107 + 108 @@ -2942,19 +2942,19 @@ Gemeenschap apps/client/src/app/pages/account/account-page.html - 135 + 144 apps/client/src/app/pages/account/account-page.html - 139 + 148 apps/client/src/app/pages/account/account-page.html - 143 + 152 apps/client/src/app/pages/account/account-page.html - 147 + 156 @@ -3018,7 +3018,7 @@ Gegevens valideren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 153 + 154 @@ -3026,7 +3026,7 @@ Importeren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 122 + 123 @@ -3166,7 +3166,7 @@ Protection for sensitive information like absolute performances and quantity values apps/client/src/app/pages/account/account-page.html - 76,79 + 85,88 @@ -3174,7 +3174,7 @@ Distraction-free experience for turbulent times apps/client/src/app/pages/account/account-page.html - 215,217 + 224,226 @@ -3182,7 +3182,7 @@ Sneak peek at upcoming functionality apps/client/src/app/pages/account/account-page.html - 245,247 + 254,256 @@ -3280,6 +3280,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 51 + + apps/client/src/app/pages/pricing/pricing-page.html + 329 + For tech-savvy investors who prefer to run Ghostfolio on their own infrastructure. @@ -3385,14 +3389,6 @@ 215,218 - - Upgrade Plan - Upgrade Plan - - apps/client/src/app/pages/pricing/pricing-page.html - 332,334 - - One-time payment, no auto-renewal. One-time payment, no auto-renewal. @@ -3573,6 +3569,22 @@ 6,10 + + Renew + Renew + + apps/client/src/app/pages/account/account-page.html + 45 + + + + Renew Plan + Renew Plan + + apps/client/src/app/pages/pricing/pricing-page.html + 332 + + diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index c48b3b206..0799ca7d1 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -450,7 +450,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 115 + 116 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1582,7 +1582,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 112 + 113 @@ -1594,7 +1594,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 110 + 111 @@ -1606,7 +1606,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 113 + 114 @@ -1678,7 +1678,7 @@ Please enter your coupon code: apps/client/src/app/pages/account/account-page.component.ts - 236 + 237 @@ -1686,7 +1686,7 @@ Could not redeem coupon code apps/client/src/app/pages/account/account-page.component.ts - 246 + 247 @@ -1694,7 +1694,7 @@ Coupon code has been redeemed apps/client/src/app/pages/account/account-page.component.ts - 258 + 259 @@ -1702,7 +1702,7 @@ Reload apps/client/src/app/pages/account/account-page.component.ts - 259 + 260 @@ -1710,7 +1710,7 @@ Do you really want to remove this sign in method? apps/client/src/app/pages/account/account-page.component.ts - 305 + 306 @@ -1742,7 +1742,7 @@ Upgrade apps/client/src/app/pages/account/account-page.html - 37 + 40 @@ -1750,7 +1750,7 @@ per year apps/client/src/app/pages/account/account-page.html - 48 + 57 @@ -1758,7 +1758,7 @@ Try Premium apps/client/src/app/pages/account/account-page.html - 56 + 65 @@ -1766,7 +1766,7 @@ Redeem Coupon apps/client/src/app/pages/account/account-page.html - 68 + 77 @@ -1774,7 +1774,7 @@ Presenter View apps/client/src/app/pages/account/account-page.html - 75 + 84 @@ -1782,7 +1782,7 @@ Base Currency apps/client/src/app/pages/account/account-page.html - 94 + 103 @@ -1790,7 +1790,7 @@ Language apps/client/src/app/pages/account/account-page.html - 118 + 127 @@ -1806,7 +1806,7 @@ Locale apps/client/src/app/pages/account/account-page.html - 160 + 169 @@ -1814,7 +1814,7 @@ Date and number format apps/client/src/app/pages/account/account-page.html - 162 + 171 @@ -1822,7 +1822,7 @@ Zen Mode apps/client/src/app/pages/account/account-page.html - 214 + 223 @@ -1830,7 +1830,7 @@ Appearance apps/client/src/app/pages/account/account-page.html - 188 + 197 @@ -1838,7 +1838,7 @@ Auto apps/client/src/app/pages/account/account-page.html - 203 + 212 @@ -1846,7 +1846,7 @@ Light apps/client/src/app/pages/account/account-page.html - 204 + 213 @@ -1854,7 +1854,7 @@ Dark apps/client/src/app/pages/account/account-page.html - 205 + 214 @@ -1862,7 +1862,7 @@ Sign in with fingerprint apps/client/src/app/pages/account/account-page.html - 229 + 238 @@ -1870,7 +1870,7 @@ Experimental Features apps/client/src/app/pages/account/account-page.html - 244 + 253 @@ -1878,7 +1878,7 @@ User ID apps/client/src/app/pages/account/account-page.html - 259 + 268 @@ -1886,7 +1886,7 @@ Granted Access apps/client/src/app/pages/account/account-page.html - 268 + 277 @@ -2166,7 +2166,7 @@ Importing data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 95 @@ -2174,7 +2174,7 @@ Import has been completed apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 102 + 103 @@ -2198,7 +2198,7 @@ Back apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 107 + 108 @@ -2990,19 +2990,19 @@ Community apps/client/src/app/pages/account/account-page.html - 135 + 144 apps/client/src/app/pages/account/account-page.html - 139 + 148 apps/client/src/app/pages/account/account-page.html - 143 + 152 apps/client/src/app/pages/account/account-page.html - 147 + 156 @@ -3026,7 +3026,7 @@ Validating data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 153 + 154 @@ -3034,7 +3034,7 @@ Import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 122 + 123 @@ -3166,7 +3166,7 @@ Protection for sensitive information like absolute performances and quantity values apps/client/src/app/pages/account/account-page.html - 76,79 + 85,88 @@ -3174,7 +3174,7 @@ Distraction-free experience for turbulent times apps/client/src/app/pages/account/account-page.html - 215,217 + 224,226 @@ -3182,7 +3182,7 @@ Sneak peek at upcoming functionality apps/client/src/app/pages/account/account-page.html - 245,247 + 254,256 @@ -3280,6 +3280,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 51 + + apps/client/src/app/pages/pricing/pricing-page.html + 329 + For tech-savvy investors who prefer to run Ghostfolio on their own infrastructure. @@ -3385,14 +3389,6 @@ 215,218 - - Upgrade Plan - Upgrade Plan - - apps/client/src/app/pages/pricing/pricing-page.html - 332,334 - - One-time payment, no auto-renewal. One-time payment, no auto-renewal. @@ -3573,6 +3569,22 @@ 6,10 + + Renew + Renew + + apps/client/src/app/pages/account/account-page.html + 45 + + + + Renew Plan + Renew Plan + + apps/client/src/app/pages/pricing/pricing-page.html + 332 + + diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index ea6702858..e56b1d360 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -361,7 +361,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 115 + 116 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1147,7 +1147,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 113 + 114 @@ -1258,35 +1258,35 @@ Please enter your coupon code: apps/client/src/app/pages/account/account-page.component.ts - 236 + 237 Could not redeem coupon code apps/client/src/app/pages/account/account-page.component.ts - 246 + 247 Coupon code has been redeemed apps/client/src/app/pages/account/account-page.component.ts - 258 + 259 Reload apps/client/src/app/pages/account/account-page.component.ts - 259 + 260 Do you really want to remove this sign in method? apps/client/src/app/pages/account/account-page.component.ts - 305 + 306 @@ -1315,84 +1315,84 @@ Upgrade apps/client/src/app/pages/account/account-page.html - 37 + 40 per year apps/client/src/app/pages/account/account-page.html - 48 + 57 Try Premium apps/client/src/app/pages/account/account-page.html - 56 + 65 Redeem Coupon apps/client/src/app/pages/account/account-page.html - 68 + 77 Presenter View apps/client/src/app/pages/account/account-page.html - 75 + 84 Base Currency apps/client/src/app/pages/account/account-page.html - 94 + 103 Locale apps/client/src/app/pages/account/account-page.html - 160 + 169 Date and number format apps/client/src/app/pages/account/account-page.html - 162 + 171 Zen Mode apps/client/src/app/pages/account/account-page.html - 214 + 223 Sign in with fingerprint apps/client/src/app/pages/account/account-page.html - 229 + 238 User ID apps/client/src/app/pages/account/account-page.html - 259 + 268 Granted Access apps/client/src/app/pages/account/account-page.html - 268 + 277 @@ -1826,14 +1826,14 @@ Importing data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 95 Import has been completed apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 102 + 103 @@ -2045,7 +2045,7 @@ Language apps/client/src/app/pages/account/account-page.html - 118 + 127 @@ -2070,7 +2070,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 110 + 111 @@ -2085,7 +2085,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 112 + 113 @@ -2330,7 +2330,7 @@ Experimental Features apps/client/src/app/pages/account/account-page.html - 244 + 253 @@ -2386,7 +2386,7 @@ Auto apps/client/src/app/pages/account/account-page.html - 203 + 212 @@ -2400,21 +2400,21 @@ Light apps/client/src/app/pages/account/account-page.html - 204 + 213 Dark apps/client/src/app/pages/account/account-page.html - 205 + 214 Appearance apps/client/src/app/pages/account/account-page.html - 188 + 197 @@ -2639,26 +2639,26 @@ Back apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 107 + 108 Community apps/client/src/app/pages/account/account-page.html - 135 + 144 apps/client/src/app/pages/account/account-page.html - 139 + 148 apps/client/src/app/pages/account/account-page.html - 143 + 152 apps/client/src/app/pages/account/account-page.html - 147 + 156 @@ -2721,14 +2721,14 @@ Validating data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 153 + 154 Import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 122 + 123 @@ -2844,21 +2844,21 @@ Distraction-free experience for turbulent times apps/client/src/app/pages/account/account-page.html - 215,217 + 224,226 Protection for sensitive information like absolute performances and quantity values apps/client/src/app/pages/account/account-page.html - 76,79 + 85,88 Sneak peek at upcoming functionality apps/client/src/app/pages/account/account-page.html - 245,247 + 254,256 @@ -2886,13 +2886,6 @@ 185 - - Upgrade Plan - - apps/client/src/app/pages/pricing/pricing-page.html - 332,334 - - Unlimited Transactions @@ -2958,6 +2951,10 @@ apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 51 + + apps/client/src/app/pages/pricing/pricing-page.html + 329 + Performance Benchmarks @@ -3212,6 +3209,20 @@ 6,10 + + Renew Plan + + apps/client/src/app/pages/pricing/pricing-page.html + 332 + + + + Renew + + apps/client/src/app/pages/account/account-page.html + 45 + + diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index 68b882601..b197add39 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -40,7 +40,6 @@ 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 { UserWithSettings } from './user-with-settings'; import { User } from './user.interface'; export { @@ -84,6 +83,5 @@ export { TimelinePosition, UniqueAsset, User, - UserSettings, - UserWithSettings + UserSettings }; diff --git a/libs/common/src/lib/interfaces/info-item.interface.ts b/libs/common/src/lib/interfaces/info-item.interface.ts index bcb28402c..5ba295050 100644 --- a/libs/common/src/lib/interfaces/info-item.interface.ts +++ b/libs/common/src/lib/interfaces/info-item.interface.ts @@ -1,3 +1,4 @@ +import { SubscriptionOffer } from '@ghostfolio/common/types'; import { SymbolProfile, Tag } from '@prisma/client'; import { Statistics } from './statistics.interface'; @@ -15,7 +16,7 @@ export interface InfoItem { platforms: { id: string; name: string }[]; statistics: Statistics; stripePublicKey?: string; - subscriptions: Subscription[]; + subscriptions: { [offer in SubscriptionOffer]: Subscription }; systemMessage?: string; tags: Tag[]; } diff --git a/libs/common/src/lib/interfaces/user.interface.ts b/libs/common/src/lib/interfaces/user.interface.ts index 6effa3cf6..1009deca2 100644 --- a/libs/common/src/lib/interfaces/user.interface.ts +++ b/libs/common/src/lib/interfaces/user.interface.ts @@ -1,7 +1,10 @@ +import { SubscriptionOffer } from '@ghostfolio/common/types'; +import { SubscriptionType } from '@ghostfolio/common/types/subscription-type.type'; import { Account, Tag } from '@prisma/client'; import { UserSettings } from './user-settings.interface'; +// TODO: Compare with UserWithSettings export interface User { access: { alias?: string; @@ -13,7 +16,8 @@ export interface User { settings: UserSettings; subscription: { expiresAt?: Date; - type: 'Basic' | 'Premium'; + offer: SubscriptionOffer; + type: SubscriptionType; }; tags: Tag[]; } diff --git a/libs/common/src/lib/permissions.ts b/libs/common/src/lib/permissions.ts index b9dc6806a..da512babe 100644 --- a/libs/common/src/lib/permissions.ts +++ b/libs/common/src/lib/permissions.ts @@ -1,7 +1,6 @@ +import { UserWithSettings } from '@ghostfolio/common/types'; import { Role } from '@prisma/client'; -import { UserWithSettings } from './interfaces'; - export const permissions = { accessAdminControl: 'accessAdminControl', createAccess: 'createAccess', diff --git a/libs/common/src/lib/types/index.ts b/libs/common/src/lib/types/index.ts index 12bee4132..258ce211d 100644 --- a/libs/common/src/lib/types/index.ts +++ b/libs/common/src/lib/types/index.ts @@ -9,7 +9,9 @@ import { MarketState } from './market-state.type'; import { 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 { ViewMode } from './view-mode.type'; export type { @@ -24,6 +26,8 @@ export type { MarketState, OrderWithAccount, RequestWithUser, + SubscriptionOffer, ToggleOption, + UserWithSettings, ViewMode }; diff --git a/libs/common/src/lib/types/request-with-user.type.ts b/libs/common/src/lib/types/request-with-user.type.ts index a31f17f92..a6bea37b5 100644 --- a/libs/common/src/lib/types/request-with-user.type.ts +++ b/libs/common/src/lib/types/request-with-user.type.ts @@ -1,3 +1,3 @@ -import { UserWithSettings } from '@ghostfolio/common/interfaces'; +import { UserWithSettings } from '@ghostfolio/common/types'; export type RequestWithUser = Request & { user: UserWithSettings }; diff --git a/libs/common/src/lib/types/subscription-offer.type.ts b/libs/common/src/lib/types/subscription-offer.type.ts new file mode 100644 index 000000000..b7b2760ec --- /dev/null +++ b/libs/common/src/lib/types/subscription-offer.type.ts @@ -0,0 +1 @@ +export type SubscriptionOffer = 'default' | 'renewal'; diff --git a/libs/common/src/lib/types/subscription.type.ts b/libs/common/src/lib/types/subscription-type.type.ts similarity index 100% rename from libs/common/src/lib/types/subscription.type.ts rename to libs/common/src/lib/types/subscription-type.type.ts diff --git a/libs/common/src/lib/interfaces/user-with-settings.ts b/libs/common/src/lib/types/user-with-settings.type.ts similarity index 60% rename from libs/common/src/lib/interfaces/user-with-settings.ts rename to libs/common/src/lib/types/user-with-settings.type.ts index 80330d80c..09425ff11 100644 --- a/libs/common/src/lib/interfaces/user-with-settings.ts +++ b/libs/common/src/lib/types/user-with-settings.type.ts @@ -1,8 +1,9 @@ -import { SubscriptionType } from '@ghostfolio/common/types/subscription.type'; +import { UserSettings } from '@ghostfolio/common/interfaces/user-settings.interface'; +import { SubscriptionOffer } from '@ghostfolio/common/types'; +import { SubscriptionType } from '@ghostfolio/common/types/subscription-type.type'; import { Account, Settings, User } from '@prisma/client'; -import { UserSettings } from './user-settings.interface'; - +// TODO: Compare with User interface export type UserWithSettings = User & { Account: Account[]; activityCount: number; @@ -10,6 +11,7 @@ export type UserWithSettings = User & { Settings: Settings & { settings: UserSettings }; subscription?: { expiresAt?: Date; + offer: SubscriptionOffer; type: SubscriptionType; }; };