Browse Source

Merge branch 'main' into feature/fee_in_base_currency

pull/4645/head
Thomas Kaul 4 months ago
committed by GitHub
parent
commit
b611754f70
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 13
      CHANGELOG.md
  2. 8
      apps/api/src/app/import/import.service.ts
  3. 4
      apps/api/src/app/platform/platform.service.ts
  4. 74
      apps/api/src/app/portfolio/portfolio.controller.ts
  5. 60
      apps/api/src/app/portfolio/portfolio.service.ts
  6. 12
      apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts
  7. 12
      apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
  8. 3
      apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts
  9. 24
      apps/client/src/app/pages/faq/overview/faq-overview-page.html
  10. 9
      apps/client/src/app/pages/faq/overview/faq-overview-page.module.ts
  11. 4
      apps/client/src/app/pages/faq/saas/saas-page.component.ts
  12. 59
      apps/client/src/app/pages/faq/saas/saas-page.html
  13. 9
      apps/client/src/app/pages/faq/saas/saas-page.module.ts
  14. 4
      apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts
  15. 19
      apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html
  16. 9
      apps/client/src/app/pages/faq/self-hosting/self-hosting-page.module.ts
  17. 45
      apps/client/src/app/pages/features/features-page.html
  18. 12
      apps/client/src/app/pages/home/home-page.component.ts
  19. 12
      apps/client/src/app/services/data.service.ts
  20. 40
      apps/client/src/locales/messages.ca.xlf
  21. 40
      apps/client/src/locales/messages.de.xlf
  22. 40
      apps/client/src/locales/messages.es.xlf
  23. 40
      apps/client/src/locales/messages.fr.xlf
  24. 40
      apps/client/src/locales/messages.it.xlf
  25. 40
      apps/client/src/locales/messages.nl.xlf
  26. 40
      apps/client/src/locales/messages.pl.xlf
  27. 40
      apps/client/src/locales/messages.pt.xlf
  28. 40
      apps/client/src/locales/messages.tr.xlf
  29. 40
      apps/client/src/locales/messages.uk.xlf
  30. 40
      apps/client/src/locales/messages.xlf
  31. 40
      apps/client/src/locales/messages.zh.xlf
  32. 2
      libs/common/src/lib/interfaces/index.ts
  33. 8
      libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts
  34. 72
      package-lock.json
  35. 4
      package.json
  36. 2
      prisma/schema.prisma

13
CHANGELOG.md

@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
### Added
- Added the watchlist to the features page
- Extended the content of the Frequently Asked Questions (FAQ) pages
### 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
- Renamed `Account` to `accounts` in the `Platform` database schema
- Upgraded `prisma` from version `6.6.0` to `6.7.0`
### Fixed
- Fixed an issue with the fee calculations related to activities in a custom currency

8
apps/api/src/app/import/import.service.ts

@ -49,8 +49,8 @@ export class ImportService {
symbol
}: AssetProfileIdentifier): Promise<Activity[]> {
try {
const { firstBuyDate, historicalData, orders } =
await this.portfolioService.getPosition(dataSource, undefined, symbol);
const { activities, firstBuyDate, historicalData } =
await this.portfolioService.getHolding(dataSource, undefined, symbol);
const [[assetProfile], dividends] = await Promise.all([
this.symbolProfileService.getSymbolProfiles([
@ -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 &&

4
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
};
});
}

74
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<PortfolioHoldingResponse> {
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<PortfolioHoldingDetail> {
const holding = await this.portfolioService.getPosition(
): Promise<PortfolioHoldingResponse> {
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<void> {
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<void> {
const holding = await this.portfolioService.getHolding(
dataSource,
impersonationId,
symbol

60
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<PortfolioHoldingDetail> {
): Promise<PortfolioHoldingResponse> {
const userId = await this.getUserId(aImpersonationId, this.request.user.id);
const user = await this.userService.user({ id: userId });
const userCurrency = this.getUserCurrency(user);
@ -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,
@ -927,7 +933,7 @@ export class PortfolioService {
}
}
public async getPositions({
public async getHoldings({
dateRange = 'max',
filters,
impersonationId

12
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 (

12
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</gf-value
>
</div>
@ -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</gf-value
>
</div>

3
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;

24
apps/client/src/app/pages/faq/overview/faq-overview-page.html

@ -59,9 +59,14 @@
world. The
<a href="https://github.com/ghostfolio/ghostfolio">source code</a> is
fully available as open source software (OSS). Thanks to our generous
<a href="https://ghostfol.io/en/pricing">Ghostfolio Premium</a> users
and <a href="https://www.buymeacoffee.com/ghostfolio">sponsors</a> we
have the ability to run a free, limited plan for novice
<a class="align-items-center d-inline-flex" [href]="pricingUrl"
>Ghostfolio Premium<gf-premium-indicator
class="d-inline-block ml-1"
[enableLink]="false"
/></a>
users and
<a href="https://www.buymeacoffee.com/ghostfolio">sponsors</a> we have
the ability to run a free, limited plan for novice
investors.</mat-card-content
>
</mat-card>
@ -82,8 +87,11 @@
</mat-card-header>
<mat-card-content
>By offering
<a href="https://ghostfol.io/en/pricing">Ghostfolio Premium</a>, a
subscription plan with a managed hosting service and enhanced
<a class="align-items-center d-inline-flex" [href]="pricingUrl"
>Ghostfolio Premium<gf-premium-indicator
class="d-inline-block ml-1"
[enableLink]="false" /></a
>, a subscription plan with a managed hosting service and enhanced
features, we fund our business while providing added value to our
users.</mat-card-content
>
@ -105,7 +113,11 @@
</mat-card-header>
<mat-card-content
>Any support for Ghostfolio is welcome. Be it with a
<a href="https://ghostfol.io/en/pricing">Ghostfolio Premium</a>
<a class="align-items-center d-inline-flex" [href]="pricingUrl"
>Ghostfolio Premium<gf-premium-indicator
class="d-inline-block ml-1"
[enableLink]="false"
/></a>
subscription to finance the hosting infrastructure, a positive rating
in the
<a

9
apps/client/src/app/pages/faq/overview/faq-overview-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 { FaqOverviewPageComponent } from './faq-overview-page.component';
@NgModule({
declarations: [FaqOverviewPageComponent],
imports: [CommonModule, FaqOverviewPageRoutingModule, MatCardModule],
imports: [
CommonModule,
FaqOverviewPageRoutingModule,
GfPremiumIndicatorComponent,
MatCardModule
],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class FaqOverviewPageModule {}

4
apps/client/src/app/pages/faq/saas/saas-page.component.ts

@ -12,8 +12,10 @@ import { Subject, takeUntil } from 'rxjs';
standalone: false
})
export class SaasPageComponent implements OnDestroy {
public pricingUrl =
`https://ghostfol.io/${document.documentElement.lang}/` +
$localize`:snake-case:pricing`;
public routerLinkMarkets = ['/' + $localize`:snake-case:markets`];
public routerLinkPricing = ['/' + $localize`:snake-case:pricing`];
public routerLinkRegister = ['/' + $localize`:snake-case:register`];
public user: User;

59
apps/client/src/app/pages/faq/saas/saas-page.html

@ -14,11 +14,11 @@
<mat-card-title>How do I start?</mat-card-title>
</mat-card-header>
<mat-card-content>
You can sign up via the<a [routerLink]="routerLinkRegister"
>Get Started</a
>” button at the top of the page. You have multiple options to join
Ghostfolio: Create an account with a security token or
<i>Google Sign</i>. We will guide you to set up your portfolio.
You can sign up via the
<a [routerLink]="routerLinkRegister">Get Started</a> button at the top
of the page. You have multiple options to join Ghostfolio: Create an
account with a security token or <i>Google Sign</i>. We will guide you
to set up your portfolio.
</mat-card-content>
</mat-card>
<mat-card appearance="outlined" class="mb-3">
@ -38,8 +38,8 @@
>
<mat-card-content
>Yes, it is! Our
<a [routerLink]="routerLinkPricing">pricing page</a> details
everything you get for free.</mat-card-content
<a target="_blank" [href]="pricingUrl">pricing page</a>
details everything you get for free.</mat-card-content
>
</mat-card>
<mat-card appearance="outlined" class="mb-3">
@ -49,12 +49,20 @@
></mat-card-header
>
<mat-card-content
><a [routerLink]="routerLinkPricing">Ghostfolio Premium</a> 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 <a [routerLink]="routerLinkMarkets">markets overview</a> and
a professional data provider.</mat-card-content
><a
class="align-items-center d-inline-flex"
target="_blank"
[href]="pricingUrl"
>Ghostfolio Premium<gf-premium-indicator
class="d-inline-block ml-1"
[enableLink]="false"
/></a>
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
<a [routerLink]="routerLinkMarkets">markets overview</a> and a
professional data provider.</mat-card-content
>
</mat-card>
<mat-card appearance="outlined" class="mb-3">
@ -65,8 +73,15 @@
>
<mat-card-content
>Yes, you can try
<a [routerLink]="routerLinkPricing">Ghostfolio Premium</a> by signing
up for Ghostfolio and applying for a trial (see
<a
class="align-items-center d-inline-flex"
target="_blank"
[href]="pricingUrl"
>Ghostfolio Premium<gf-premium-indicator
class="d-inline-block ml-1"
[enableLink]="false"
/></a>
by signing up for Ghostfolio and applying for a trial (see
<a [routerLink]="['/account', 'membership']">Membership</a>). It is
easy, free and there is no commitment. You can stop using it at any
time.</mat-card-content
@ -93,9 +108,17 @@
>
</mat-card-header>
<mat-card-content
>No, <a [routerLink]="routerLinkPricing">Ghostfolio Premium</a> does
not include auto-renewal. Upon expiration, you can choose whether to
start a new subscription.</mat-card-content
>No,
<a
class="align-items-center d-inline-flex"
target="_blank"
[href]="pricingUrl"
>Ghostfolio Premium<gf-premium-indicator
class="d-inline-block ml-1"
[enableLink]="false"
/></a>
does not include auto-renewal. Upon expiration, you can choose whether
to start a new subscription.</mat-card-content
>
</mat-card>
@if (user?.subscription?.type === 'Premium') {

9
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 {}

4
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<void>();
public ngOnDestroy() {

19
apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html

@ -140,6 +140,25 @@
providers are considered experimental.</mat-card-content
>
</mat-card>
<mat-card appearance="outlined" class="mb-3">
<mat-card-header>
<mat-card-title
>Can I get access to a professional data provider?</mat-card-title
>
</mat-card-header>
<mat-card-content
>Yes, access to a professional data provider is included with a
<a
class="align-items-center d-inline-flex"
target="_blank"
[href]="pricingUrl"
>Ghostfolio Premium<gf-premium-indicator
class="d-inline-block ml-1"
[enableLink]="false"
/></a>
subscription via an API key.</mat-card-content
>
</mat-card>
<mat-card appearance="outlined" class="mb-3">
<mat-card-header>
<mat-card-title>How do I set up a benchmark?</mat-card-title>

9
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 {}

45
apps/client/src/app/pages/features/features-page.html

@ -175,10 +175,15 @@
<mat-card appearance="outlined" class="d-flex flex-column h-100">
<mat-card-content>
<div class="flex-grow-1">
<h4 class="align-items-center d-flex" i18n>Dark Mode</h4>
<h4 class="align-items-center d-flex">
<span i18n>Static Analysis</span>
@if (hasPermissionForSubscription) {
<gf-premium-indicator class="ml-1" />
}
</h4>
<p class="m-0">
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.
</p>
</div>
</mat-card-content>
@ -188,10 +193,14 @@
<mat-card appearance="outlined" class="d-flex flex-column h-100">
<mat-card-content>
<div class="flex-grow-1">
<h4 class="align-items-center d-flex" i18n>Zen Mode</h4>
<h4 class="align-items-center d-flex">
<span i18n>Watchlist</span>
@if (hasPermissionForSubscription) {
<gf-premium-indicator class="ml-1" />
}
</h4>
<p class="m-0">
Keep calm and activate Zen Mode if the markets are going
crazy.
Follow assets you are interested in closely on your watchlist.
</p>
</div>
</mat-card-content>
@ -221,15 +230,23 @@
<mat-card appearance="outlined" class="d-flex flex-column h-100">
<mat-card-content>
<div class="flex-grow-1">
<h4 class="align-items-center d-flex">
<span i18n>Static Analysis</span>
@if (hasPermissionForSubscription) {
<gf-premium-indicator class="ml-1" />
}
</h4>
<h4 class="align-items-center d-flex" i18n>Dark Mode</h4>
<p class="m-0">
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.
</p>
</div>
</mat-card-content>
</mat-card>
</div>
<div class="col-xs-12 col-md-4 mb-3">
<mat-card appearance="outlined" class="d-flex flex-column h-100">
<mat-card-content>
<div class="flex-grow-1">
<h4 class="align-items-center d-flex" i18n>Zen Mode</h4>
<p class="m-0">
Keep calm and activate Zen Mode if the markets are going
crazy.
</p>
</div>
</mat-card-content>

12
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();

12
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,13 +406,13 @@ export class DataService {
symbol: string;
}) {
return this.http
.get<PortfolioHoldingDetail>(
`/api/v1/portfolio/position/${dataSource}/${symbol}`
.get<PortfolioHoldingResponse>(
`/api/v1/portfolio/holding/${dataSource}/${symbol}`
)
.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);
}
@ -776,7 +776,7 @@ export class DataService {
tags
}: { tags: Tag[] } & AssetProfileIdentifier) {
return this.http.put<void>(
`/api/v1/portfolio/position/${dataSource}/${symbol}/tags`,
`/api/v1/portfolio/holding/${dataSource}/${symbol}/tags`,
{ tags }
);
}

40
apps/client/src/locales/messages.ca.xlf

@ -354,7 +354,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="0275b6f6c30c7b70cff02cb06c355ebd10724f86" datatype="html">
@ -591,7 +591,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -632,7 +632,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -711,9 +711,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -746,7 +754,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -3491,7 +3499,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="071f26a758dfeaed37626c8758754707c35e3915" datatype="html">
@ -4035,7 +4043,7 @@
<target state="new">Dark Mode</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -4043,7 +4051,7 @@
<target state="new">Market Mood</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -4051,7 +4059,7 @@
<target state="new">Static Analysis</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -4059,7 +4067,7 @@
<target state="new">Multi-Language</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -4067,7 +4075,7 @@
<target state="new">Open Source Software</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="802222cb4754d74846b18f651b1f94e21576185d" datatype="html">
@ -4075,7 +4083,7 @@
<target state="new">Get Started</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -4123,7 +4131,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -7944,6 +7952,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7954,7 +7966,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

40
apps/client/src/locales/messages.de.xlf

@ -1002,7 +1002,7 @@
<target state="translated">Registrieren</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -1766,7 +1766,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="9ae348ee3a7319c2fc4794fa8bc425999d355f8f" datatype="html">
@ -1994,7 +1994,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -3238,7 +3238,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="064d88bead9e71bd849ecaefd8b38cca8f195a88" datatype="html">
@ -4278,7 +4278,7 @@
<target state="translated">Dark Mode</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -4286,7 +4286,7 @@
<target state="translated">Marktstimmung</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -4294,7 +4294,7 @@
<target state="translated">Statische Analyse</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -4302,7 +4302,7 @@
<target state="translated">Mehrsprachigkeit</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -4310,7 +4310,7 @@
<target state="translated">Open Source Software</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -5256,7 +5256,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -5432,7 +5432,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -5511,9 +5511,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -5546,7 +5554,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -7944,6 +7952,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7954,7 +7966,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

40
apps/client/src/locales/messages.es.xlf

@ -987,7 +987,7 @@
<target state="translated">Empezar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -1751,7 +1751,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="9ae348ee3a7319c2fc4794fa8bc425999d355f8f" datatype="html">
@ -1979,7 +1979,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -3223,7 +3223,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="064d88bead9e71bd849ecaefd8b38cca8f195a88" datatype="html">
@ -4255,7 +4255,7 @@
<target state="new">Dark Mode</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -4263,7 +4263,7 @@
<target state="new">Market Mood</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -4271,7 +4271,7 @@
<target state="new">Static Analysis</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -4279,7 +4279,7 @@
<target state="new">Multi-Language</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -4287,7 +4287,7 @@
<target state="new">Open Source Software</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -5233,7 +5233,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -5409,7 +5409,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -5488,9 +5488,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -5523,7 +5531,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -7945,6 +7953,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7955,7 +7967,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

40
apps/client/src/locales/messages.fr.xlf

@ -2034,7 +2034,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="6b939b00e8481ed8aa8a24d8add7a209d7116759" datatype="html">
@ -2098,7 +2098,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="9ae348ee3a7319c2fc4794fa8bc425999d355f8f" datatype="html">
@ -2398,7 +2398,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -2866,7 +2866,7 @@
<target state="translated">Démarrer</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -4254,7 +4254,7 @@
<target state="translated">Mode Sombre</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -4262,7 +4262,7 @@
<target state="translated">Sentiment du Marché</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -4270,7 +4270,7 @@
<target state="translated">Analyse statique</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -4278,7 +4278,7 @@
<target state="translated">Multi-Langue</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -4286,7 +4286,7 @@
<target state="translated">Logiciel Open Source</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -5232,7 +5232,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -5408,7 +5408,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -5487,9 +5487,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -5522,7 +5530,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -7944,6 +7952,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7954,7 +7966,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

40
apps/client/src/locales/messages.it.xlf

@ -987,7 +987,7 @@
<target state="translated">Inizia</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -1751,7 +1751,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="9ae348ee3a7319c2fc4794fa8bc425999d355f8f" datatype="html">
@ -1979,7 +1979,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -3223,7 +3223,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="064d88bead9e71bd849ecaefd8b38cca8f195a88" datatype="html">
@ -4255,7 +4255,7 @@
<target state="translated">Modalità scura</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -4263,7 +4263,7 @@
<target state="translated">Umore del mercato</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -4271,7 +4271,7 @@
<target state="translated">Analisi statica</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -4279,7 +4279,7 @@
<target state="translated">Multilingue</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -4287,7 +4287,7 @@
<target state="translated">Software open source</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -5233,7 +5233,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -5409,7 +5409,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -5488,9 +5488,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -5523,7 +5531,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -7945,6 +7953,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7955,7 +7967,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

40
apps/client/src/locales/messages.nl.xlf

@ -986,7 +986,7 @@
<target state="translated">Aan de slag</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -1750,7 +1750,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="9ae348ee3a7319c2fc4794fa8bc425999d355f8f" datatype="html">
@ -1978,7 +1978,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -3222,7 +3222,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="064d88bead9e71bd849ecaefd8b38cca8f195a88" datatype="html">
@ -4254,7 +4254,7 @@
<target state="new">Dark Mode</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -4262,7 +4262,7 @@
<target state="translated">Marktsentiment</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -4270,7 +4270,7 @@
<target state="translated">Statische Analyse</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -4278,7 +4278,7 @@
<target state="translated">Meerdere talen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -4286,7 +4286,7 @@
<target state="translated">Open Source Software</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -5232,7 +5232,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -5408,7 +5408,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -5487,9 +5487,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -5522,7 +5530,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -7944,6 +7952,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7954,7 +7966,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

40
apps/client/src/locales/messages.pl.xlf

@ -193,7 +193,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -251,7 +251,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -330,9 +330,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -382,7 +390,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -787,7 +795,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="0275b6f6c30c7b70cff02cb06c355ebd10724f86" datatype="html">
@ -3195,7 +3203,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="071f26a758dfeaed37626c8758754707c35e3915" datatype="html">
@ -3663,7 +3671,7 @@
<target state="translated">Ciemny motyw</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -3671,7 +3679,7 @@
<target state="translated">Nastrój rynku</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -3679,7 +3687,7 @@
<target state="translated">Analiza statyczna</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -3687,7 +3695,7 @@
<target state="translated">Wielo-językowość</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -3695,7 +3703,7 @@
<target state="translated">Oprogramowanie Open Source</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="802222cb4754d74846b18f651b1f94e21576185d" datatype="html">
@ -3703,7 +3711,7 @@
<target state="translated">Rozpocznij</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3751,7 +3759,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -7944,6 +7952,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7954,7 +7966,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

40
apps/client/src/locales/messages.pt.xlf

@ -2010,7 +2010,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="bbe41ac2ea4a6c00ea941a41b33105048f8e9f13" datatype="html">
@ -2310,7 +2310,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -2762,7 +2762,7 @@
<target state="translated">Começar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3266,7 +3266,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="4798457301875181136" datatype="html">
@ -4254,7 +4254,7 @@
<target state="translated">Modo escuro</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -4262,7 +4262,7 @@
<target state="translated">Humor do mercado</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -4270,7 +4270,7 @@
<target state="translated">Análise estática</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -4278,7 +4278,7 @@
<target state="translated">Multilíngua</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -4286,7 +4286,7 @@
<target state="translated">Software de código aberto</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -5232,7 +5232,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -5408,7 +5408,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -5487,9 +5487,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -5522,7 +5530,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -7944,6 +7952,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7954,7 +7966,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

40
apps/client/src/locales/messages.tr.xlf

@ -193,7 +193,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -251,7 +251,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -330,9 +330,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -382,7 +390,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -759,7 +767,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="0275b6f6c30c7b70cff02cb06c355ebd10724f86" datatype="html">
@ -3207,7 +3215,7 @@
<target state="translated">Karanlık Mod</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="b5dc65493e3e15fbe15b7d9c17f7626321d82e76" datatype="html">
@ -3219,7 +3227,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -3227,7 +3235,7 @@
<target state="translated">Piyasa Modu</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -3235,7 +3243,7 @@
<target state="translated">Statik Analiz</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -3243,7 +3251,7 @@
<target state="translated">Çoklu Dil</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -3251,7 +3259,7 @@
<target state="translated">Açık Kaynak Yazılım</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="802222cb4754d74846b18f651b1f94e21576185d" datatype="html">
@ -3259,7 +3267,7 @@
<target state="translated">Başla</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3307,7 +3315,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -7944,6 +7952,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7954,7 +7966,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

40
apps/client/src/locales/messages.uk.xlf

@ -354,7 +354,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="0275b6f6c30c7b70cff02cb06c355ebd10724f86" datatype="html">
@ -591,7 +591,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -632,7 +632,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -711,9 +711,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -746,7 +754,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -3715,7 +3723,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="071f26a758dfeaed37626c8758754707c35e3915" datatype="html">
@ -4251,7 +4259,7 @@
<target state="translated">Темний режим</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -4259,7 +4267,7 @@
<target state="translated">Ринковий настрій</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -4267,7 +4275,7 @@
<target state="translated">Статичний аналіз</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -4275,7 +4283,7 @@
<target state="translated">Багатомовність</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -4283,7 +4291,7 @@
<target state="translated">Програмне забезпечення з відкритим кодом</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="802222cb4754d74846b18f651b1f94e21576185d" datatype="html">
@ -4291,7 +4299,7 @@
<target state="translated">Почати</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -4339,7 +4347,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -7944,6 +7952,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7954,7 +7966,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

40
apps/client/src/locales/messages.xlf

@ -191,7 +191,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -247,7 +247,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -325,9 +325,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -375,7 +383,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -765,7 +773,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="0275b6f6c30c7b70cff02cb06c355ebd10724f86" datatype="html">
@ -2995,7 +3003,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="071f26a758dfeaed37626c8758754707c35e3915" datatype="html">
@ -3416,42 +3424,42 @@
<source>Dark Mode</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
<source>Market Mood</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
<source>Static Analysis</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
<source>Multi-Language</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
<source>Open Source Software</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="802222cb4754d74846b18f651b1f94e21576185d" datatype="html">
<source>Get Started</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3496,7 +3504,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -7186,7 +7194,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="7a6d28bd1c36c8298c95b7965abf226b218be50d" datatype="html">
@ -7195,6 +7203,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">
<source>Get Early Access</source>

40
apps/client/src/locales/messages.zh.xlf

@ -194,7 +194,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -252,7 +252,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -331,9 +331,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -383,7 +391,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -788,7 +796,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="0275b6f6c30c7b70cff02cb06c355ebd10724f86" datatype="html">
@ -3204,7 +3212,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="071f26a758dfeaed37626c8758754707c35e3915" datatype="html">
@ -3672,7 +3680,7 @@
<target state="translated">深色模式</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -3680,7 +3688,7 @@
<target state="translated">市场情绪</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -3688,7 +3696,7 @@
<target state="translated">静态分析</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -3696,7 +3704,7 @@
<target state="translated">多语言</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -3704,7 +3712,7 @@
<target state="translated">开源软件</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="802222cb4754d74846b18f651b1f94e21576185d" datatype="html">
@ -3712,7 +3720,7 @@
<target state="translated">立即开始</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3760,7 +3768,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -7945,6 +7953,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7955,7 +7967,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

2
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,

8
apps/api/src/app/portfolio/interfaces/portfolio-holding-detail.interface.ts → libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts

@ -7,7 +7,8 @@ import {
import { Tag } from '@prisma/client';
export interface PortfolioHoldingDetail {
export interface PortfolioHoldingResponse {
activities: Activity[];
averagePrice: number;
dataProviderInfo: DataProviderInfo;
dividendInBaseCurrency: number;
@ -22,13 +23,12 @@ export interface PortfolioHoldingDetail {
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[];

72
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"

4
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",

2
prisma/schema.prisma

@ -147,10 +147,10 @@ model Order {
}
model Platform {
accounts Account[]
id String @id @default(uuid())
name String?
url String @unique
Account Account[]
@@index([name])
}

Loading…
Cancel
Save