From 448cea0b6999ac34fc4c029a027d4f0ec060ce8a Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 18 Feb 2024 10:18:53 +0100 Subject: [PATCH 01/52] Feature/improve usability of holdings table (#3017) * Improve usability * Update changelog --- CHANGELOG.md | 1 + .../account-detail-dialog/account-detail-dialog.html | 1 + apps/client/src/app/pages/public/public-page.html | 1 + .../lib/holdings-table/holdings-table.component.html | 5 ++--- .../lib/holdings-table/holdings-table.component.ts | 11 +++++++---- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fe813c57..65a386edf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Improved the usability of the holdings table - Improved the language localization for German (`de`) - Upgraded `ng-extract-i18n-merge` from version `2.9.1` to `2.10.0` diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html index 9cae03e2c..23875bfde 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html @@ -77,6 +77,7 @@ diff --git a/apps/client/src/app/pages/public/public-page.html b/apps/client/src/app/pages/public/public-page.html index 71cb2ec2d..bac3189be 100644 --- a/apps/client/src/app/pages/public/public-page.html +++ b/apps/client/src/app/pages/public/public-page.html @@ -132,6 +132,7 @@
Date: Sun, 18 Feb 2024 18:50:04 +0100 Subject: [PATCH 07/52] Update OSS friends (#3008) --- apps/client/src/assets/oss-friends.json | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/apps/client/src/assets/oss-friends.json b/apps/client/src/assets/oss-friends.json index 13d8fb3f1..b76dfe920 100644 --- a/apps/client/src/assets/oss-friends.json +++ b/apps/client/src/assets/oss-friends.json @@ -1,5 +1,5 @@ { - "createdAt": "2024-01-29T00:00:00.000Z", + "createdAt": "2024-02-16T00:00:00.000Z", "data": [ { "name": "Aptabase", @@ -21,6 +21,11 @@ "description": "Cal.com is a scheduling tool that helps you schedule meetings without the back-and-forth emails.", "href": "https://cal.com" }, + { + "name": "ClassroomIO.com", + "description": "ClassroomIO is a no-code tool that allows you build and scale your own teaching platform with ease.", + "href": "https://www.classroomio.com" + }, { "name": "Crowd.dev", "description": "Centralize community, product, and customer data to understand which companies are engaging with your open source project.", @@ -56,11 +61,6 @@ "description": "Survey granular user segments at any point in the user journey. Gather up to 6x more insights with targeted micro-surveys. All open-source.", "href": "https://formbricks.com" }, - { - "name": "Ghostfolio", - "description": "Ghostfolio is a privacy-first, open source dashboard for your personal finances. Designed to simplify asset tracking and empower informed investment decisions.", - "href": "https://ghostfol.io" - }, { "name": "GitWonk", "description": "GitWonk is an open-source technical documentation tool, designed and built focusing on the developer experience.", @@ -121,6 +121,11 @@ "description": "Open-Source Docsend Alternative to securely share documents with real-time analytics.", "href": "https://www.papermark.io" }, + { + "name": "Prisma", + "description": "Simplify working with databases. Build, optimize, and grow your app easily with an intuitive data model, type-safety, automated migrations, connection pooling, caching, and real-time db subscriptions.", + "href": "https://www.prisma.io" + }, { "name": "Requestly", "description": "Makes frontend development cycle 10x faster with API Client, Mock Server, Intercept & Modify HTTP Requests and Session Replays.", @@ -171,6 +176,11 @@ "description": "Typebot gives you powerful blocks to create unique chat experiences. Embed them anywhere on your apps and start collecting results like magic.", "href": "https://typebot.io" }, + { + "name": "UnInbox", + "description": "Modern email for teams and professionals. Bringing the best of email and messaging into a single, modern, and secure platform.", + "href": "https://uninbox.com" + }, { "name": "Unkey", "description": "An API authentication and authorization platform for scaling user facing APIs. Create, verify, and manage low latency API keys in seconds.", From 6f7cbc93b9455a45796d8659f518614c82b8fe11 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 18 Feb 2024 18:54:36 +0100 Subject: [PATCH 08/52] Add missing type (#3023) --- apps/api/src/app/portfolio/current-rate.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/api/src/app/portfolio/current-rate.service.ts b/apps/api/src/app/portfolio/current-rate.service.ts index f32bc18c5..73cad45e6 100644 --- a/apps/api/src/app/portfolio/current-rate.service.ts +++ b/apps/api/src/app/portfolio/current-rate.service.ts @@ -6,7 +6,7 @@ import { ResponseError, UniqueAsset } from '@ghostfolio/common/interfaces'; -import { RequestWithUser } from '@ghostfolio/common/types'; +import type { RequestWithUser } from '@ghostfolio/common/types'; import { Inject, Injectable } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; From be7f6bb6576e4788d5a9a31674923afd1c360573 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 18 Feb 2024 18:54:49 +0100 Subject: [PATCH 09/52] Feature/add inactive as user role (#3024) * Add INACTIVE as user role * Update changelog --- CHANGELOG.md | 6 ++++++ apps/api/src/app/user/user.controller.ts | 13 ++++++++++++- .../src/app/core/http-response.interceptor.ts | 10 ++++++++++ .../migration.sql | 2 ++ prisma/schema.prisma | 1 + 5 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 prisma/migrations/20240218173439_added_inactive_to_role/migration.sql diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d8c18d50..d1c9a4dde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Added + +- Added `INACTIVE` as a new user role + ## 2.53.0 - 2024-02-18 ### Added diff --git a/apps/api/src/app/user/user.controller.ts b/apps/api/src/app/user/user.controller.ts index cf332b2e8..541c7b178 100644 --- a/apps/api/src/app/user/user.controller.ts +++ b/apps/api/src/app/user/user.controller.ts @@ -2,7 +2,11 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorat import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { User, UserSettings } from '@ghostfolio/common/interfaces'; -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { + hasPermission, + hasRole, + permissions +} from '@ghostfolio/common/permissions'; import type { RequestWithUser } from '@ghostfolio/common/types'; import { @@ -59,6 +63,13 @@ export class UserController { public async getUser( @Headers('accept-language') acceptLanguage: string ): Promise { + if (hasRole(this.request.user, 'INACTIVE')) { + throw new HttpException( + getReasonPhrase(StatusCodes.TOO_MANY_REQUESTS), + StatusCodes.TOO_MANY_REQUESTS + ); + } + return this.userService.getUser( this.request.user, acceptLanguage?.split(',')?.[0] diff --git a/apps/client/src/app/core/http-response.interceptor.ts b/apps/client/src/app/core/http-response.interceptor.ts index 193359848..15a0d2e9f 100644 --- a/apps/client/src/app/core/http-response.interceptor.ts +++ b/apps/client/src/app/core/http-response.interceptor.ts @@ -99,6 +99,16 @@ export class HttpResponseInterceptor implements HttpInterceptor { window.location.reload(); }); } + } else if (error.status === StatusCodes.TOO_MANY_REQUESTS) { + if (!this.snackBarRef) { + this.snackBarRef = this.snackBar.open( + $localize`Oops! It looks like you’re making too many requests. Please slow down a bit.` + ); + + this.snackBarRef.afterDismissed().subscribe(() => { + this.snackBarRef = undefined; + }); + } } else if (error.status === StatusCodes.UNAUTHORIZED) { if (this.webAuthnService.isEnabled()) { this.router.navigate(['/webauthn']); diff --git a/prisma/migrations/20240218173439_added_inactive_to_role/migration.sql b/prisma/migrations/20240218173439_added_inactive_to_role/migration.sql new file mode 100644 index 000000000..0070382b6 --- /dev/null +++ b/prisma/migrations/20240218173439_added_inactive_to_role/migration.sql @@ -0,0 +1,2 @@ +-- AlterEnum +ALTER TYPE "Role" ADD VALUE 'INACTIVE'; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index a5a57d8c0..615610fa3 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -246,6 +246,7 @@ enum Provider { enum Role { ADMIN DEMO + INACTIVE USER } From ffbdfb86ec2fdc5c00149a92d5f5d9cedcf065dd Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 18 Feb 2024 18:56:34 +0100 Subject: [PATCH 10/52] Release 2.53.1 (#3025) --- CHANGELOG.md | 9 ++------- package.json | 2 +- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1c9a4dde..fae4b3527 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,17 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased - -### Added - -- Added `INACTIVE` as a new user role - -## 2.53.0 - 2024-02-18 +## 2.53.1 - 2024-02-18 ### Added - Added an accounts tab to the position detail dialog +- Added `INACTIVE` as a new user role ### Changed diff --git a/package.json b/package.json index f0834c868..3d9169649 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.53.0", + "version": "2.53.1", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 9acdb41aa29041406efe44ba613f7dac1a4a7979 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 19 Feb 2024 19:32:10 +0100 Subject: [PATCH 11/52] Refactor params to object (#2987) --- .../alpha-vantage/alpha-vantage.service.ts | 12 +++++++----- .../data-provider/coingecko/coingecko.service.ts | 16 +++++++++------- .../data-provider/data-provider.service.ts | 4 +++- .../eod-historical-data.service.ts | 14 ++++++++------ .../financial-modeling-prep.service.ts | 12 +++++++----- .../google-sheets/google-sheets.service.ts | 12 +++++++----- .../interfaces/data-provider.interface.ts | 6 +++++- .../data-provider/manual/manual.service.ts | 14 ++++++++------ .../data-provider/rapid-api/rapid-api.service.ts | 12 +++++++----- .../yahoo-finance/yahoo-finance.service.ts | 12 +++++++----- 10 files changed, 68 insertions(+), 46 deletions(-) diff --git a/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts b/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts index ab8923035..08dc48e57 100644 --- a/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts +++ b/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts @@ -37,12 +37,14 @@ export class AlphaVantageService implements DataProviderInterface { return !!this.configurationService.get('API_KEY_ALPHA_VANTAGE'); } - public async getAssetProfile( - aSymbol: string - ): Promise> { + public async getAssetProfile({ + symbol + }: { + symbol: string; + }): Promise> { return { - dataSource: this.getName(), - symbol: aSymbol + symbol, + dataSource: this.getName() }; } diff --git a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts index b05ffc02b..d17ba4b7e 100644 --- a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts +++ b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts @@ -52,15 +52,17 @@ export class CoinGeckoService implements DataProviderInterface { return true; } - public async getAssetProfile( - aSymbol: string - ): Promise> { + public async getAssetProfile({ + symbol + }: { + symbol: string; + }): Promise> { const response: Partial = { + symbol, assetClass: AssetClass.CASH, assetSubClass: AssetSubClass.CRYPTOCURRENCY, currency: DEFAULT_CURRENCY, - dataSource: this.getName(), - symbol: aSymbol + dataSource: this.getName() }; try { @@ -70,7 +72,7 @@ export class CoinGeckoService implements DataProviderInterface { abortController.abort(); }, this.configurationService.get('REQUEST_TIMEOUT')); - const { name } = await got(`${this.apiUrl}/coins/${aSymbol}`, { + const { name } = await got(`${this.apiUrl}/coins/${symbol}`, { headers: this.headers, // @ts-ignore signal: abortController.signal @@ -81,7 +83,7 @@ export class CoinGeckoService implements DataProviderInterface { let message = error; if (error?.code === 'ABORT_ERR') { - message = `RequestError: The operation to get the asset profile for ${aSymbol} was aborted because the request to the data provider took more than ${this.configurationService.get( + message = `RequestError: The operation to get the asset profile for ${symbol} was aborted because the request to the data provider took more than ${this.configurationService.get( 'REQUEST_TIMEOUT' )}ms`; } diff --git a/apps/api/src/services/data-provider/data-provider.service.ts b/apps/api/src/services/data-provider/data-provider.service.ts index 127af3f0d..1b52ca374 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -92,7 +92,9 @@ export class DataProviderService { for (const symbol of symbols) { const promise = Promise.resolve( - this.getDataProvider(DataSource[dataSource]).getAssetProfile(symbol) + this.getDataProvider(DataSource[dataSource]).getAssetProfile({ + symbol + }) ); promises.push( diff --git a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts index 798973be6..af67d62e9 100644 --- a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts +++ b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts @@ -46,19 +46,21 @@ export class EodHistoricalDataService implements DataProviderInterface { return true; } - public async getAssetProfile( - aSymbol: string - ): Promise> { - const [searchResult] = await this.getSearchResult(aSymbol); + public async getAssetProfile({ + symbol + }: { + symbol: string; + }): Promise> { + const [searchResult] = await this.getSearchResult(symbol); return { + symbol, assetClass: searchResult?.assetClass, assetSubClass: searchResult?.assetSubClass, currency: this.convertCurrency(searchResult?.currency), dataSource: this.getName(), isin: searchResult?.isin, - name: searchResult?.name, - symbol: aSymbol + name: searchResult?.name }; } diff --git a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts index dcc2d3ae0..2faaf8db8 100644 --- a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts +++ b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts @@ -37,12 +37,14 @@ export class FinancialModelingPrepService implements DataProviderInterface { return true; } - public async getAssetProfile( - aSymbol: string - ): Promise> { + public async getAssetProfile({ + symbol + }: { + symbol: string; + }): Promise> { return { - dataSource: this.getName(), - symbol: aSymbol + symbol, + dataSource: this.getName() }; } diff --git a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts index 9029e38f0..68e8bf732 100644 --- a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts +++ b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts @@ -33,12 +33,14 @@ export class GoogleSheetsService implements DataProviderInterface { return true; } - public async getAssetProfile( - aSymbol: string - ): Promise> { + public async getAssetProfile({ + symbol + }: { + symbol: string; + }): Promise> { return { - dataSource: this.getName(), - symbol: aSymbol + symbol, + dataSource: this.getName() }; } diff --git a/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts b/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts index 07fca64bd..3b3644473 100644 --- a/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts +++ b/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts @@ -11,7 +11,11 @@ import { DataSource, SymbolProfile } from '@prisma/client'; export interface DataProviderInterface { canHandle(symbol: string): boolean; - getAssetProfile(aSymbol: string): Promise>; + getAssetProfile({ + symbol + }: { + symbol: string; + }): Promise>; getDataProviderInfo(): DataProviderInfo; diff --git a/apps/api/src/services/data-provider/manual/manual.service.ts b/apps/api/src/services/data-provider/manual/manual.service.ts index 2ac293384..bc76645eb 100644 --- a/apps/api/src/services/data-provider/manual/manual.service.ts +++ b/apps/api/src/services/data-provider/manual/manual.service.ts @@ -43,16 +43,18 @@ export class ManualService implements DataProviderInterface { return true; } - public async getAssetProfile( - aSymbol: string - ): Promise> { + public async getAssetProfile({ + symbol + }: { + symbol: string; + }): Promise> { const assetProfile: Partial = { - dataSource: this.getName(), - symbol: aSymbol + symbol, + dataSource: this.getName() }; const [symbolProfile] = await this.symbolProfileService.getSymbolProfiles([ - { dataSource: this.getName(), symbol: aSymbol } + { symbol, dataSource: this.getName() } ]); if (symbolProfile) { diff --git a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts index fd34abb92..e55fbd4e2 100644 --- a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts +++ b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts @@ -30,12 +30,14 @@ export class RapidApiService implements DataProviderInterface { return !!this.configurationService.get('API_KEY_RAPID_API'); } - public async getAssetProfile( - aSymbol: string - ): Promise> { + public async getAssetProfile({ + symbol + }: { + symbol: string; + }): Promise> { return { - dataSource: this.getName(), - symbol: aSymbol + symbol, + dataSource: this.getName() }; } diff --git a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts index 645ec133e..b6148d431 100644 --- a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts +++ b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts @@ -33,11 +33,13 @@ export class YahooFinanceService implements DataProviderInterface { return true; } - public async getAssetProfile( - aSymbol: string - ): Promise> { - const { assetClass, assetSubClass, currency, name, symbol } = - await this.yahooFinanceDataEnhancerService.getAssetProfile(aSymbol); + public async getAssetProfile({ + symbol + }: { + symbol: string; + }): Promise> { + const { assetClass, assetSubClass, currency, name } = + await this.yahooFinanceDataEnhancerService.getAssetProfile(symbol); return { assetClass, From 93de25e5b61972844f5f958ee0353c62e0d2d068 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 19 Feb 2024 19:45:52 +0100 Subject: [PATCH 12/52] Feature/add missing database indexes (#3026) * Add missing database indexes * Update changelog --- CHANGELOG.md | 8 ++++++++ .../migration.sql | 11 +++++++++++ prisma/schema.prisma | 5 +++++ 3 files changed, 24 insertions(+) create mode 100644 prisma/migrations/20240219182116_added_missing_indexes/migration.sql diff --git a/CHANGELOG.md b/CHANGELOG.md index fae4b3527..a52b07c44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Added + +- Added an index for `id` to the account database table +- Added indexes for `dataSource` and `date` to the market data database table +- Added an index for `accountId` to the order database table + ## 2.53.1 - 2024-02-18 ### Added diff --git a/prisma/migrations/20240219182116_added_missing_indexes/migration.sql b/prisma/migrations/20240219182116_added_missing_indexes/migration.sql new file mode 100644 index 000000000..a18639489 --- /dev/null +++ b/prisma/migrations/20240219182116_added_missing_indexes/migration.sql @@ -0,0 +1,11 @@ +-- CreateIndex +CREATE INDEX "Account_id_idx" ON "Account"("id"); + +-- CreateIndex +CREATE INDEX "MarketData_dataSource_idx" ON "MarketData"("dataSource"); + +-- CreateIndex +CREATE INDEX "MarketData_date_idx" ON "MarketData"("date"); + +-- CreateIndex +CREATE INDEX "Order_accountId_idx" ON "Order"("accountId"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 615610fa3..ae36b00bf 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -39,6 +39,7 @@ model Account { Order Order[] @@id([id, userId]) + @@index([id]) } model AccountBalance { @@ -81,6 +82,8 @@ model MarketData { symbol String @@unique([dataSource, date, symbol]) + @@index([dataSource]) + @@index([date]) @@index([symbol]) } @@ -103,6 +106,8 @@ model Order { SymbolProfile SymbolProfile @relation(fields: [symbolProfileId], references: [id]) User User @relation(fields: [userId], references: [id]) tags Tag[] + + @@index([accountId]) } model Platform { From 5aa16a3779cdba61dff36cd44be30b62cab2f9f9 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 19 Feb 2024 19:47:37 +0100 Subject: [PATCH 13/52] Release 2.54.0 (#3027) --- CHANGELOG.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a52b07c44..e08186415 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 2.54.0 - 2024-02-19 ### Added diff --git a/package.json b/package.json index 3d9169649..e06f09156 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.53.1", + "version": "2.54.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 982c71c72863af82d83d86c020b8515f846b492c Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 20 Feb 2024 19:54:03 +0100 Subject: [PATCH 14/52] Feature/set angular parser in prettierrc (#3028) * Set parser to angular * Update changelog --- .prettierrc | 6 ++++++ CHANGELOG.md | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/.prettierrc b/.prettierrc index 8ea3ca4d7..9a579e2ea 100644 --- a/.prettierrc +++ b/.prettierrc @@ -12,6 +12,12 @@ "importOrder": ["^@ghostfolio/(.*)$", "", "^[./]"], "importOrderSeparation": true, "overrides": [ + { + "files": "*.html", + "options": { + "parser": "angular" + } + }, { "files": "*.ts", "options": { diff --git a/CHANGELOG.md b/CHANGELOG.md index e08186415..4c04d45cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Changed + +- Set the parser to `angular` in the `prettier` options + ## 2.54.0 - 2024-02-19 ### Added From b62488628c3597199fa69d6900c446545ba98d06 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 21 Feb 2024 09:58:15 +0100 Subject: [PATCH 15/52] Prettify markup (#3029) --- .../account-detail-dialog.html | 14 +- .../admin-market-data/admin-market-data.html | 25 +- .../asset-profile-dialog.html | 121 +++++--- .../admin-overview/admin-overview.html | 16 +- .../components/admin-users/admin-users.html | 28 +- .../home-overview/home-overview.html | 170 +++++------ .../components/home-summary/home-summary.html | 4 +- .../position-detail-dialog.html | 122 ++++---- .../create-or-update-access-dialog.html | 50 ++-- .../user-account-membership.html | 14 +- .../user-account-settings.html | 26 +- .../src/app/pages/about/about-page.html | 2 +- .../about/oss-friends/oss-friends-page.html | 42 +-- .../about/overview/about-overview-page.html | 18 +- .../src/app/pages/accounts/accounts-page.html | 12 +- .../create-or-update-account-dialog.html | 48 +-- .../src/app/pages/admin/admin-page.html | 2 +- apps/client/src/app/pages/blog/blog-page.html | 92 +++--- apps/client/src/app/pages/faq/faq-page.html | 2 +- .../src/app/pages/features/features-page.html | 58 ++-- apps/client/src/app/pages/home/home-page.html | 2 +- .../src/app/pages/landing/landing-page.html | 3 +- .../portfolio/activities/activities-page.html | 35 ++- .../create-or-update-activity-dialog.html | 122 +++++--- .../import-activities-dialog.html | 279 +++++++++--------- .../allocations/allocations-page.html | 15 +- .../portfolio/analysis/analysis-page.html | 213 +++++++------ .../app/pages/portfolio/fire/fire-page.html | 7 +- .../portfolio/holdings/holdings-page.html | 18 +- .../app/pages/portfolio/portfolio-page.html | 2 +- .../src/app/pages/pricing/pricing-page.html | 26 +- .../show-access-token-dialog.html | 6 +- .../personal-finance-tools-page.html | 54 ++-- .../product-page-template.html | 42 +-- .../app/pages/resources/resources-page.html | 26 +- .../pages/user-account/user-account-page.html | 2 +- .../src/app/pages/webauthn/webauthn-page.html | 42 +-- apps/client/src/app/pages/zen/zen-page.html | 2 +- .../assistant-list-item.html | 9 +- libs/ui/src/lib/assistant/assistant.html | 46 +-- 40 files changed, 1027 insertions(+), 790 deletions(-) diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html index 23875bfde..041a779c4 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html @@ -25,7 +25,9 @@ class="h-100" [currency]="user?.settings?.baseCurrency" [historicalDataItems]="historicalDataItems" - [isInPercent]="data.hasImpersonationId || user.settings.isRestrictedView" + [isInPercent]=" + data.hasImpersonationId || user.settings.isRestrictedView + " [isLoading]="isLoadingChart" [locale]="user?.settings?.locale" /> @@ -92,7 +94,9 @@ [dataSource]="dataSource" [deviceType]="data.deviceType" [hasPermissionToCreateActivity]="false" - [hasPermissionToExportActivities]="!data.hasImpersonationId && !user.settings.isRestrictedView" + [hasPermissionToExportActivities]=" + !data.hasImpersonationId && !user.settings.isRestrictedView + " [hasPermissionToFilter]="false" [hasPermissionToOpenDetails]="false" [locale]="user?.settings?.locale" @@ -113,7 +117,11 @@ [accountBalances]="accountBalances" [accountId]="data.accountId" [locale]="user?.settings?.locale" - [showActions]="!data.hasImpersonationId && hasPermissionToDeleteAccountBalance && !user.settings.isRestrictedView" + [showActions]=" + !data.hasImpersonationId && + hasPermissionToDeleteAccountBalance && + !user.settings.isRestrictedView + " (accountBalanceDeleted)="onDeleteAccountBalance($event)" /> diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.html b/apps/client/src/app/components/admin-market-data/admin-market-data.html index b2fa9a275..a91b05bcc 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.html +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -163,7 +163,12 @@ @@ -33,7 +35,12 @@ mat-menu-item type="button" [disabled]="assetProfileForm.dirty" - (click)="onGatherProfileDataBySymbol({dataSource: data.dataSource, symbol: data.symbol})" + (click)=" + onGatherProfileDataBySymbol({ + dataSource: data.dataSource, + symbol: data.symbol + }) + " > Gather Profile Data @@ -73,7 +80,12 @@ color="accent" mat-flat-button type="button" - [disabled]="!assetProfileForm.controls['historicalData']?.controls['csvString'].touched || assetProfileForm.controls['historicalData']?.controls['csvString']?.value === ''" + [disabled]=" + !assetProfileForm.controls['historicalData']?.controls['csvString'] + .touched || + assetProfileForm.controls['historicalData']?.controls['csvString'] + ?.value === '' + " (click)="onImportHistoricalData()" > Import @@ -129,49 +141,54 @@ >
- @if (assetProfile?.countries?.length === 1 && - assetProfile?.sectors?.length === 1 ) { -
- Sector -
-
- Country -
+ @if ( + assetProfile?.countries?.length === 1 && + assetProfile?.sectors?.length === 1 + ) { +
+ Sector +
+
+ Country +
} @else { -
-
Sectors
- -
-
-
Countries
- -
+
+
Sectors
+ +
+
+
Countries
+ +
}
@@ -222,7 +239,17 @@ color="primary" i18n [checked]="isBenchmark" - (change)="isBenchmark ? onUnsetBenchmark({dataSource: data.dataSource, symbol: data.symbol}) : onSetBenchmark({dataSource: data.dataSource, symbol: data.symbol})" + (change)=" + isBenchmark + ? onUnsetBenchmark({ + dataSource: data.dataSource, + symbol: data.symbol + }) + : onSetBenchmark({ + dataSource: data.dataSource, + symbol: data.symbol + }) + " >Benchmark @@ -253,7 +280,9 @@ color="accent" mat-flat-button type="button" - [disabled]="assetProfileForm.controls['scraperConfiguration'].value === '{}'" + [disabled]=" + assetProfileForm.controls['scraperConfiguration'].value === '{}' + " (click)="onTestMarketData()" > Test diff --git a/apps/client/src/app/components/admin-overview/admin-overview.html b/apps/client/src/app/components/admin-overview/admin-overview.html index e7af876e4..d23210b54 100644 --- a/apps/client/src/app/components/admin-overview/admin-overview.html +++ b/apps/client/src/app/components/admin-overview/admin-overview.html @@ -28,7 +28,7 @@ [value]="transactionCount" />
- {{ transactionCount / userCount | number : '1.2-2' }} + {{ transactionCount / userCount | number: '1.2-2' }} per User
@@ -69,10 +69,10 @@ @@ -112,7 +112,9 @@ @@ -143,7 +145,7 @@
System Message
-
{{ systemMessage | json }}
+
{{ systemMessage | json }}
- @if(SymbolProfile?.countries?.length === 1 && - SymbolProfile?.sectors?.length === 1) { -
- Sector + Sector +
+
-
-
- Country -
+ Country +
} @else { -
-
Sectors
- -
-
-
Countries
- -
+
+
Sectors
+ +
+
+
Countries
+ +
}
@@ -257,7 +273,9 @@ [dataSource]="dataSource" [deviceType]="data.deviceType" [hasPermissionToCreateActivity]="false" - [hasPermissionToExportActivities]="!data.hasImpersonationId && !user.settings.isRestrictedView" + [hasPermissionToExportActivities]=" + !data.hasImpersonationId && !user.settings.isRestrictedView + " [hasPermissionToFilter]="false" [hasPermissionToOpenDetails]="false" [locale]="data.locale" @@ -294,15 +312,17 @@
Tags
- {{ tag.name }} + {{ + tag.name + }}
diff --git a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html index 863ac5e16..e2ebefd1b 100644 --- a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html +++ b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -28,30 +28,32 @@
@if (accessForm.controls['type'].value === 'PRIVATE') { -
- - Permission - - Restricted view - @if(data?.user?.settings?.isExperimentalFeatures) { - View - } - - -
-
- - - Ghostfolio User ID - - - -
+
+ + Permission + + Restricted view + @if (data?.user?.settings?.isExperimentalFeatures) { + View + } + + +
+
+ + + Ghostfolio User ID + + + +
}
diff --git a/apps/client/src/app/components/user-account-membership/user-account-membership.html b/apps/client/src/app/components/user-account-membership/user-account-membership.html index eb832c6ee..369a5949b 100644 --- a/apps/client/src/app/components/user-account-membership/user-account-membership.html +++ b/apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -3,7 +3,7 @@
@@ -137,7 +145,9 @@ [disabled]="!hasPermissionToUpdateUserSettings" [placeholder]="appearancePlaceholder" [value]="user?.settings?.colorScheme" - (selectionChange)="onChangeUserSetting('colorScheme', $event.value)" + (selectionChange)=" + onChangeUserSetting('colorScheme', $event.value) + " > Auto Light diff --git a/apps/client/src/app/pages/about/about-page.html b/apps/client/src/app/pages/about/about-page.html index 839e8114f..360cbd463 100644 --- a/apps/client/src/app/pages/about/about-page.html +++ b/apps/client/src/app/pages/about/about-page.html @@ -21,7 +21,7 @@ >
{{ tab.label }}
diff --git a/apps/client/src/app/pages/about/oss-friends/oss-friends-page.html b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.html index f230679a7..f1431697f 100644 --- a/apps/client/src/app/pages/about/oss-friends/oss-friends-page.html +++ b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.html @@ -11,26 +11,28 @@
diff --git a/apps/client/src/app/pages/about/overview/about-overview-page.html b/apps/client/src/app/pages/about/overview/about-overview-page.html index 5b03acda5..1a6b6c466 100644 --- a/apps/client/src/app/pages/about/overview/about-overview-page.html +++ b/apps/client/src/app/pages/about/overview/about-overview-page.html @@ -147,15 +147,15 @@ >
@if (hasPermissionForSubscription) { -
- Blog -
+
+ Blog +
}
diff --git a/apps/client/src/app/pages/accounts/accounts-page.html b/apps/client/src/app/pages/accounts/accounts-page.html index d8bd01881..cffbe4251 100644 --- a/apps/client/src/app/pages/accounts/accounts-page.html +++ b/apps/client/src/app/pages/accounts/accounts-page.html @@ -8,7 +8,11 @@ [baseCurrency]="user?.settings?.baseCurrency" [deviceType]="deviceType" [locale]="user?.settings?.locale" - [showActions]="!hasImpersonationId && hasPermissionToUpdateAccount && !user.settings.isRestrictedView" + [showActions]=" + !hasImpersonationId && + hasPermissionToUpdateAccount && + !user.settings.isRestrictedView + " [totalBalanceInBaseCurrency]="totalBalanceInBaseCurrency" [totalValueInBaseCurrency]="totalValueInBaseCurrency" [transactionCount]="transactionCount" @@ -21,7 +25,11 @@
@if (data.account.id) { -

Update account

+

Update account

} @else { -

Add account

+

Add account

}
@@ -38,9 +38,9 @@ type="number" (keydown.enter)="$event.stopPropagation()" /> - {{ accountForm.controls['currency']?.value?.value }} + {{ + accountForm.controls['currency']?.value?.value + }}
@@ -55,18 +55,20 @@ (keydown.enter)="$event.stopPropagation()" /> - @for (platformEntry of filteredPlatforms | async; track platformEntry) - { - - - - {{ platformEntry.name }} - - + @for ( + platformEntry of filteredPlatforms | async; + track platformEntry + ) { + + + + {{ platformEntry.name }} + + } @@ -89,12 +91,12 @@ >
@if (data.account.id) { -
- - Account ID - - -
+
+ + Account ID + + +
}
diff --git a/apps/client/src/app/pages/admin/admin-page.html b/apps/client/src/app/pages/admin/admin-page.html index 839e8114f..360cbd463 100644 --- a/apps/client/src/app/pages/admin/admin-page.html +++ b/apps/client/src/app/pages/admin/admin-page.html @@ -21,7 +21,7 @@ >
{{ tab.label }}
diff --git a/apps/client/src/app/pages/blog/blog-page.html b/apps/client/src/app/pages/blog/blog-page.html index afde112d5..cd05d065c 100644 --- a/apps/client/src/app/pages/blog/blog-page.html +++ b/apps/client/src/app/pages/blog/blog-page.html @@ -9,30 +9,30 @@ > @if (hasPermissionForSubscription) { - - -
- - - + + } @@ -294,30 +294,30 @@ @if (hasPermissionForSubscription) { - - -
- - - + + } diff --git a/apps/client/src/app/pages/faq/faq-page.html b/apps/client/src/app/pages/faq/faq-page.html index 839e8114f..360cbd463 100644 --- a/apps/client/src/app/pages/faq/faq-page.html +++ b/apps/client/src/app/pages/faq/faq-page.html @@ -21,7 +21,7 @@ >
{{ tab.label }}
diff --git a/apps/client/src/app/pages/features/features-page.html b/apps/client/src/app/pages/features/features-page.html index 8eed72289..01fce0f00 100644 --- a/apps/client/src/app/pages/features/features-page.html +++ b/apps/client/src/app/pages/features/features-page.html @@ -140,7 +140,7 @@

Portfolio Calculations @if (hasPermissionForSubscription) { - + }

@@ -159,7 +159,7 @@

Portfolio Allocations @if (hasPermissionForSubscription) { - + }

@@ -197,24 +197,24 @@

@if (hasPermissionForSubscription) { -
- - -
-

- Market Mood - -

-

- Check the current market mood (Fear & Greed Index) within the app. -

-
-
-
-
+
+ + +
+

+ Market Mood + +

+

+ Check the current market mood (Fear & Greed Index) within the app. +

+
+
+
+
}
@@ -223,7 +223,7 @@

Static Analysis @if (hasPermissionForSubscription) { - + }

@@ -290,12 +290,16 @@

@if (!user) { -
-
- Get Started +
+
-
}
diff --git a/apps/client/src/app/pages/home/home-page.html b/apps/client/src/app/pages/home/home-page.html index 839e8114f..360cbd463 100644 --- a/apps/client/src/app/pages/home/home-page.html +++ b/apps/client/src/app/pages/home/home-page.html @@ -21,7 +21,7 @@ >
{{ tab.label }}
diff --git a/apps/client/src/app/pages/landing/landing-page.html b/apps/client/src/app/pages/landing/landing-page.html index b54e19633..e48b5e6ed 100644 --- a/apps/client/src/app/pages/landing/landing-page.html +++ b/apps/client/src/app/pages/landing/landing-page.html @@ -339,7 +339,8 @@ [href]="testimonial.url" >{{ testimonial.author }} - {{ testimonial.author }}, + {{ testimonial.author }}, {{ testimonial.country }}
diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page.html b/apps/client/src/app/pages/portfolio/activities/activities-page.html index 2e41b1a92..8872470b7 100644 --- a/apps/client/src/app/pages/portfolio/activities/activities-page.html +++ b/apps/client/src/app/pages/portfolio/activities/activities-page.html @@ -11,7 +11,11 @@ [locale]="user?.settings?.locale" [pageIndex]="pageIndex" [pageSize]="pageSize" - [showActions]="!hasImpersonationId && hasPermissionToDeleteActivity && !user.settings.isRestrictedView" + [showActions]=" + !hasImpersonationId && + hasPermissionToDeleteActivity && + !user.settings.isRestrictedView + " [sortColumn]="sortColumn" [sortDirection]="sortDirection" [totalItems]="totalItems" @@ -29,18 +33,21 @@ - @if (!hasImpersonationId && hasPermissionToCreateActivity && - !user.settings.isRestrictedView) { -
- - - -
+ @if ( + !hasImpersonationId && + hasPermissionToCreateActivity && + !user.settings.isRestrictedView + ) { +
+ + + +
} diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html index 57336fd36..bf4d6599f 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -11,48 +11,61 @@ Type - {{ typesTranslationMap[activityForm.controls['type'].value] - }} + {{ + typesTranslationMap[activityForm.controls['type'].value] + }} - {{ typesTranslationMap['BUY'] }} + {{ typesTranslationMap['BUY'] }} Stocks, ETFs, bonds, cryptocurrencies, commodities - {{ typesTranslationMap['FEE'] }} + {{ typesTranslationMap['FEE'] }} One-time fee, annual account fees - {{ typesTranslationMap['DIVIDEND'] }} + {{ typesTranslationMap['DIVIDEND'] }} Distribution of corporate earnings - {{ typesTranslationMap['INTEREST'] }} + {{ typesTranslationMap['INTEREST'] }} Revenue for lending out money - {{ typesTranslationMap['LIABILITY'] }} + {{ typesTranslationMap['LIABILITY'] }} Mortgages, personal loans, credit cards - {{ typesTranslationMap['SELL'] }} + {{ typesTranslationMap['SELL'] }} Stocks, ETFs, bonds, cryptocurrencies, commodities - {{ typesTranslationMap['ITEM'] }} + {{ typesTranslationMap['ITEM'] }} Luxury items, real estate, private companies @@ -60,16 +73,20 @@ -
+
Account
-
+
Update Cash Balance
Name, symbol or ISIN @@ -107,7 +128,11 @@
Name @@ -118,9 +143,9 @@ Currency - {{ currency }} + {{ + currency + }}
@@ -146,7 +171,13 @@
Quantity @@ -155,7 +186,7 @@
@@ -192,17 +223,25 @@
Oops! Could not get the historical exchange rate from - {{ activityForm.controls['date']?.value | date: defaultDateFormat + {{ + activityForm.controls['date']?.value | date: defaultDateFormat }}
Fee @@ -252,11 +296,14 @@
Oops! Could not get the historical exchange rate from - {{ activityForm.controls['date']?.value | date: defaultDateFormat + {{ + activityForm.controls['date']?.value | date: defaultDateFormat }} @@ -265,9 +312,9 @@ Fee - {{ activityForm.controls['currency'].value }} + {{ + activityForm.controls['currency'].value + }}
@@ -340,7 +387,7 @@ (optionSelected)="onAddTag($event)" > {{ tag.name }} @@ -354,7 +401,10 @@ class="flex-grow-1" [isCurrency]="true" [locale]="data.user?.settings?.locale" - [unit]="activityForm.controls['currency']?.value ?? data.user?.settings?.baseCurrency" + [unit]=" + activityForm.controls['currency']?.value ?? + data.user?.settings?.baseCurrency + " [value]="total" />
diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html index 4dc637aa8..032480acf 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -25,81 +25,86 @@
@if (mode === 'DIVIDEND') { -
- - Holding - - {{ uniqueAssetForm.controls['uniqueAsset']?.value?.name - }} - - {{ holding.name }} -
- {{ holding.symbol | gfSymbol }} · {{ holding.currency - }} + + Holding + + {{ + uniqueAssetForm.controls['uniqueAsset']?.value?.name + }} + - - - - + {{ holding.name }} +
+ {{ holding.symbol | gfSymbol }} · + {{ holding.currency }} +
+
+ +
+
+ +
+
+ } @else {
+

+ + The following file formats are supported: + CSV + or + JSON + +

- - } @else { -
- -

- - The following file formats are supported: - CSV - or - JSON - -

-
}
@@ -114,76 +119,76 @@ >
- @if(errorMessages?.length === 0) { - -
- - -
+ @if (errorMessages?.length === 0) { + +
+ + +
} @else { - - - - -
-
- + + + + +
+
+ +
+
{{ message }}
-
{{ message }}
-
- - -
{{ details[i] | json }}
- - -
- - -
+ + +
{{ details[i] | json }}
+ + +
+ + +
}
diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html index baa19882d..312061775 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html @@ -15,13 +15,20 @@ class="justify-content-end l-2" size="medium" [isPercent]="true" - [value]="isLoading ? undefined : portfolioDetails?.filteredValueInPercentage" + [value]=" + isLoading + ? undefined + : portfolioDetails?.filteredValueInPercentage + " /> @@ -204,7 +211,9 @@
diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html index 44bb970ef..a21eb8080 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -19,105 +19,134 @@
@if (user?.settings?.isExperimentalFeatures) { -
-
- - -
-
- Absolute Asset Performance -
-
- -
-
-
-
- Asset Performance +
+
+ + +
+
+ Absolute Asset Performance +
+
+ +
-
- +
+
+ Asset Performance +
+
+ +
-
-
-
- Absolute Currency Performance +
+
+ Absolute Currency Performance +
+
+ +
-
- +
+
+ Currency Performance +
+
+ +
-
-
-
- Currency Performance +

+
+
+ Absolute Net Performance +
+
+ +
-
- -
-
-

-
-
- Absolute Net Performance +
+
+ Net Performance +
+
+ +
-
- -
-
-
-
- Net Performance -
-
- -
-
- - + + +
-
}
diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page.html b/apps/client/src/app/pages/portfolio/fire/fire-page.html index 82f32d683..099f2e98c 100644 --- a/apps/client/src/app/pages/portfolio/fire/fire-page.html +++ b/apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -16,11 +16,14 @@ [currency]="user?.settings?.baseCurrency" [deviceType]="deviceType" [fireWealth]="fireWealth?.toNumber()" - [hasPermissionToUpdateUserSettings]="!hasImpersonationId && hasPermissionToUpdateUserSettings" + [hasPermissionToUpdateUserSettings]=" + !hasImpersonationId && hasPermissionToUpdateUserSettings + " [locale]="user?.settings?.locale" [ngStyle]="{ opacity: user?.subscription?.type === 'Basic' ? '0.67' : 'initial', - 'pointer-events': user?.subscription?.type === 'Basic' ? 'none' : 'initial' + 'pointer-events': + user?.subscription?.type === 'Basic' ? 'none' : 'initial' }" [projectedTotalAmount]="user?.settings?.projectedTotalAmount" [retirementDate]="user?.settings?.retirementDate" diff --git a/apps/client/src/app/pages/portfolio/holdings/holdings-page.html b/apps/client/src/app/pages/portfolio/holdings/holdings-page.html index 4aadf4a0b..bb8769c5a 100644 --- a/apps/client/src/app/pages/portfolio/holdings/holdings-page.html +++ b/apps/client/src/app/pages/portfolio/holdings/holdings-page.html @@ -14,15 +14,15 @@ [locale]="user?.settings?.locale" /> @if (hasPermissionToCreateOrder && holdings?.length > 0) { - + }
diff --git a/apps/client/src/app/pages/portfolio/portfolio-page.html b/apps/client/src/app/pages/portfolio/portfolio-page.html index 839e8114f..360cbd463 100644 --- a/apps/client/src/app/pages/portfolio/portfolio-page.html +++ b/apps/client/src/app/pages/portfolio/portfolio-page.html @@ -21,7 +21,7 @@ >
{{ tab.label }}
diff --git a/apps/client/src/app/pages/pricing/pricing-page.html b/apps/client/src/app/pages/pricing/pricing-page.html index 926ff24af..e4537ebb1 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.html +++ b/apps/client/src/app/pages/pricing/pricing-page.html @@ -107,7 +107,7 @@
@@ -164,7 +164,7 @@
@@ -243,19 +243,22 @@ {{ baseCurrency }} {{ price }} {{ baseCurrency }} {{ price - coupon }} + > {{ baseCurrency }} {{ + price - coupon + }} {{ baseCurrency }} {{ price }}{{ baseCurrency }} {{ + price + }} per year