From 6c6f20c3fdbc1dc636bfc50532cf01dbac05ff7e Mon Sep 17 00:00:00 2001
From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com>
Date: Fri, 20 Feb 2026 23:28:06 +0700
Subject: [PATCH 030/224] Task/improve type safety in account balances
component (#6352)
* fix(lib): add type annotations for date adapter
* fix(lib): handle form value possibly null
* fix(lint): use arrow fn for validators
* fix(lib): accounts table typings
* fix(lib): remove unsubscribeSubject due to lack of observable
* fix(lib): remove validators variable
* feat(lib): implement inject functions
* feat(lib): make locale an input signal
* feat(lib): make showActions an input signal
* feat(lib): make accountId an input signal
* feat(lib): make accountCurrency an input signal
* feat(lib): make accountBalances an input signal
* feat(lib): make sort a viewChild signal
* feat(lib): implement isNil
---
.../account-balances.component.html | 10 +--
.../account-balances.component.ts | 68 +++++++++----------
.../accounts-table.component.ts | 2 +-
3 files changed, 37 insertions(+), 43 deletions(-)
diff --git a/libs/ui/src/lib/account-balances/account-balances.component.html b/libs/ui/src/lib/account-balances/account-balances.component.html
index caef922ed..29037a985 100644
--- a/libs/ui/src/lib/account-balances/account-balances.component.html
+++ b/libs/ui/src/lib/account-balances/account-balances.component.html
@@ -12,7 +12,7 @@
Date
-
+
@@ -37,7 +37,7 @@
@@ -58,7 +58,7 @@
- @if (showActions) {
+ @if (showActions()) {
diff --git a/libs/ui/src/lib/account-balances/account-balances.component.ts b/libs/ui/src/lib/account-balances/account-balances.component.ts
index 608ee1c75..7b26263b0 100644
--- a/libs/ui/src/lib/account-balances/account-balances.component.ts
+++ b/libs/ui/src/lib/account-balances/account-balances.component.ts
@@ -10,12 +10,12 @@ import {
ChangeDetectionStrategy,
Component,
EventEmitter,
- Input,
OnChanges,
- OnDestroy,
OnInit,
Output,
- ViewChild
+ inject,
+ input,
+ viewChild
} from '@angular/core';
import {
FormGroup,
@@ -39,8 +39,7 @@ import {
ellipsisHorizontal,
trashOutline
} from 'ionicons/icons';
-import { get } from 'lodash';
-import { Subject } from 'rxjs';
+import { get, isNil } from 'lodash';
import { GfValueComponent } from '../value';
@@ -63,50 +62,44 @@ import { GfValueComponent } from '../value';
styleUrls: ['./account-balances.component.scss'],
templateUrl: './account-balances.component.html'
})
-export class GfAccountBalancesComponent
- implements OnChanges, OnDestroy, OnInit
-{
- @Input() accountBalances: AccountBalancesResponse['balances'];
- @Input() accountCurrency: string;
- @Input() accountId: string;
- @Input() locale = getLocale();
- @Input() showActions = true;
-
+export class GfAccountBalancesComponent implements OnChanges, OnInit {
@Output() accountBalanceCreated = new EventEmitter();
@Output() accountBalanceDeleted = new EventEmitter();
- @ViewChild(MatSort) sort: MatSort;
+ public readonly accountBalances =
+ input.required();
+ public readonly accountCurrency = input.required();
+ public readonly accountId = input.required();
+ public readonly displayedColumns: string[] = ['date', 'value', 'actions'];
+ public readonly locale = input(getLocale());
+ public readonly showActions = input(true);
+ public readonly sort = viewChild(MatSort);
public accountBalanceForm = new FormGroup({
- balance: new FormControl(0, Validators.required),
- date: new FormControl(new Date(), Validators.required)
+ balance: new FormControl(0, (control) => Validators.required(control)),
+ date: new FormControl(new Date(), (control) => Validators.required(control))
});
public dataSource = new MatTableDataSource<
AccountBalancesResponse['balances'][0]
>();
- public displayedColumns: string[] = ['date', 'value', 'actions'];
- public Validators = Validators;
-
- private unsubscribeSubject = new Subject();
+ private dateAdapter = inject>(DateAdapter);
+ private notificationService = inject(NotificationService);
- public constructor(
- private dateAdapter: DateAdapter,
- private notificationService: NotificationService
- ) {
+ public constructor() {
addIcons({ calendarClearOutline, ellipsisHorizontal, trashOutline });
}
public ngOnInit() {
- this.dateAdapter.setLocale(this.locale);
+ this.dateAdapter.setLocale(this.locale());
}
public ngOnChanges() {
- if (this.accountBalances) {
- this.dataSource = new MatTableDataSource(this.accountBalances);
+ if (this.accountBalances()) {
+ this.dataSource = new MatTableDataSource(this.accountBalances());
- this.dataSource.sort = this.sort;
+ this.dataSource.sort = this.sort();
this.dataSource.sortingDataAccessor = get;
}
}
@@ -122,10 +115,16 @@ export class GfAccountBalancesComponent
}
public async onSubmitAccountBalance() {
+ const { balance, date } = this.accountBalanceForm.value;
+
+ if (isNil(balance) || !date) {
+ return;
+ }
+
const accountBalance: CreateAccountBalanceDto = {
- accountId: this.accountId,
- balance: this.accountBalanceForm.get('balance').value,
- date: format(this.accountBalanceForm.get('date').value, DATE_FORMAT)
+ balance,
+ accountId: this.accountId(),
+ date: format(date, DATE_FORMAT)
};
try {
@@ -141,9 +140,4 @@ export class GfAccountBalancesComponent
this.accountBalanceCreated.emit(accountBalance);
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/libs/ui/src/lib/accounts-table/accounts-table.component.ts b/libs/ui/src/lib/accounts-table/accounts-table.component.ts
index d486b775f..99e68c679 100644
--- a/libs/ui/src/lib/accounts-table/accounts-table.component.ts
+++ b/libs/ui/src/lib/accounts-table/accounts-table.component.ts
@@ -53,7 +53,7 @@ import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
templateUrl: './accounts-table.component.html'
})
export class GfAccountsTableComponent {
- public readonly accounts = input.required();
+ public readonly accounts = input.required();
public readonly activitiesCount = input();
public readonly baseCurrency = input();
public readonly hasPermissionToOpenDetails = input(true);
From f17dfd9d945bbfc453af546928eebe419ac87fc7 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Fri, 20 Feb 2026 20:45:18 +0100
Subject: [PATCH 031/224] Task/update locales 20260219 (#6354)
* Update translations
* Update changelog
---
CHANGELOG.md | 1 +
apps/client/src/locales/messages.de.xlf | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c7188d7db..0010f0dae 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- Refreshed the cryptocurrencies list
+- Improved the language localization for German (`de`)
- Improved the language localization for Spanish (`es`)
## 2.240.0 - 2026-02-18
diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf
index 38f0b4c66..2ca3a95bf 100644
--- a/apps/client/src/locales/messages.de.xlf
+++ b/apps/client/src/locales/messages.de.xlf
@@ -3359,7 +3359,7 @@
No Activities
- No Activities
+ Keine Aktivitäten
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
146
From bd160d0e576e7958f08bacdcd3b20e36b27563f9 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Fri, 20 Feb 2026 21:08:36 +0100
Subject: [PATCH 032/224] Bugfix/issue with accounts in value redaction
interceptor for impersonation mode (#6359)
* Extend redacted paths of accounts
* Update changelog
---
CHANGELOG.md | 9 +++++++++
libs/common/src/lib/config.ts | 5 +++++
2 files changed, 14 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0010f0dae..c0fb2b2e4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Improved the language localization for German (`de`)
- Improved the language localization for Spanish (`es`)
+### Fixed
+
+- Fixed an issue with `balanceInBaseCurrency` of the accounts in the value redaction interceptor for the impersonation mode
+- Fixed an issue with `comment` of the accounts in the value redaction interceptor for the impersonation mode
+- Fixed an issue with `dividendInBaseCurrency` of the accounts in the value redaction interceptor for the impersonation mode
+- Fixed an issue with `dividendInBaseCurrency` of the accounts in the value redaction interceptor for the impersonation mode
+- Fixed an issue with `interestInBaseCurrency` of the accounts in the value redaction interceptor for the impersonation mode
+- Fixed an issue with `value` of the accounts in the value redaction interceptor for the impersonation mode
+
## 2.240.0 - 2026-02-18
### Added
diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts
index eae1b73cd..5da0e0122 100644
--- a/libs/common/src/lib/config.ts
+++ b/libs/common/src/lib/config.ts
@@ -80,6 +80,11 @@ export const DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT = 30000;
export const DEFAULT_REDACTED_PATHS = [
'accounts[*].balance',
+ 'accounts[*].balanceInBaseCurrency',
+ 'accounts[*].comment',
+ 'accounts[*].dividendInBaseCurrency',
+ 'accounts[*].interestInBaseCurrency',
+ 'accounts[*].value',
'accounts[*].valueInBaseCurrency',
'activities[*].account.balance',
'activities[*].account.comment',
From 8bdcad553333051e97bb6005b6e0de6c54985c76 Mon Sep 17 00:00:00 2001
From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com>
Date: Sat, 21 Feb 2026 14:33:24 +0700
Subject: [PATCH 033/224] Task/improve type safety in activities filter
component (#6358)
* fix(lib): resolve typescript errors
* feat(lib): migrate to takeUntilDestroyed
* fix(lib): resolve type errors
* feat(lib): implement output signal
* feat(lib): clean up variables
* fix(lib): resolve input is deprecated
* feat(lib): implement input signal on placeholder
* feat(lib): implement input signal on isLoading
---
.../activities-filter.component.html | 8 +-
.../activities-filter.component.ts | 83 +++++++++----------
2 files changed, 43 insertions(+), 48 deletions(-)
diff --git a/libs/ui/src/lib/activities-filter/activities-filter.component.html b/libs/ui/src/lib/activities-filter/activities-filter.component.html
index fd22ed351..d87ce16ce 100644
--- a/libs/ui/src/lib/activities-filter/activities-filter.component.html
+++ b/libs/ui/src/lib/activities-filter/activities-filter.component.html
@@ -10,7 +10,7 @@
[removable]="true"
(removed)="onRemoveFilter(filter)"
>
- {{ filter.label | gfSymbol }}
+ {{ filter.label ?? '' | gfSymbol }}
@@ -23,7 +23,7 @@
[matAutocomplete]="autocomplete"
[matChipInputFor]="chipList"
[matChipInputSeparatorKeyCodes]="separatorKeysCodes"
- [placeholder]="placeholder"
+ [placeholder]="placeholder()"
(matChipInputTokenEnd)="onAddFilter($event)"
/>
@@ -35,7 +35,7 @@
@for (filter of filterGroup.filters; track filter) {
- {{ filter.label | gfSymbol }}
+ {{ filter.label ?? '' | gfSymbol }}
}
@@ -46,7 +46,7 @@
disabled
mat-icon-button
matSuffix
- [ngClass]="{ 'd-none': !isLoading }"
+ [ngClass]="{ 'd-none': !isLoading() }"
>
diff --git a/libs/ui/src/lib/activities-filter/activities-filter.component.ts b/libs/ui/src/lib/activities-filter/activities-filter.component.ts
index 34f883c67..25fad683d 100644
--- a/libs/ui/src/lib/activities-filter/activities-filter.component.ts
+++ b/libs/ui/src/lib/activities-filter/activities-filter.component.ts
@@ -8,14 +8,14 @@ import {
ChangeDetectionStrategy,
Component,
ElementRef,
- EventEmitter,
Input,
OnChanges,
- OnDestroy,
- Output,
SimpleChanges,
- ViewChild
+ ViewChild,
+ input,
+ output
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { FormControl, ReactiveFormsModule } from '@angular/forms';
import {
MatAutocomplete,
@@ -30,8 +30,7 @@ import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { closeOutline, searchOutline } from 'ionicons/icons';
import { groupBy } from 'lodash';
-import { BehaviorSubject, Observable, Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
+import { BehaviorSubject } from 'rxjs';
import { translate } from '../i18n';
@@ -53,28 +52,26 @@ import { translate } from '../i18n';
styleUrls: ['./activities-filter.component.scss'],
templateUrl: './activities-filter.component.html'
})
-export class GfActivitiesFilterComponent implements OnChanges, OnDestroy {
+export class GfActivitiesFilterComponent implements OnChanges {
@Input() allFilters: Filter[];
- @Input() isLoading: boolean;
- @Input() placeholder: string;
- @Output() valueChanged = new EventEmitter();
+ @ViewChild('autocomplete') protected matAutocomplete: MatAutocomplete;
+ @ViewChild('searchInput') protected searchInput: ElementRef;
- @ViewChild('autocomplete') matAutocomplete: MatAutocomplete;
- @ViewChild('searchInput') searchInput: ElementRef;
+ public readonly isLoading = input.required();
+ public readonly placeholder = input.required();
+ public readonly valueChanged = output();
- public filterGroups$: Subject = new BehaviorSubject([]);
- public filters$: Subject = new BehaviorSubject([]);
- public filters: Observable = this.filters$.asObservable();
- public searchControl = new FormControl(undefined);
- public selectedFilters: Filter[] = [];
- public separatorKeysCodes: number[] = [ENTER, COMMA];
-
- private unsubscribeSubject = new Subject();
+ protected readonly filterGroups$ = new BehaviorSubject([]);
+ protected readonly searchControl = new FormControl(
+ null
+ );
+ protected selectedFilters: Filter[] = [];
+ protected readonly separatorKeysCodes: number[] = [ENTER, COMMA];
public constructor() {
this.searchControl.valueChanges
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed())
.subscribe((filterOrSearchTerm) => {
if (filterOrSearchTerm) {
const searchTerm =
@@ -97,41 +94,39 @@ export class GfActivitiesFilterComponent implements OnChanges, OnDestroy {
}
}
- public onAddFilter({ input, value }: MatChipInputEvent) {
+ public onAddFilter({ chipInput, value }: MatChipInputEvent) {
if (value?.trim()) {
this.updateFilters();
}
// Reset the input value
- if (input) {
- input.value = '';
+ if (chipInput.inputElement) {
+ chipInput.inputElement.value = '';
}
- this.searchControl.setValue(undefined);
+ this.searchControl.setValue(null);
}
public onRemoveFilter(aFilter: Filter) {
- this.selectedFilters = this.selectedFilters.filter((filter) => {
- return filter.id !== aFilter.id;
+ this.selectedFilters = this.selectedFilters.filter(({ id }) => {
+ return id !== aFilter.id;
});
this.updateFilters();
}
public onSelectFilter(event: MatAutocompleteSelectedEvent) {
- this.selectedFilters.push(
- this.allFilters.find((filter) => {
- return filter.id === event.option.value;
- })
- );
+ const filter = this.allFilters.find(({ id }) => {
+ return id === event.option.value;
+ });
+
+ if (filter) {
+ this.selectedFilters.push(filter);
+ }
+
this.updateFilters();
this.searchInput.nativeElement.value = '';
- this.searchControl.setValue(undefined);
- }
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
+ this.searchControl.setValue(null);
}
private getGroupedFilters(searchTerm?: string) {
@@ -139,23 +134,23 @@ export class GfActivitiesFilterComponent implements OnChanges, OnDestroy {
this.allFilters
.filter((filter) => {
// Filter selected filters
- return !this.selectedFilters.some((selectedFilter) => {
- return selectedFilter.id === filter.id;
+ return !this.selectedFilters.some(({ id }) => {
+ return id === filter.id;
});
})
.filter((filter) => {
if (searchTerm) {
// Filter by search term
return filter.label
- .toLowerCase()
+ ?.toLowerCase()
.includes(searchTerm.toLowerCase());
}
return filter;
})
- .sort((a, b) => a.label?.localeCompare(b.label)),
- (filter) => {
- return filter.type;
+ .sort((a, b) => (a.label ?? '').localeCompare(b.label ?? '')),
+ ({ type }) => {
+ return type;
}
);
From 25200bfd6d45871d109db8eca2f4004029d2a58c Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sat, 21 Feb 2026 08:33:51 +0100
Subject: [PATCH 034/224] Task/improve usability of portfolio summary in
presenter view (#6360)
* Improve usability in presenter view
* Update changelog
---
CHANGELOG.md | 1 +
.../portfolio-summary/portfolio-summary.component.html | 7 +++++--
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c0fb2b2e4..594b8faa1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
+- Improved the usability of the portfolio summary tab on the home page in the _Presenter View_
- Refreshed the cryptocurrencies list
- Improved the language localization for German (`de`)
- Improved the language localization for Spanish (`es`)
diff --git a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
index 99e0c9a53..0e26a49a8 100644
--- a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
+++ b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
@@ -184,18 +184,21 @@
[ngClass]="{
'cursor-pointer':
hasPermissionToUpdateUserSettings &&
+ !user?.settings?.isRestrictedView &&
user?.subscription?.type !== 'Basic'
}"
(click)="
hasPermissionToUpdateUserSettings &&
+ !user?.settings?.isRestrictedView &&
user?.subscription?.type !== 'Basic' &&
onEditEmergencyFund()
"
>
@if (
hasPermissionToUpdateUserSettings &&
- user?.subscription?.type !== 'Basic' &&
- !isLoading
+ !isLoading &&
+ !user?.settings?.isRestrictedView &&
+ user?.subscription?.type !== 'Basic'
) {
Date: Sat, 21 Feb 2026 08:37:55 +0100
Subject: [PATCH 035/224] Release 2.241.0 (#6361)
---
CHANGELOG.md | 2 +-
package-lock.json | 4 ++--
package.json | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 594b8faa1..6f485abeb 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.241.0 - 2026-02-21
### Changed
diff --git a/package-lock.json b/package-lock.json
index 636147048..2a6d30cc8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "ghostfolio",
- "version": "2.240.0",
+ "version": "2.241.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ghostfolio",
- "version": "2.240.0",
+ "version": "2.241.0",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {
diff --git a/package.json b/package.json
index 4bfdd1cb1..3dcfde537 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ghostfolio",
- "version": "2.240.0",
+ "version": "2.241.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",
From ec92116acc0ec327c24622dd79b3ef58197accf0 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 22 Feb 2026 08:59:52 +0100
Subject: [PATCH 036/224] Task/remove unused OnDestroy hook in admin page
component (#6366)
* Remove unused OnDestroy hook
---
.../src/app/pages/admin/admin-page.component.ts | 12 ++----------
1 file changed, 2 insertions(+), 10 deletions(-)
diff --git a/apps/client/src/app/pages/admin/admin-page.component.ts b/apps/client/src/app/pages/admin/admin-page.component.ts
index b9243dcb9..284d3c41d 100644
--- a/apps/client/src/app/pages/admin/admin-page.component.ts
+++ b/apps/client/src/app/pages/admin/admin-page.component.ts
@@ -1,7 +1,7 @@
import { TabConfiguration } from '@ghostfolio/common/interfaces';
import { internalRoutes } from '@ghostfolio/common/routes/routes';
-import { Component, OnDestroy, OnInit } from '@angular/core';
+import { Component, OnInit } from '@angular/core';
import { MatTabsModule } from '@angular/material/tabs';
import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
@@ -14,7 +14,6 @@ import {
settingsOutline
} from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
@Component({
host: { class: 'page has-tabs' },
@@ -23,12 +22,10 @@ import { Subject } from 'rxjs';
styleUrls: ['./admin-page.scss'],
templateUrl: './admin-page.html'
})
-export class AdminPageComponent implements OnDestroy, OnInit {
+export class AdminPageComponent implements OnInit {
public deviceType: string;
public tabs: TabConfiguration[] = [];
- private unsubscribeSubject = new Subject();
-
public constructor(private deviceService: DeviceDetectorService) {
addIcons({
flashOutline,
@@ -74,9 +71,4 @@ export class AdminPageComponent implements OnDestroy, OnInit {
}
];
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From e3579f6811df4e83f7e566f57b7a8b94f971b7f2 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 22 Feb 2026 09:00:45 +0100
Subject: [PATCH 037/224] Task/add missing OnDestroy hook in user account
registration dialog (#6368)
* Add missing OnDestroy hook
---
.../user-account-registration-dialog.component.ts | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.component.ts b/apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.component.ts
index a7707ad3b..4cc0f52f8 100644
--- a/apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.component.ts
+++ b/apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.component.ts
@@ -9,6 +9,7 @@ import {
Component,
CUSTOM_ELEMENTS_SCHEMA,
Inject,
+ OnDestroy,
ViewChild
} from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
@@ -52,7 +53,7 @@ import { UserAccountRegistrationDialogParams } from './interfaces/interfaces';
styleUrls: ['./user-account-registration-dialog.scss'],
templateUrl: 'user-account-registration-dialog.html'
})
-export class GfUserAccountRegistrationDialogComponent {
+export class GfUserAccountRegistrationDialogComponent implements OnDestroy {
@ViewChild(MatStepper) stepper!: MatStepper;
public accessToken: string;
@@ -95,4 +96,9 @@ export class GfUserAccountRegistrationDialogComponent {
public onChangeDislaimerChecked() {
this.isDisclaimerChecked = !this.isDisclaimerChecked;
}
+
+ public ngOnDestroy() {
+ this.unsubscribeSubject.next();
+ this.unsubscribeSubject.complete();
+ }
}
From 5acbe25d2504a675043199a2c3cc5ab62a33e58d Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 22 Feb 2026 09:01:48 +0100
Subject: [PATCH 038/224] Task/clean up changelog (#6362)
* Clean up
---
CHANGELOG.md | 1 -
1 file changed, 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6f485abeb..2627f1a19 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,7 +19,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Fixed an issue with `balanceInBaseCurrency` of the accounts in the value redaction interceptor for the impersonation mode
- Fixed an issue with `comment` of the accounts in the value redaction interceptor for the impersonation mode
- Fixed an issue with `dividendInBaseCurrency` of the accounts in the value redaction interceptor for the impersonation mode
-- Fixed an issue with `dividendInBaseCurrency` of the accounts in the value redaction interceptor for the impersonation mode
- Fixed an issue with `interestInBaseCurrency` of the accounts in the value redaction interceptor for the impersonation mode
- Fixed an issue with `value` of the accounts in the value redaction interceptor for the impersonation mode
From 97915a3ca9acaece4da9f844c566fad4fd4643ea Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 22 Feb 2026 09:02:37 +0100
Subject: [PATCH 039/224] Bugfix/fix page size for presets in market data table
of admin control panel (#6363)
* Fix page size for presets
* Update changelog
---
CHANGELOG.md | 6 ++++++
.../admin-market-data/admin-market-data.component.ts | 2 +-
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2627f1a19..f4a857ab3 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
+
+### Fixed
+
+- Fixed the page size for presets in the historical market data table of the admin control panel
+
## 2.241.0 - 2026-02-21
### Changed
diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
index 6a079c20a..0beca6f3c 100644
--- a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
+++ b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
@@ -379,7 +379,7 @@ export class GfAdminMarketDataComponent
this.pageSize =
this.activeFilters.length === 1 &&
this.activeFilters[0].type === 'PRESET_ID'
- ? undefined
+ ? Number.MAX_SAFE_INTEGER
: DEFAULT_PAGE_SIZE;
if (pageIndex === 0 && this.paginator) {
From 4897f34d51e0451b18a88cded85c5bfd41d009e0 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 22 Feb 2026 10:31:59 +0100
Subject: [PATCH 040/224] Task/change account field to optional in create or
update activity dialog (#6371)
* Change account field to optional for every case
* Update changelog
---
CHANGELOG.md | 4 ++++
.../create-or-update-activity-dialog.component.ts | 15 +--------------
.../create-or-update-activity-dialog.html | 8 ++------
3 files changed, 7 insertions(+), 20 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f4a857ab3..ecd2ce5c8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
+### Changed
+
+- Changed the account field to optional in the create or update activity dialog
+
### Fixed
- Fixed the page size for presets in the historical market data table of the admin control panel
diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts
index 8695f04ed..fc42a504d 100644
--- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts
+++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts
@@ -188,8 +188,7 @@ export class GfCreateOrUpdateActivityDialogComponent implements OnDestroy {
!this.data.activity?.accountId &&
this.mode === 'create'
? this.data.accounts[0].id
- : this.data.activity?.accountId,
- Validators.required
+ : this.data.activity?.accountId
],
assetClass: [this.data.activity?.SymbolProfile?.assetClass],
assetSubClass: [this.data.activity?.SymbolProfile?.assetSubClass],
@@ -365,11 +364,6 @@ export class GfCreateOrUpdateActivityDialogComponent implements OnDestroy {
(this.activityForm.get('dataSource').value === 'MANUAL' &&
type === 'BUY')
) {
- this.activityForm
- .get('accountId')
- .removeValidators(Validators.required);
- this.activityForm.get('accountId').updateValueAndValidity();
-
const currency =
this.data.accounts.find(({ id }) => {
return id === this.activityForm.get('accountId').value;
@@ -397,11 +391,6 @@ export class GfCreateOrUpdateActivityDialogComponent implements OnDestroy {
this.activityForm.get('updateAccountBalance').disable();
this.activityForm.get('updateAccountBalance').setValue(false);
} else if (['FEE', 'INTEREST', 'LIABILITY'].includes(type)) {
- this.activityForm
- .get('accountId')
- .removeValidators(Validators.required);
- this.activityForm.get('accountId').updateValueAndValidity();
-
const currency =
this.data.accounts.find(({ id }) => {
return id === this.activityForm.get('accountId').value;
@@ -447,8 +436,6 @@ export class GfCreateOrUpdateActivityDialogComponent implements OnDestroy {
this.activityForm.get('updateAccountBalance').setValue(false);
}
} else {
- this.activityForm.get('accountId').setValidators(Validators.required);
- this.activityForm.get('accountId').updateValueAndValidity();
this.activityForm
.get('dataSource')
.setValidators(Validators.required);
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 42fbd0ebf..278ddcbbd 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
@@ -84,12 +84,8 @@
>
Account
- @if (
- !activityForm.get('accountId').hasValidator(Validators.required) ||
- (!activityForm.get('accountId').value && mode === 'update')
- ) {
-
- }
+
+
@for (account of data.accounts; track account) {
From 3eb9d53220dd158917281db85c62dc23876e36e9 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 22 Feb 2026 10:45:14 +0100
Subject: [PATCH 041/224] Bugfix/validation of valuables (#6372)
* Fix validation of valuables
* Update changelog
---
CHANGELOG.md | 1 +
.../services/data-provider/data-provider.service.ts | 12 ++++++++----
2 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ecd2ce5c8..34aff43e1 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
### Fixed
+- Fixed a validation issue for valuables used in the create and import activity logic
- Fixed the page size for presets in the historical market data table of the admin control panel
## 2.241.0 - 2026-02-21
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 eb9816c67..8ee8761c0 100644
--- a/apps/api/src/services/data-provider/data-provider.service.ts
+++ b/apps/api/src/services/data-provider/data-provider.service.ts
@@ -244,11 +244,15 @@ export class DataProviderService implements OnModuleInit {
});
if (!assetProfiles[assetProfileIdentifier]) {
- if (['FEE', 'INTEREST', 'LIABILITY'].includes(type)) {
+ if (
+ (dataSource === DataSource.MANUAL && type === 'BUY') ||
+ ['FEE', 'INTEREST', 'LIABILITY'].includes(type)
+ ) {
const assetProfileInImport = assetProfilesWithMarketDataDto?.find(
- (profile) => {
+ (assetProfile) => {
return (
- profile.dataSource === dataSource && profile.symbol === symbol
+ assetProfile.dataSource === dataSource &&
+ assetProfile.symbol === symbol
);
}
);
@@ -257,7 +261,7 @@ export class DataProviderService implements OnModuleInit {
currency,
dataSource,
symbol,
- name: assetProfileInImport?.name
+ name: assetProfileInImport?.name ?? symbol
};
continue;
From 98891e195c569b762389723a5258c0c8c084a945 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 22 Feb 2026 11:01:18 +0100
Subject: [PATCH 042/224] Release 2.242.0 (#6375)
* Release 2.242.0
* Update changelog
---
CHANGELOG.md | 2 +-
package-lock.json | 4 ++--
package.json | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 34aff43e1..91f80d3ba 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.242.0 - 2026-02-22
### Changed
diff --git a/package-lock.json b/package-lock.json
index 2a6d30cc8..7a1ebfa67 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "ghostfolio",
- "version": "2.241.0",
+ "version": "2.242.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ghostfolio",
- "version": "2.241.0",
+ "version": "2.242.0",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {
diff --git a/package.json b/package.json
index 3dcfde537..2bf5eebe0 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ghostfolio",
- "version": "2.241.0",
+ "version": "2.242.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",
From 14f0d2bd8b827c1cc9fe5851c604b02c897fb792 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 23 Feb 2026 17:27:04 +0100
Subject: [PATCH 043/224] Task/remove unused OnDestroy hook in OSS friends page
component (#6374)
* Remove unused OnDestroy hook
---
.../about/oss-friends/oss-friends-page.component.ts | 12 ++----------
1 file changed, 2 insertions(+), 10 deletions(-)
diff --git a/apps/client/src/app/pages/about/oss-friends/oss-friends-page.component.ts b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.component.ts
index bdbbdf9a7..c2e500a52 100644
--- a/apps/client/src/app/pages/about/oss-friends/oss-friends-page.component.ts
+++ b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.component.ts
@@ -1,10 +1,9 @@
-import { Component, OnDestroy } from '@angular/core';
+import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { arrowForwardOutline } from 'ionicons/icons';
-import { Subject } from 'rxjs';
const ossFriends = require('../../../../assets/oss-friends.json');
@@ -14,17 +13,10 @@ const ossFriends = require('../../../../assets/oss-friends.json');
styleUrls: ['./oss-friends-page.scss'],
templateUrl: './oss-friends-page.html'
})
-export class GfOpenSourceSoftwareFriendsPageComponent implements OnDestroy {
+export class GfOpenSourceSoftwareFriendsPageComponent {
public ossFriends = ossFriends.data;
- private unsubscribeSubject = new Subject
();
-
public constructor() {
addIcons({ arrowForwardOutline });
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From c7cfc87e208d584d43875c7c336a0e171f65d371 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 23 Feb 2026 17:29:32 +0100
Subject: [PATCH 044/224] Task/remove unused OnDestroy hook in changelog page
component (#6373)
* Remove unused OnDestroy hook
---
.../about/changelog/changelog-page.component.ts | 12 ++----------
1 file changed, 2 insertions(+), 10 deletions(-)
diff --git a/apps/client/src/app/pages/about/changelog/changelog-page.component.ts b/apps/client/src/app/pages/about/changelog/changelog-page.component.ts
index 69b397370..d7f583bd1 100644
--- a/apps/client/src/app/pages/about/changelog/changelog-page.component.ts
+++ b/apps/client/src/app/pages/about/changelog/changelog-page.component.ts
@@ -1,7 +1,6 @@
-import { Component, OnDestroy } from '@angular/core';
+import { Component } from '@angular/core';
import { MarkdownModule } from 'ngx-markdown';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
-import { Subject } from 'rxjs';
@Component({
imports: [MarkdownModule, NgxSkeletonLoaderModule],
@@ -9,17 +8,10 @@ import { Subject } from 'rxjs';
styleUrls: ['./changelog-page.scss'],
templateUrl: './changelog-page.html'
})
-export class GfChangelogPageComponent implements OnDestroy {
+export class GfChangelogPageComponent {
public isLoading = true;
- private unsubscribeSubject = new Subject();
-
public onLoad() {
this.isLoading = false;
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From f5d99bad241440651f9fe473d3f2113b44635400 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 23 Feb 2026 20:05:04 +0100
Subject: [PATCH 045/224] Bugfix/create activities of type fee, interest or
liability (#6378)
* Fix creation of activities with type FEE, INTEREST or LIABILITY
* Update changelog
---
CHANGELOG.md | 6 ++++++
.../create-or-update-activity-dialog.component.ts | 9 +++++----
2 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 91f80d3ba..160b4cbf0 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
+
+### Fixed
+
+- Fixed an issue when creating activities of type `FEE`, `INTEREST` or `LIABILITY`
+
## 2.242.0 - 2026-02-22
### Changed
diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts
index fc42a504d..c7cd63191 100644
--- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts
+++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts
@@ -501,11 +501,12 @@ export class GfCreateOrUpdateActivityDialogComponent implements OnDestroy {
comment: this.activityForm.get('comment').value || null,
currency: this.activityForm.get('currency').value,
customCurrency: this.activityForm.get('currencyOfUnitPrice').value,
+ dataSource: ['FEE', 'INTEREST', 'LIABILITY', 'VALUABLE'].includes(
+ this.activityForm.get('type').value
+ )
+ ? 'MANUAL'
+ : this.activityForm.get('dataSource').value,
date: this.activityForm.get('date').value,
- dataSource:
- this.activityForm.get('type').value === 'VALUABLE'
- ? 'MANUAL'
- : this.activityForm.get('dataSource').value,
fee: this.activityForm.get('fee').value,
quantity: this.activityForm.get('quantity').value,
symbol:
From 7bcd18711a3cae44636f6877a3005faf5c97d193 Mon Sep 17 00:00:00 2001
From: Vic Chen
Date: Tue, 24 Feb 2026 03:17:31 +0800
Subject: [PATCH 046/224] Task/improve language localization for ZH 20260217
(#6348)
* Improve language localization for ZH
* Update changelog
---
CHANGELOG.md | 4 ++++
apps/client/src/locales/messages.zh.xlf | 8 ++++----
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 160b4cbf0..b87e4822d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
+### Changed
+
+- Improved the language localization for Chinese (`zh`)
+
### Fixed
- Fixed an issue when creating activities of type `FEE`, `INTEREST` or `LIABILITY`
diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf
index 9feb0e546..67007cdef 100644
--- a/apps/client/src/locales/messages.zh.xlf
+++ b/apps/client/src/locales/messages.zh.xlf
@@ -7891,7 +7891,7 @@
Fee Ratio (legacy)
- 费率
+ 费率(旧版)
apps/client/src/app/pages/i18n/i18n-page.html
152
@@ -7915,7 +7915,7 @@
Fee Ratio
- Fee Ratio
+ 费率
apps/client/src/app/pages/i18n/i18n-page.html
161
@@ -7923,7 +7923,7 @@
The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
- The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
+ 费用已超过您总投资金额的 ${thresholdMax}%(${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
163
@@ -7931,7 +7931,7 @@
The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
- The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
+ 费用未超过您总投资金额的 ${thresholdMax}%(${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
167
From 236e1aacf56e9d876f17ebdcef4328a4141fa034 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 23 Feb 2026 20:29:07 +0100
Subject: [PATCH 047/224] Task/upgrade nestjs to version 11.1.14 (#6379)
* Upgrade nestjs to version 11.1.14
* Update changelog
---
CHANGELOG.md | 1 +
package-lock.json | 223 +++++++++++++++++++---------------------------
package.json | 16 ++--
3 files changed, 100 insertions(+), 140 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b87e4822d..a482c10e8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- Improved the language localization for Chinese (`zh`)
+- Upgraded `nestjs` from version `11.1.8` to `11.1.14`
### Fixed
diff --git a/package-lock.json b/package-lock.json
index 7a1ebfa67..9d022919b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -27,15 +27,15 @@
"@ionic/angular": "8.7.8",
"@keyv/redis": "4.4.0",
"@nestjs/bull": "11.0.4",
- "@nestjs/cache-manager": "3.0.1",
- "@nestjs/common": "11.1.8",
- "@nestjs/config": "4.0.2",
- "@nestjs/core": "11.1.8",
+ "@nestjs/cache-manager": "3.1.0",
+ "@nestjs/common": "11.1.14",
+ "@nestjs/config": "4.0.3",
+ "@nestjs/core": "11.1.14",
"@nestjs/event-emitter": "3.0.1",
- "@nestjs/jwt": "11.0.1",
+ "@nestjs/jwt": "11.0.2",
"@nestjs/passport": "11.0.5",
- "@nestjs/platform-express": "11.1.8",
- "@nestjs/schedule": "6.0.1",
+ "@nestjs/platform-express": "11.1.14",
+ "@nestjs/schedule": "6.1.1",
"@nestjs/serve-static": "5.0.4",
"@openrouter/ai-sdk-provider": "0.7.2",
"@prisma/client": "6.19.0",
@@ -107,7 +107,7 @@
"@eslint/eslintrc": "3.3.1",
"@eslint/js": "9.35.0",
"@nestjs/schematics": "11.0.9",
- "@nestjs/testing": "11.1.8",
+ "@nestjs/testing": "11.1.14",
"@nx/angular": "22.4.5",
"@nx/eslint-plugin": "22.4.5",
"@nx/jest": "22.4.5",
@@ -3617,6 +3617,16 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@borewit/text-codec": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.1.tgz",
+ "integrity": "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
"node_modules/@braintree/sanitize-url": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz",
@@ -7531,9 +7541,9 @@
}
},
"node_modules/@nestjs/cache-manager": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@nestjs/cache-manager/-/cache-manager-3.0.1.tgz",
- "integrity": "sha512-4UxTnR0fsmKL5YDalU2eLFVnL+OBebWUpX+hEduKGncrVKH4PPNoiRn1kXyOCjmzb0UvWgqubpssNouc8e0MCw==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@nestjs/cache-manager/-/cache-manager-3.1.0.tgz",
+ "integrity": "sha512-pEIqYZrBcE8UdkJmZRduurvoUfdU+3kRPeO1R2muiMbZnRuqlki5klFFNllO9LyYWzrx98bd1j0PSPKSJk1Wbw==",
"license": "MIT",
"peerDependencies": {
"@nestjs/common": "^9.0.0 || ^10.0.0 || ^11.0.0",
@@ -7544,12 +7554,12 @@
}
},
"node_modules/@nestjs/common": {
- "version": "11.1.8",
- "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.8.tgz",
- "integrity": "sha512-bbsOqwld/GdBfiRNc4nnjyWWENDEicq4SH+R5AuYatvf++vf1x5JIsHB1i1KtfZMD3eRte0D4K9WXuAYil6XAg==",
+ "version": "11.1.14",
+ "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.14.tgz",
+ "integrity": "sha512-IN/tlqd7Nl9gl6f0jsWEuOrQDaCI9vHzxv0fisHysfBQzfQIkqlv5A7w4Qge02BUQyczXT9HHPgHtWHCxhjRng==",
"license": "MIT",
"dependencies": {
- "file-type": "21.0.0",
+ "file-type": "21.3.0",
"iterare": "1.2.1",
"load-esm": "1.0.3",
"tslib": "2.8.1",
@@ -7575,57 +7585,24 @@
}
},
"node_modules/@nestjs/config": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-4.0.2.tgz",
- "integrity": "sha512-McMW6EXtpc8+CwTUwFdg6h7dYcBUpH5iUILCclAsa+MbCEvC9ZKu4dCHRlJqALuhjLw97pbQu62l4+wRwGeZqA==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-4.0.3.tgz",
+ "integrity": "sha512-FQ3M3Ohqfl+nHAn5tp7++wUQw0f2nAk+SFKe8EpNRnIifPqvfJP6JQxPKtFLMOHbyer4X646prFG4zSRYEssQQ==",
"license": "MIT",
"dependencies": {
- "dotenv": "16.4.7",
- "dotenv-expand": "12.0.1",
- "lodash": "4.17.21"
+ "dotenv": "17.2.3",
+ "dotenv-expand": "12.0.3",
+ "lodash": "4.17.23"
},
"peerDependencies": {
"@nestjs/common": "^10.0.0 || ^11.0.0",
"rxjs": "^7.1.0"
}
},
- "node_modules/@nestjs/config/node_modules/dotenv": {
- "version": "16.4.7",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
- "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://dotenvx.com"
- }
- },
- "node_modules/@nestjs/config/node_modules/dotenv-expand": {
- "version": "12.0.1",
- "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.1.tgz",
- "integrity": "sha512-LaKRbou8gt0RNID/9RoI+J2rvXsBRPMV7p+ElHlPhcSARbCPDYcYG2s1TIzAfWv4YSgyY5taidWzzs31lNV3yQ==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "dotenv": "^16.4.5"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://dotenvx.com"
- }
- },
- "node_modules/@nestjs/config/node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "license": "MIT"
- },
"node_modules/@nestjs/core": {
- "version": "11.1.8",
- "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.8.tgz",
- "integrity": "sha512-7riWfmTmMhCJHZ5ZiaG+crj4t85IPCq/wLRuOUSigBYyFT2JZj0lVHtAdf4Davp9ouNI8GINBDt9h9b5Gz9nTw==",
+ "version": "11.1.14",
+ "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.14.tgz",
+ "integrity": "sha512-7OXPPMoDr6z+5NkoQKu4hOhfjz/YYqM3bNilPqv1WVFWrzSmuNXxvhbX69YMmNmRYascPXiwESqf5jJdjKXEww==",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
@@ -7677,13 +7654,13 @@
}
},
"node_modules/@nestjs/jwt": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-11.0.1.tgz",
- "integrity": "sha512-HXSsc7SAnCnjA98TsZqrE7trGtHDnYXWp4Ffy6LwSmck1QvbGYdMzBquXofX5l6tIRpeY4Qidl2Ti2CVG77Pdw==",
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-11.0.2.tgz",
+ "integrity": "sha512-rK8aE/3/Ma45gAWfCksAXUNbOoSOUudU0Kn3rT39htPF7wsYXtKfjALKeKKJbFrIWbLjsbqfXX5bIJNvgBugGA==",
"license": "MIT",
"dependencies": {
"@types/jsonwebtoken": "9.0.10",
- "jsonwebtoken": "9.0.2"
+ "jsonwebtoken": "9.0.3"
},
"peerDependencies": {
"@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0"
@@ -7700,13 +7677,13 @@
}
},
"node_modules/@nestjs/platform-express": {
- "version": "11.1.8",
- "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.8.tgz",
- "integrity": "sha512-rL6pZH9BW7BnL5X2eWbJMtt86uloAKjFgyY5+L2UkizgfEp7rgAs0+Z1z0BcW2Pgu5+q8O7RKPNyHJ/9ZNz/ZQ==",
+ "version": "11.1.14",
+ "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.14.tgz",
+ "integrity": "sha512-Fs+/j+mBSBSXErOQJ/YdUn/HqJGSJ4pGfiJyYOyz04l42uNVnqEakvu1kXLbxMabR6vd6/h9d6Bi4tso9p7o4Q==",
"license": "MIT",
"dependencies": {
- "cors": "2.8.5",
- "express": "5.1.0",
+ "cors": "2.8.6",
+ "express": "5.2.1",
"multer": "2.0.2",
"path-to-regexp": "8.3.0",
"tslib": "2.8.1"
@@ -7721,12 +7698,12 @@
}
},
"node_modules/@nestjs/schedule": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-6.0.1.tgz",
- "integrity": "sha512-v3yO6cSPAoBSSyH67HWnXHzuhPhSNZhRmLY38JvCt2sqY8sPMOODpcU1D79iUMFf7k16DaMEbL4Mgx61ZhiC8Q==",
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-6.1.1.tgz",
+ "integrity": "sha512-kQl1RRgi02GJ0uaUGCrXHCcwISsCsJDciCKe38ykJZgnAeeoeVWs8luWtBo4AqAAXm4nS5K8RlV0smHUJ4+2FA==",
"license": "MIT",
"dependencies": {
- "cron": "4.3.3"
+ "cron": "4.4.0"
},
"peerDependencies": {
"@nestjs/common": "^10.0.0 || ^11.0.0",
@@ -7910,9 +7887,9 @@
}
},
"node_modules/@nestjs/testing": {
- "version": "11.1.8",
- "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.8.tgz",
- "integrity": "sha512-E6K+0UTKztcPxJzLnQa7S34lFjZbrj3Z1r7c5y5WDrL1m5HD1H4AeyBhicHgdaFmxjLAva2bq0sYKy/S7cdeYA==",
+ "version": "11.1.14",
+ "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.14.tgz",
+ "integrity": "sha512-cQxX0ronsTbpfHz8/LYOVWXxoTxv6VoxrnuZoQaVX7QV2PSMqxWE7/9jSQR0GcqAFUEmFP34c6EJqfkjfX/k4Q==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -12408,14 +12385,13 @@
}
},
"node_modules/@tokenizer/inflate": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.2.7.tgz",
- "integrity": "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz",
+ "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==",
"license": "MIT",
"dependencies": {
- "debug": "^4.4.0",
- "fflate": "^0.8.2",
- "token-types": "^6.0.0"
+ "debug": "^4.4.3",
+ "token-types": "^6.1.1"
},
"engines": {
"node": ">=18"
@@ -16984,9 +16960,9 @@
"license": "MIT"
},
"node_modules/cors": {
- "version": "2.8.5",
- "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
- "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "version": "2.8.6",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz",
+ "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==",
"license": "MIT",
"dependencies": {
"object-assign": "^4",
@@ -16994,6 +16970,10 @@
},
"engines": {
"node": ">= 0.10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/corser": {
@@ -17073,9 +17053,9 @@
"license": "MIT"
},
"node_modules/cron": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/cron/-/cron-4.3.3.tgz",
- "integrity": "sha512-B/CJj5yL3sjtlun6RtYHvoSB26EmQ2NUmhq9ZiJSyKIM4K/fqfh9aelDFlIayD2YMeFZqWLi9hHV+c+pq2Djkw==",
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/cron/-/cron-4.4.0.tgz",
+ "integrity": "sha512-fkdfq+b+AHI4cKdhZlppHveI/mgz2qpiYxcm+t5E5TsxX7QrLS1VE0+7GENEk9z0EeGPcpSciGv6ez24duWhwQ==",
"license": "MIT",
"dependencies": {
"@types/luxon": "~3.7.0",
@@ -17083,6 +17063,10 @@
},
"engines": {
"node": ">=18.x"
+ },
+ "funding": {
+ "type": "ko-fi",
+ "url": "https://ko-fi.com/intcreator"
}
},
"node_modules/cron-parser": {
@@ -19852,18 +19836,19 @@
"license": "Apache-2.0"
},
"node_modules/express": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
- "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
+ "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
"license": "MIT",
"dependencies": {
"accepts": "^2.0.0",
- "body-parser": "^2.2.0",
+ "body-parser": "^2.2.1",
"content-disposition": "^1.0.0",
"content-type": "^1.0.5",
"cookie": "^0.7.1",
"cookie-signature": "^1.2.1",
"debug": "^4.4.0",
+ "depd": "^2.0.0",
"encodeurl": "^2.0.0",
"escape-html": "^1.0.3",
"etag": "^1.8.1",
@@ -20129,12 +20114,6 @@
"filenamify-url": "2.1.2"
}
},
- "node_modules/fflate": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz",
- "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==",
- "license": "MIT"
- },
"node_modules/figures": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
@@ -20175,14 +20154,14 @@
}
},
"node_modules/file-type": {
- "version": "21.0.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.0.0.tgz",
- "integrity": "sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg==",
+ "version": "21.3.0",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.0.tgz",
+ "integrity": "sha512-8kPJMIGz1Yt/aPEwOsrR97ZyZaD1Iqm8PClb1nYFclUCkBi0Ma5IsYNQzvSFS9ib51lWyIw5mIT9rWzI/xjpzA==",
"license": "MIT",
"dependencies": {
- "@tokenizer/inflate": "^0.2.7",
- "strtok3": "^10.2.2",
- "token-types": "^6.0.0",
+ "@tokenizer/inflate": "^0.4.1",
+ "strtok3": "^10.3.4",
+ "token-types": "^6.1.1",
"uint8array-extras": "^1.4.0"
},
"engines": {
@@ -24592,12 +24571,12 @@
}
},
"node_modules/jsonwebtoken": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
- "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz",
+ "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==",
"license": "MIT",
"dependencies": {
- "jws": "^3.2.2",
+ "jws": "^4.0.1",
"lodash.includes": "^4.3.0",
"lodash.isboolean": "^3.0.3",
"lodash.isinteger": "^4.0.4",
@@ -24613,27 +24592,6 @@
"npm": ">=6"
}
},
- "node_modules/jsonwebtoken/node_modules/jwa": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz",
- "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==",
- "license": "MIT",
- "dependencies": {
- "buffer-equal-constant-time": "^1.0.1",
- "ecdsa-sig-formatter": "1.0.11",
- "safe-buffer": "^5.0.1"
- }
- },
- "node_modules/jsonwebtoken/node_modules/jws": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.3.tgz",
- "integrity": "sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==",
- "license": "MIT",
- "dependencies": {
- "jwa": "^1.4.2",
- "safe-buffer": "^5.0.1"
- }
- },
"node_modules/jsonwebtoken/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -32900,11 +32858,12 @@
}
},
"node_modules/token-types": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.0.4.tgz",
- "integrity": "sha512-MD9MjpVNhVyH4fyd5rKphjvt/1qj+PtQUz65aFqAZA6XniWAuSFRjLk3e2VALEFlh9OwBpXUN7rfeqSnT/Fmkw==",
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz",
+ "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==",
"license": "MIT",
"dependencies": {
+ "@borewit/text-codec": "^0.2.1",
"@tokenizer/token": "^0.3.0",
"ieee754": "^1.2.1"
},
@@ -33690,9 +33649,9 @@
"license": "MIT"
},
"node_modules/uint8array-extras": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.4.0.tgz",
- "integrity": "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz",
+ "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==",
"license": "MIT",
"engines": {
"node": ">=18"
diff --git a/package.json b/package.json
index 2bf5eebe0..5f80c3627 100644
--- a/package.json
+++ b/package.json
@@ -72,15 +72,15 @@
"@ionic/angular": "8.7.8",
"@keyv/redis": "4.4.0",
"@nestjs/bull": "11.0.4",
- "@nestjs/cache-manager": "3.0.1",
- "@nestjs/common": "11.1.8",
- "@nestjs/config": "4.0.2",
- "@nestjs/core": "11.1.8",
+ "@nestjs/cache-manager": "3.1.0",
+ "@nestjs/common": "11.1.14",
+ "@nestjs/config": "4.0.3",
+ "@nestjs/core": "11.1.14",
"@nestjs/event-emitter": "3.0.1",
- "@nestjs/jwt": "11.0.1",
+ "@nestjs/jwt": "11.0.2",
"@nestjs/passport": "11.0.5",
- "@nestjs/platform-express": "11.1.8",
- "@nestjs/schedule": "6.0.1",
+ "@nestjs/platform-express": "11.1.14",
+ "@nestjs/schedule": "6.1.1",
"@nestjs/serve-static": "5.0.4",
"@openrouter/ai-sdk-provider": "0.7.2",
"@prisma/client": "6.19.0",
@@ -152,7 +152,7 @@
"@eslint/eslintrc": "3.3.1",
"@eslint/js": "9.35.0",
"@nestjs/schematics": "11.0.9",
- "@nestjs/testing": "11.1.8",
+ "@nestjs/testing": "11.1.14",
"@nx/angular": "22.4.5",
"@nx/eslint-plugin": "22.4.5",
"@nx/jest": "22.4.5",
From cc92ecf62a014b27146338bb7a20ed6eeb525fba Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 23 Feb 2026 20:30:53 +0100
Subject: [PATCH 048/224] Release 2.243.0 (#6384)
---
CHANGELOG.md | 2 +-
package-lock.json | 4 ++--
package.json | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a482c10e8..f806a260e 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.243.0 - 2026-02-23
### Changed
diff --git a/package-lock.json b/package-lock.json
index 9d022919b..fadeca52d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "ghostfolio",
- "version": "2.242.0",
+ "version": "2.243.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ghostfolio",
- "version": "2.242.0",
+ "version": "2.243.0",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {
diff --git a/package.json b/package.json
index 5f80c3627..ad615c3a0 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ghostfolio",
- "version": "2.242.0",
+ "version": "2.243.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",
From 90cc7af87c10a4bfc9eb00b218b2046b246c3aa6 Mon Sep 17 00:00:00 2001
From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com>
Date: Tue, 24 Feb 2026 23:42:41 +0400
Subject: [PATCH 049/224] Task/improve type safety in fire calculator component
(#6385)
* fix(lib): resolve typescript errors
* fix(lib): make unsubscribeSubject readonly
* feat(lib): migrate outputs to signals
* feat(lib): implement takeUntilDestroyed
* feat(lib): add linebreak
---
.../fire-calculator.component.ts | 128 ++++++++++--------
1 file changed, 72 insertions(+), 56 deletions(-)
diff --git a/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts b/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
index 7461f6729..8b472fc47 100644
--- a/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
+++ b/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
@@ -13,13 +13,13 @@ import {
ChangeDetectorRef,
Component,
ElementRef,
- EventEmitter,
Input,
OnChanges,
OnDestroy,
- Output,
- ViewChild
+ ViewChild,
+ output
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import {
FormBuilder,
FormControl,
@@ -55,9 +55,9 @@ import {
startOfMonth,
sub
} from 'date-fns';
-import { isNumber } from 'lodash';
+import { isNil, isNumber } from 'lodash';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
-import { Subject, debounceTime, takeUntil } from 'rxjs';
+import { debounceTime } from 'rxjs';
import { FireCalculatorService } from './fire-calculator.service';
@@ -90,32 +90,31 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
@Input() retirementDate: Date;
@Input() savingsRate = 0;
- @Output() annualInterestRateChanged = new EventEmitter();
- @Output() calculationCompleted =
- new EventEmitter();
- @Output() projectedTotalAmountChanged = new EventEmitter();
- @Output() retirementDateChanged = new EventEmitter();
- @Output() savingsRateChanged = new EventEmitter();
-
@ViewChild('chartCanvas') chartCanvas: ElementRef;
public calculatorForm = this.formBuilder.group({
- annualInterestRate: new FormControl(undefined),
- paymentPerPeriod: new FormControl(undefined),
- principalInvestmentAmount: new FormControl(undefined),
- projectedTotalAmount: new FormControl(undefined),
- retirementDate: new FormControl(undefined)
+ annualInterestRate: new FormControl(null),
+ paymentPerPeriod: new FormControl(null),
+ principalInvestmentAmount: new FormControl(null),
+ projectedTotalAmount: new FormControl(null),
+ retirementDate: new FormControl(null)
});
public chart: Chart<'bar'>;
public isLoading = true;
public minDate = addDays(new Date(), 1);
public periodsToRetire = 0;
+ protected readonly annualInterestRateChanged = output();
+ protected readonly calculationCompleted =
+ output();
+ protected readonly projectedTotalAmountChanged = output();
+ protected readonly retirementDateChanged = output();
+ protected readonly savingsRateChanged = output();
+
private readonly CONTRIBUTION_PERIOD = 12;
private readonly DEFAULT_RETIREMENT_DATE = startOfMonth(
addYears(new Date(), 10)
);
- private unsubscribeSubject = new Subject();
public constructor(
private changeDetectorRef: ChangeDetectorRef,
@@ -131,46 +130,56 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
);
this.calculatorForm.valueChanges
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed())
.subscribe(() => {
this.initialize();
});
this.calculatorForm.valueChanges
- .pipe(debounceTime(500), takeUntil(this.unsubscribeSubject))
+ .pipe(debounceTime(500), takeUntilDestroyed())
.subscribe(() => {
const { projectedTotalAmount, retirementDate } =
this.calculatorForm.getRawValue();
- this.calculationCompleted.emit({
- projectedTotalAmount,
- retirementDate
- });
+ if (projectedTotalAmount !== null && retirementDate !== null) {
+ this.calculationCompleted.emit({
+ projectedTotalAmount,
+ retirementDate
+ });
+ }
});
this.calculatorForm
.get('annualInterestRate')
- .valueChanges.pipe(debounceTime(500), takeUntil(this.unsubscribeSubject))
+ ?.valueChanges.pipe(debounceTime(500), takeUntilDestroyed())
.subscribe((annualInterestRate) => {
- this.annualInterestRateChanged.emit(annualInterestRate);
+ if (annualInterestRate !== null) {
+ this.annualInterestRateChanged.emit(annualInterestRate);
+ }
});
this.calculatorForm
.get('paymentPerPeriod')
- .valueChanges.pipe(debounceTime(500), takeUntil(this.unsubscribeSubject))
+ ?.valueChanges.pipe(debounceTime(500), takeUntilDestroyed())
.subscribe((savingsRate) => {
- this.savingsRateChanged.emit(savingsRate);
+ if (savingsRate !== null) {
+ this.savingsRateChanged.emit(savingsRate);
+ }
});
this.calculatorForm
.get('projectedTotalAmount')
- .valueChanges.pipe(debounceTime(500), takeUntil(this.unsubscribeSubject))
+ ?.valueChanges.pipe(debounceTime(500), takeUntilDestroyed())
.subscribe((projectedTotalAmount) => {
- this.projectedTotalAmountChanged.emit(projectedTotalAmount);
+ if (projectedTotalAmount !== null) {
+ this.projectedTotalAmountChanged.emit(projectedTotalAmount);
+ }
});
this.calculatorForm
.get('retirementDate')
- .valueChanges.pipe(debounceTime(500), takeUntil(this.unsubscribeSubject))
+ ?.valueChanges.pipe(debounceTime(500), takeUntilDestroyed())
.subscribe((retirementDate) => {
- this.retirementDateChanged.emit(retirementDate);
+ if (retirementDate !== null) {
+ this.retirementDateChanged.emit(retirementDate);
+ }
});
}
@@ -196,11 +205,11 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
this.calculatorForm.patchValue(
{
annualInterestRate:
- this.calculatorForm.get('annualInterestRate').value,
+ this.calculatorForm.get('annualInterestRate')?.value,
paymentPerPeriod: this.getPMT(),
principalInvestmentAmount: this.calculatorForm.get(
'principalInvestmentAmount'
- ).value,
+ )?.value,
projectedTotalAmount:
Math.round(this.getProjectedTotalAmount()) || 0,
retirementDate:
@@ -210,7 +219,7 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
emitEvent: false
}
);
- this.calculatorForm.get('principalInvestmentAmount').disable();
+ this.calculatorForm.get('principalInvestmentAmount')?.disable();
this.changeDetectorRef.markForCheck();
});
@@ -219,42 +228,43 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
if (this.hasPermissionToUpdateUserSettings === true) {
this.calculatorForm
.get('annualInterestRate')
- .enable({ emitEvent: false });
- this.calculatorForm.get('paymentPerPeriod').enable({ emitEvent: false });
+ ?.enable({ emitEvent: false });
+ this.calculatorForm.get('paymentPerPeriod')?.enable({ emitEvent: false });
this.calculatorForm
.get('projectedTotalAmount')
- .enable({ emitEvent: false });
+ ?.enable({ emitEvent: false });
} else {
this.calculatorForm
.get('annualInterestRate')
- .disable({ emitEvent: false });
- this.calculatorForm.get('paymentPerPeriod').disable({ emitEvent: false });
+ ?.disable({ emitEvent: false });
+ this.calculatorForm
+ .get('paymentPerPeriod')
+ ?.disable({ emitEvent: false });
this.calculatorForm
.get('projectedTotalAmount')
- .disable({ emitEvent: false });
+ ?.disable({ emitEvent: false });
}
- this.calculatorForm.get('retirementDate').disable({ emitEvent: false });
+ this.calculatorForm.get('retirementDate')?.disable({ emitEvent: false });
}
public setMonthAndYear(
normalizedMonthAndYear: Date,
datepicker: MatDatepicker
) {
- const retirementDate = this.calculatorForm.get('retirementDate').value;
+ const retirementDate =
+ this.calculatorForm.get('retirementDate')?.value ??
+ this.DEFAULT_RETIREMENT_DATE;
const newRetirementDate = setMonth(
setYear(retirementDate, normalizedMonthAndYear.getFullYear()),
normalizedMonthAndYear.getMonth()
);
- this.calculatorForm.get('retirementDate').setValue(newRetirementDate);
+ this.calculatorForm.get('retirementDate')?.setValue(newRetirementDate);
datepicker.close();
}
public ngOnDestroy() {
this.chart?.destroy();
-
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
}
private initialize() {
@@ -288,8 +298,6 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
return `Total: ${new Intl.NumberFormat(this.locale, {
currency: this.currency,
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
- // @ts-ignore: Only supported from ES2020 or later
currencyDisplay: 'code',
style: 'currency'
}).format(totalAmount)}`;
@@ -426,12 +434,16 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
}
private getPeriodsToRetire(): number {
- if (this.calculatorForm.get('projectedTotalAmount').value) {
+ const projectedTotalAmount = this.calculatorForm.get(
+ 'projectedTotalAmount'
+ )?.value;
+
+ if (projectedTotalAmount) {
let periods = this.fireCalculatorService.calculatePeriodsToRetire({
P: this.getP(),
PMT: this.getPMT(),
r: this.getR(),
- totalAmount: this.calculatorForm.get('projectedTotalAmount').value
+ totalAmount: projectedTotalAmount
});
if (periods === Infinity) {
@@ -453,12 +465,16 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
}
private getPMT() {
- return this.calculatorForm.get('paymentPerPeriod').value;
+ return this.calculatorForm.get('paymentPerPeriod')?.value ?? 0;
}
private getProjectedTotalAmount() {
- if (this.calculatorForm.get('projectedTotalAmount').value) {
- return this.calculatorForm.get('projectedTotalAmount').value;
+ const projectedTotalAmount = this.calculatorForm.get(
+ 'projectedTotalAmount'
+ )?.value;
+
+ if (!isNil(projectedTotalAmount)) {
+ return projectedTotalAmount;
}
const { totalAmount } =
@@ -473,12 +489,12 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
}
private getR() {
- return this.calculatorForm.get('annualInterestRate').value / 100;
+ return (this.calculatorForm.get('annualInterestRate')?.value ?? 0) / 100;
}
private getRetirementDate(): Date {
if (this.periodsToRetire === Number.MAX_SAFE_INTEGER) {
- return undefined;
+ return this.DEFAULT_RETIREMENT_DATE;
}
const monthsToRetire = this.periodsToRetire % 12;
From 2e01c121e451406b0b4c47e76c84de627a9bd1b1 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Tue, 24 Feb 2026 20:43:17 +0100
Subject: [PATCH 050/224] Task/remove unused OnDestroy hook in resources page
component (#6367)
* Remove unused OnDestroy hook
---
.../src/app/pages/resources/resources-page.component.ts | 8 --------
1 file changed, 8 deletions(-)
diff --git a/apps/client/src/app/pages/resources/resources-page.component.ts b/apps/client/src/app/pages/resources/resources-page.component.ts
index 9db996f57..c25ef00d6 100644
--- a/apps/client/src/app/pages/resources/resources-page.component.ts
+++ b/apps/client/src/app/pages/resources/resources-page.component.ts
@@ -13,7 +13,6 @@ import {
readerOutline
} from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
@Component({
host: { class: 'page has-tabs' },
@@ -47,8 +46,6 @@ export class ResourcesPageComponent implements OnInit {
}
];
- private unsubscribeSubject = new Subject();
-
public constructor(private deviceService: DeviceDetectorService) {
addIcons({ bookOutline, libraryOutline, newspaperOutline, readerOutline });
}
@@ -56,9 +53,4 @@ export class ResourcesPageComponent implements OnInit {
public ngOnInit() {
this.deviceType = this.deviceService.getDeviceInfo().deviceType;
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From 386a77c8f746f9413f0cdb837a4fe234059963cf Mon Sep 17 00:00:00 2001
From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com>
Date: Wed, 25 Feb 2026 22:15:06 +0400
Subject: [PATCH 051/224] Task/improve type safety in assistant components
(#6396)
* feat(lib): resolve typescript errors in assistant
* feat(lib): resolve typescript errors in assistant list item
* feat(lib): implement output signals
* fix(lint): resolve warnings
* fix(lib): implement inject function
* fix(lib): handle errors in html files
---
.../assistant-list-item.component.ts | 24 +++--
.../assistant-list-item.html | 2 +-
.../src/lib/assistant/assistant.component.ts | 102 +++++++++---------
libs/ui/src/lib/assistant/assistant.html | 2 +-
.../portfolio-filter-form-value.interface.ts | 8 +-
5 files changed, 70 insertions(+), 68 deletions(-)
diff --git a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts
index c2ad2462e..05750cea4 100644
--- a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts
+++ b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts
@@ -7,12 +7,12 @@ import {
ChangeDetectorRef,
Component,
ElementRef,
- EventEmitter,
HostBinding,
Input,
OnChanges,
- Output,
- ViewChild
+ ViewChild,
+ inject,
+ output
} from '@angular/core';
import { Params, RouterModule } from '@angular/router';
@@ -33,21 +33,23 @@ export class GfAssistantListItemComponent
implements FocusableOption, OnChanges
{
@HostBinding('attr.tabindex') tabindex = -1;
- @HostBinding('class.has-focus') get getHasFocus() {
- return this.hasFocus;
- }
@Input() item: SearchResultItem;
- @Output() clicked = new EventEmitter();
-
- @ViewChild('link') public linkElement: ElementRef;
+ @ViewChild('link') public linkElement: ElementRef;
public hasFocus = false;
public queryParams: Params;
public routerLink: string[];
- public constructor(private changeDetectorRef: ChangeDetectorRef) {}
+ protected readonly clicked = output();
+
+ private readonly changeDetectorRef = inject(ChangeDetectorRef);
+
+ @HostBinding('class.has-focus')
+ public get getHasFocus() {
+ return this.hasFocus;
+ }
public ngOnChanges() {
if (this.item?.mode === SearchMode.ACCOUNT) {
@@ -65,7 +67,7 @@ export class GfAssistantListItemComponent
};
this.routerLink =
- internalRoutes.adminControl.subRoutes.marketData.routerLink;
+ internalRoutes.adminControl.subRoutes?.marketData.routerLink ?? [];
} else if (this.item?.mode === SearchMode.HOLDING) {
this.queryParams = {
dataSource: this.item.dataSource,
diff --git a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.html b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.html
index fd2c4011d..36179b719 100644
--- a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.html
+++ b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.html
@@ -8,7 +8,7 @@
@if (item && isAsset(item)) {
{{ item?.symbol | gfSymbol }} · {{ item?.currency }}
+ >{{ item?.symbol ?? '' | gfSymbol }} · {{ item?.currency }}
@if (item?.assetSubClassString) {
· {{ item.assetSubClassString }}
}
diff --git a/libs/ui/src/lib/assistant/assistant.component.ts b/libs/ui/src/lib/assistant/assistant.component.ts
index 2b0216613..1c67e4fa2 100644
--- a/libs/ui/src/lib/assistant/assistant.component.ts
+++ b/libs/ui/src/lib/assistant/assistant.component.ts
@@ -12,16 +12,15 @@ import {
ChangeDetectorRef,
Component,
ElementRef,
- EventEmitter,
HostListener,
Input,
OnChanges,
OnDestroy,
OnInit,
- Output,
QueryList,
ViewChild,
- ViewChildren
+ ViewChildren,
+ output
} from '@angular/core';
import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
@@ -86,37 +85,7 @@ import {
templateUrl: './assistant.html'
})
export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
- @HostListener('document:keydown', ['$event']) onKeydown(
- event: KeyboardEvent
- ) {
- if (!this.isOpen) {
- return;
- }
-
- if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
- for (const item of this.assistantListItems) {
- item.removeFocus();
- }
-
- this.keyManager.onKeydown(event);
-
- const currentAssistantListItem = this.getCurrentAssistantListItem();
-
- if (currentAssistantListItem?.linkElement) {
- currentAssistantListItem.linkElement.nativeElement?.scrollIntoView({
- behavior: 'smooth',
- block: 'center'
- });
- }
- } else if (event.key === 'Enter') {
- const currentAssistantListItem = this.getCurrentAssistantListItem();
-
- if (currentAssistantListItem?.linkElement) {
- currentAssistantListItem.linkElement.nativeElement?.click();
- event.stopPropagation();
- }
- }
- }
+ public static readonly SEARCH_RESULTS_DEFAULT_LIMIT = 5;
@Input() deviceType: string;
@Input() hasPermissionToAccessAdminControl: boolean;
@@ -124,21 +93,16 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
@Input() hasPermissionToChangeFilters: boolean;
@Input() user: User;
- @Output() closed = new EventEmitter();
- @Output() dateRangeChanged = new EventEmitter();
- @Output() filtersChanged = new EventEmitter();
-
@ViewChild('menuTrigger') menuTriggerElement: MatMenuTrigger;
- @ViewChild('search', { static: true }) searchElement: ElementRef;
+ @ViewChild('search', { static: true })
+ searchElement: ElementRef;
@ViewChildren(GfAssistantListItemComponent)
assistantListItems: QueryList;
- public static readonly SEARCH_RESULTS_DEFAULT_LIMIT = 5;
-
public accounts: AccountWithPlatform[] = [];
public assetClasses: Filter[] = [];
- public dateRangeFormControl = new FormControl(undefined);
+ public dateRangeFormControl = new FormControl(null);
public dateRangeOptions: DateRangeOption[] = [];
public holdings: PortfolioPosition[] = [];
public isLoading = {
@@ -166,6 +130,10 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
};
public tags: Filter[] = [];
+ protected readonly closed = output();
+ protected readonly dateRangeChanged = output();
+ protected readonly filtersChanged = output();
+
private readonly PRESELECTION_DELAY = 100;
private filterTypes: Filter['type'][] = [
@@ -188,6 +156,37 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
addIcons({ closeCircleOutline, closeOutline, searchOutline });
}
+ @HostListener('document:keydown', ['$event'])
+ public onKeydown(event: KeyboardEvent) {
+ if (!this.isOpen) {
+ return;
+ }
+
+ if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
+ for (const item of this.assistantListItems) {
+ item.removeFocus();
+ }
+
+ this.keyManager.onKeydown(event);
+
+ const currentAssistantListItem = this.getCurrentAssistantListItem();
+
+ if (currentAssistantListItem?.linkElement) {
+ currentAssistantListItem.linkElement.nativeElement?.scrollIntoView({
+ behavior: 'smooth',
+ block: 'center'
+ });
+ }
+ } else if (event.key === 'Enter') {
+ const currentAssistantListItem = this.getCurrentAssistantListItem();
+
+ if (currentAssistantListItem?.linkElement) {
+ currentAssistantListItem.linkElement.nativeElement?.click();
+ event.stopPropagation();
+ }
+ }
+ }
+
public ngOnInit() {
this.assetClasses = Object.keys(AssetClass).map((assetClass) => {
return {
@@ -482,7 +481,7 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
.subscribe(({ holdings }) => {
this.holdings = holdings
.filter(({ assetSubClass }) => {
- return !['CASH'].includes(assetSubClass);
+ return assetSubClass && !['CASH'].includes(assetSubClass);
})
.sort((a, b) => {
return a.name?.localeCompare(b.name);
@@ -499,23 +498,23 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
this.filtersChanged.emit([
{
- id: filterValue?.account,
+ id: filterValue?.account ?? '',
type: 'ACCOUNT'
},
{
- id: filterValue?.assetClass,
+ id: filterValue?.assetClass ?? '',
type: 'ASSET_CLASS'
},
{
- id: filterValue?.holding?.dataSource,
+ id: filterValue?.holding?.dataSource ?? '',
type: 'DATA_SOURCE'
},
{
- id: filterValue?.holding?.symbol,
+ id: filterValue?.holding?.symbol ?? '',
type: 'SYMBOL'
},
{
- id: filterValue?.tag,
+ id: filterValue?.tag ?? '',
type: 'TAG'
}
]);
@@ -541,7 +540,7 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
this.filterTypes.map((type) => {
return {
type,
- id: null
+ id: ''
};
})
);
@@ -673,7 +672,7 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
dataSource,
name,
symbol,
- assetSubClassString: translate(assetSubClass),
+ assetSubClassString: translate(assetSubClass ?? ''),
mode: SearchMode.ASSET_PROFILE as const
};
}
@@ -705,7 +704,7 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
dataSource,
name,
symbol,
- assetSubClassString: translate(assetSubClass),
+ assetSubClassString: translate(assetSubClass ?? ''),
mode: SearchMode.HOLDING as const
};
}
@@ -755,6 +754,7 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
const symbol = this.user?.settings?.['filters.symbol'];
const selectedHolding = this.holdings.find((holding) => {
return (
+ !!(dataSource && symbol) &&
getAssetProfileIdentifier({
dataSource: holding.dataSource,
symbol: holding.symbol
diff --git a/libs/ui/src/lib/assistant/assistant.html b/libs/ui/src/lib/assistant/assistant.html
index 307269262..7e19833a9 100644
--- a/libs/ui/src/lib/assistant/assistant.html
+++ b/libs/ui/src/lib/assistant/assistant.html
@@ -186,7 +186,7 @@
Date: Wed, 25 Feb 2026 14:50:36 -0500
Subject: [PATCH 052/224] Bugfix/handle X-ray rule exception when market price
is missing (#6397)
* Handle X-ray rule exception when market price is missing
* Update changelog
---
CHANGELOG.md | 6 ++++++
apps/api/src/models/rule.ts | 2 +-
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f806a260e..6b1a1c978 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
+
+### Fixed
+
+- Fixed an exception by adding a fallback for missing market price values on the _X-ray_ page
+
## 2.243.0 - 2026-02-23
### Changed
diff --git a/apps/api/src/models/rule.ts b/apps/api/src/models/rule.ts
index 9c27e0018..622375b5b 100644
--- a/apps/api/src/models/rule.ts
+++ b/apps/api/src/models/rule.ts
@@ -57,7 +57,7 @@ export abstract class Rule implements RuleInterface {
previousValue +
this.exchangeRateDataService.toCurrency(
new Big(currentValue.quantity)
- .mul(currentValue.marketPrice)
+ .mul(currentValue.marketPrice ?? 0)
.toNumber(),
currentValue.currency,
baseCurrency
From 4cf16b8c58440d2408ab4594a10fe6b17d06de3f Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Thu, 26 Feb 2026 17:26:00 +0100
Subject: [PATCH 053/224] Task/remove unused OnDestroy hook in license page
component (#6380)
* Remove unused OnDestroy hook
---
.../pages/about/license/license-page.component.ts | 12 ++----------
1 file changed, 2 insertions(+), 10 deletions(-)
diff --git a/apps/client/src/app/pages/about/license/license-page.component.ts b/apps/client/src/app/pages/about/license/license-page.component.ts
index 0dc5b2f51..d530d0418 100644
--- a/apps/client/src/app/pages/about/license/license-page.component.ts
+++ b/apps/client/src/app/pages/about/license/license-page.component.ts
@@ -1,6 +1,5 @@
-import { Component, OnDestroy } from '@angular/core';
+import { Component } from '@angular/core';
import { MarkdownModule } from 'ngx-markdown';
-import { Subject } from 'rxjs';
@Component({
imports: [MarkdownModule],
@@ -8,11 +7,4 @@ import { Subject } from 'rxjs';
styleUrls: ['./license-page.scss'],
templateUrl: './license-page.html'
})
-export class GfLicensePageComponent implements OnDestroy {
- private unsubscribeSubject = new Subject();
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-}
+export class GfLicensePageComponent {}
From 69740db29215439e44d0c0a139d7f8072d4cbe7c Mon Sep 17 00:00:00 2001
From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com>
Date: Thu, 26 Feb 2026 20:26:21 +0400
Subject: [PATCH 054/224] Task/improve type safety in currency selector (#6402)
* feat(lib): resolve typescript errors
* feat(lib): make input a view child signal
* feat(lib): remove unsubscribe subject
* feat(lib): remove ngOnDestroy
* feat(lib): make currencies an input signal
* feat(lib): make formControlName an input signal
---
.../currency-selector.component.ts | 90 +++++++++----------
1 file changed, 42 insertions(+), 48 deletions(-)
diff --git a/libs/ui/src/lib/currency-selector/currency-selector.component.ts b/libs/ui/src/lib/currency-selector/currency-selector.component.ts
index 35a911716..7b6236fbb 100644
--- a/libs/ui/src/lib/currency-selector/currency-selector.component.ts
+++ b/libs/ui/src/lib/currency-selector/currency-selector.component.ts
@@ -4,13 +4,16 @@ import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
+ DestroyRef,
DoCheck,
ElementRef,
- Input,
- OnDestroy,
OnInit,
- ViewChild
+ ViewChild,
+ inject,
+ input,
+ viewChild
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import {
FormControl,
FormGroupDirective,
@@ -21,15 +24,14 @@ import {
import {
MatAutocomplete,
MatAutocompleteModule,
- MatAutocompleteSelectedEvent
+ MatOption
} from '@angular/material/autocomplete';
import {
MatFormFieldControl,
MatFormFieldModule
} from '@angular/material/form-field';
import { MatInput, MatInputModule } from '@angular/material/input';
-import { Subject } from 'rxjs';
-import { map, startWith, takeUntil } from 'rxjs/operators';
+import { map, startWith } from 'rxjs/operators';
import { AbstractMatFormField } from '../shared/abstract-mat-form-field';
@@ -58,21 +60,19 @@ import { AbstractMatFormField } from '../shared/abstract-mat-form-field';
templateUrl: 'currency-selector.component.html'
})
export class GfCurrencySelectorComponent
- extends AbstractMatFormField
- implements DoCheck, OnDestroy, OnInit
+ extends AbstractMatFormField
+ implements DoCheck, OnInit
{
- @Input() private currencies: string[] = [];
- @Input() private formControlName: string;
-
- @ViewChild(MatInput) private input: MatInput;
-
@ViewChild('currencyAutocomplete')
public currencyAutocomplete: MatAutocomplete;
- public control = new FormControl();
+ public readonly control = new FormControl(null);
+ public readonly currencies = input.required();
public filteredCurrencies: string[] = [];
+ public readonly formControlName = input.required();
- private unsubscribeSubject = new Subject();
+ private readonly destroyRef = inject(DestroyRef);
+ private readonly input = viewChild.required(MatInput);
public constructor(
public readonly _elementRef: ElementRef,
@@ -86,6 +86,19 @@ export class GfCurrencySelectorComponent
this.controlType = 'currency-selector';
}
+ public get empty() {
+ return this.input().empty;
+ }
+
+ public set value(value: string | null) {
+ this.control.setValue(value);
+ super.value = value;
+ }
+
+ public focus() {
+ this.input().focus();
+ }
+
public ngOnInit() {
if (this.disabled) {
this.control.disable();
@@ -94,17 +107,18 @@ export class GfCurrencySelectorComponent
const formGroup = this.formGroupDirective.form;
if (formGroup) {
- const control = formGroup.get(this.formControlName);
+ const control = formGroup.get(this.formControlName());
if (control) {
- this.value = this.currencies.find((value) => {
- return value === control.value;
- });
+ this.value =
+ this.currencies().find((value) => {
+ return value === control.value;
+ }) ?? null;
}
}
this.control.valueChanges
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
if (super.value) {
super.value = null;
@@ -113,10 +127,10 @@ export class GfCurrencySelectorComponent
this.control.valueChanges
.pipe(
- takeUntil(this.unsubscribeSubject),
+ takeUntilDestroyed(this.destroyRef),
startWith(''),
map((value) => {
- return value ? this.filter(value) : this.currencies.slice();
+ return value ? this.filter(value) : this.currencies().slice();
})
)
.subscribe((values) => {
@@ -124,42 +138,22 @@ export class GfCurrencySelectorComponent
});
}
- public get empty() {
- return this.input?.empty;
- }
-
- public focus() {
- this.input.focus();
- }
-
public ngDoCheck() {
if (this.ngControl) {
this.validateRequired();
- this.errorState = this.ngControl.invalid && this.ngControl.touched;
+ this.errorState = !!(this.ngControl.invalid && this.ngControl.touched);
this.stateChanges.next();
}
}
- public onUpdateCurrency(event: MatAutocompleteSelectedEvent) {
- super.value = event.option.value;
- }
-
- public set value(value: string) {
- this.control.setValue(value);
- super.value = value;
- }
-
- public ngOnDestroy() {
- super.ngOnDestroy();
-
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
+ public onUpdateCurrency({ option }: { option: MatOption }) {
+ super.value = option.value;
}
private filter(value: string) {
- const filterValue = value?.toLowerCase();
+ const filterValue = value.toLowerCase();
- return this.currencies.filter((currency) => {
+ return this.currencies().filter((currency) => {
return currency.toLowerCase().startsWith(filterValue);
});
}
@@ -168,7 +162,7 @@ export class GfCurrencySelectorComponent
const requiredCheck = super.required ? !super.value : false;
if (requiredCheck) {
- this.ngControl.control.setErrors({ invalidData: true });
+ this.ngControl.control?.setErrors({ invalidData: true });
}
}
}
From d4a0f48ca24ab925990853b59016b73fd2c1fa96 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Fri, 27 Feb 2026 19:50:04 +0100
Subject: [PATCH 055/224] Task/remove unused OnDestroy hook in demo page
component (#6383)
* Remove unused OnDestroy hook
---
.../client/src/app/pages/demo/demo-page.component.ts | 12 ++----------
1 file changed, 2 insertions(+), 10 deletions(-)
diff --git a/apps/client/src/app/pages/demo/demo-page.component.ts b/apps/client/src/app/pages/demo/demo-page.component.ts
index 5b94fd541..235805dcc 100644
--- a/apps/client/src/app/pages/demo/demo-page.component.ts
+++ b/apps/client/src/app/pages/demo/demo-page.component.ts
@@ -3,9 +3,8 @@ import { InfoItem } from '@ghostfolio/common/interfaces';
import { NotificationService } from '@ghostfolio/ui/notifications';
import { DataService } from '@ghostfolio/ui/services';
-import { Component, OnDestroy } from '@angular/core';
+import { Component } from '@angular/core';
import { Router } from '@angular/router';
-import { Subject } from 'rxjs';
@Component({
host: { class: 'page' },
@@ -13,11 +12,9 @@ import { Subject } from 'rxjs';
standalone: true,
templateUrl: './demo-page.html'
})
-export class GfDemoPageComponent implements OnDestroy {
+export class GfDemoPageComponent {
public info: InfoItem;
- private unsubscribeSubject = new Subject();
-
public constructor(
private dataService: DataService,
private notificationService: NotificationService,
@@ -40,9 +37,4 @@ export class GfDemoPageComponent implements OnDestroy {
this.router.navigate(['/']);
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From a7434c9ba7cc9b13aed168a51bebe827951e982d Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sat, 28 Feb 2026 08:49:15 +0100
Subject: [PATCH 056/224] Task/remove deprecated fee ratio X-ray rule (#6364)
* Remove deprecated static portfolio analysis rule: Fees (Fee Ratio)
* Update changelog
---
CHANGELOG.md | 4 +
.../src/app/portfolio/portfolio.service.ts | 8 --
apps/api/src/app/user/user.service.ts | 8 --
.../fees/fee-ratio-initial-investment.ts | 104 ------------------
apps/client/src/app/pages/i18n/i18n-page.html | 9 --
.../x-ray-rules-settings.interface.ts | 1 -
6 files changed, 4 insertions(+), 130 deletions(-)
delete mode 100644 apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6b1a1c978..0b25ff7e6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
+### Changed
+
+- Removed the deprecated static portfolio analysis rule: _Fees_ (Fee Ratio)
+
### Fixed
- Fixed an exception by adding a fallback for missing market price values on the _X-ray_ page
diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts
index b96f5ef70..17bd01ce4 100644
--- a/apps/api/src/app/portfolio/portfolio.service.ts
+++ b/apps/api/src/app/portfolio/portfolio.service.ts
@@ -13,7 +13,6 @@ import { CurrencyClusterRiskCurrentInvestment } from '@ghostfolio/api/models/rul
import { EconomicMarketClusterRiskDevelopedMarkets } from '@ghostfolio/api/models/rules/economic-market-cluster-risk/developed-markets';
import { EconomicMarketClusterRiskEmergingMarkets } from '@ghostfolio/api/models/rules/economic-market-cluster-risk/emerging-markets';
import { EmergencyFundSetup } from '@ghostfolio/api/models/rules/emergency-fund/emergency-fund-setup';
-import { FeeRatioInitialInvestment } from '@ghostfolio/api/models/rules/fees/fee-ratio-initial-investment';
import { FeeRatioTotalInvestmentVolume } from '@ghostfolio/api/models/rules/fees/fee-ratio-total-investment-volume';
import { BuyingPower } from '@ghostfolio/api/models/rules/liquidity/buying-power';
import { RegionalMarketClusterRiskAsiaPacific } from '@ghostfolio/api/models/rules/regional-market-cluster-risk/asia-pacific';
@@ -1310,13 +1309,6 @@ export class PortfolioService {
}),
rules: await this.rulesService.evaluate(
[
- new FeeRatioInitialInvestment(
- this.exchangeRateDataService,
- this.i18nService,
- userSettings.language,
- summary.committedFunds,
- summary.fees
- ),
new FeeRatioTotalInvestmentVolume(
this.exchangeRateDataService,
this.i18nService,
diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts
index 08328851d..97ab8a59f 100644
--- a/apps/api/src/app/user/user.service.ts
+++ b/apps/api/src/app/user/user.service.ts
@@ -12,7 +12,6 @@ import { CurrencyClusterRiskCurrentInvestment } from '@ghostfolio/api/models/rul
import { EconomicMarketClusterRiskDevelopedMarkets } from '@ghostfolio/api/models/rules/economic-market-cluster-risk/developed-markets';
import { EconomicMarketClusterRiskEmergingMarkets } from '@ghostfolio/api/models/rules/economic-market-cluster-risk/emerging-markets';
import { EmergencyFundSetup } from '@ghostfolio/api/models/rules/emergency-fund/emergency-fund-setup';
-import { FeeRatioInitialInvestment } from '@ghostfolio/api/models/rules/fees/fee-ratio-initial-investment';
import { FeeRatioTotalInvestmentVolume } from '@ghostfolio/api/models/rules/fees/fee-ratio-total-investment-volume';
import { BuyingPower } from '@ghostfolio/api/models/rules/liquidity/buying-power';
import { RegionalMarketClusterRiskAsiaPacific } from '@ghostfolio/api/models/rules/regional-market-cluster-risk/asia-pacific';
@@ -377,13 +376,6 @@ export class UserService {
undefined,
undefined
).getSettings(user.settings.settings),
- FeeRatioInitialInvestment: new FeeRatioInitialInvestment(
- undefined,
- undefined,
- undefined,
- undefined,
- undefined
- ).getSettings(user.settings.settings),
FeeRatioTotalInvestmentVolume: new FeeRatioTotalInvestmentVolume(
undefined,
undefined,
diff --git a/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts b/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts
deleted file mode 100644
index 54c2decc9..000000000
--- a/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts
+++ /dev/null
@@ -1,104 +0,0 @@
-import { Rule } from '@ghostfolio/api/models/rule';
-import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
-import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
-import { RuleSettings, UserSettings } from '@ghostfolio/common/interfaces';
-
-/**
- * @deprecated This rule is deprecated in favor of FeeRatioTotalInvestmentVolume
- */
-export class FeeRatioInitialInvestment extends Rule {
- private fees: number;
- private totalInvestment: number;
-
- public constructor(
- protected exchangeRateDataService: ExchangeRateDataService,
- private i18nService: I18nService,
- languageCode: string,
- totalInvestment: number,
- fees: number
- ) {
- super(exchangeRateDataService, {
- languageCode,
- key: FeeRatioInitialInvestment.name
- });
-
- this.fees = fees;
- this.totalInvestment = totalInvestment;
- }
-
- public evaluate(ruleSettings: Settings) {
- const feeRatio = this.totalInvestment
- ? this.fees / this.totalInvestment
- : 0;
-
- if (feeRatio > ruleSettings.thresholdMax) {
- return {
- evaluation: this.i18nService.getTranslation({
- id: 'rule.feeRatioInitialInvestment.false',
- languageCode: this.getLanguageCode(),
- placeholders: {
- feeRatio: (ruleSettings.thresholdMax * 100).toFixed(2),
- thresholdMax: (feeRatio * 100).toPrecision(3)
- }
- }),
- value: false
- };
- }
-
- return {
- evaluation: this.i18nService.getTranslation({
- id: 'rule.feeRatioInitialInvestment.true',
- languageCode: this.getLanguageCode(),
- placeholders: {
- feeRatio: (feeRatio * 100).toPrecision(3),
- thresholdMax: (ruleSettings.thresholdMax * 100).toFixed(2)
- }
- }),
- value: true
- };
- }
-
- public getCategoryName() {
- return this.i18nService.getTranslation({
- id: 'rule.fees.category',
- languageCode: this.getLanguageCode()
- });
- }
-
- public getConfiguration() {
- return {
- threshold: {
- max: 0.1,
- min: 0,
- step: 0.0025,
- unit: '%'
- },
- thresholdMax: true
- };
- }
-
- public getName() {
- return this.i18nService.getTranslation({
- id: 'rule.feeRatioInitialInvestment',
- languageCode: this.getLanguageCode()
- });
- }
-
- public getSettings({
- baseCurrency,
- locale,
- xRayRules
- }: UserSettings): Settings {
- return {
- baseCurrency,
- locale,
- isActive: xRayRules?.[this.getKey()]?.isActive ?? true,
- thresholdMax: xRayRules?.[this.getKey()]?.thresholdMax ?? 0.01
- };
- }
-}
-
-interface Settings extends RuleSettings {
- baseCurrency: string;
- thresholdMax: number;
-}
diff --git a/apps/client/src/app/pages/i18n/i18n-page.html b/apps/client/src/app/pages/i18n/i18n-page.html
index a8797c07a..99ef3039e 100644
--- a/apps/client/src/app/pages/i18n/i18n-page.html
+++ b/apps/client/src/app/pages/i18n/i18n-page.html
@@ -149,15 +149,6 @@
An emergency fund has been set up
- Fee Ratio (legacy)
-
- The fees do exceed ${thresholdMax}% of your initial investment
- (${feeRatio}%)
-
-
- The fees do not exceed ${thresholdMax}% of your initial
- investment (${feeRatio}%)
-
Fee Ratio
The fees do exceed ${thresholdMax}% of your total investment
diff --git a/libs/common/src/lib/interfaces/x-ray-rules-settings.interface.ts b/libs/common/src/lib/interfaces/x-ray-rules-settings.interface.ts
index 688d4f2a0..60a76d468 100644
--- a/libs/common/src/lib/interfaces/x-ray-rules-settings.interface.ts
+++ b/libs/common/src/lib/interfaces/x-ray-rules-settings.interface.ts
@@ -9,7 +9,6 @@ export interface XRayRulesSettings {
EconomicMarketClusterRiskDevelopedMarkets?: RuleSettings;
EconomicMarketClusterRiskEmergingMarkets?: RuleSettings;
EmergencyFundSetup?: RuleSettings;
- FeeRatioInitialInvestment?: RuleSettings;
FeeRatioTotalInvestmentVolume?: RuleSettings;
RegionalMarketClusterRiskAsiaPacific?: RuleSettings;
RegionalMarketClusterRiskEmergingMarkets?: RuleSettings;
From 3f14e5ad3a82cdb15651778b2e23a1fe30b4d4bd Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Sat, 28 Feb 2026 10:43:15 +0100
Subject: [PATCH 057/224] Task/update locales (#6356)
* Update locales
---
apps/client/src/locales/messages.ca.xlf | 180 ++++++++++--------------
apps/client/src/locales/messages.de.xlf | 180 ++++++++++--------------
apps/client/src/locales/messages.es.xlf | 180 ++++++++++--------------
apps/client/src/locales/messages.fr.xlf | 180 ++++++++++--------------
apps/client/src/locales/messages.it.xlf | 180 ++++++++++--------------
apps/client/src/locales/messages.ko.xlf | 180 ++++++++++--------------
apps/client/src/locales/messages.nl.xlf | 180 ++++++++++--------------
apps/client/src/locales/messages.pl.xlf | 180 ++++++++++--------------
apps/client/src/locales/messages.pt.xlf | 180 ++++++++++--------------
apps/client/src/locales/messages.tr.xlf | 180 ++++++++++--------------
apps/client/src/locales/messages.uk.xlf | 180 ++++++++++--------------
apps/client/src/locales/messages.xlf | 177 ++++++++++-------------
apps/client/src/locales/messages.zh.xlf | 180 ++++++++++--------------
13 files changed, 1014 insertions(+), 1323 deletions(-)
diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf
index 585a3d779..d878a63bf 100644
--- a/apps/client/src/locales/messages.ca.xlf
+++ b/apps/client/src/locales/messages.ca.xlf
@@ -455,7 +455,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 139
+ 135
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -511,7 +511,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 145
+ 141
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -531,15 +531,15 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 205
+ 201
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 208
+ 204
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 211
+ 207
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -711,7 +711,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 155
+ 151
libs/ui/src/lib/i18n.ts
@@ -823,7 +823,7 @@
Data
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 161
+ 157
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -1179,7 +1179,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 275
+ 271
@@ -1223,7 +1223,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 124
+ 120
@@ -1719,7 +1719,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 189
+ 185
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -2139,7 +2139,7 @@
Actius
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 230
+ 233
@@ -2147,7 +2147,7 @@
Poder adquisitiu
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 245
+ 248
@@ -2155,7 +2155,7 @@
Exclòs de l’anàlisi
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 271
+ 274
@@ -2163,7 +2163,7 @@
Passius
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 299
+ 302
apps/client/src/app/pages/features/features-page.html
@@ -2175,7 +2175,7 @@
Valor net
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 321
+ 324
@@ -2183,7 +2183,7 @@
Rendiment anualitzat
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 335
+ 338
@@ -2343,7 +2343,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 363
+ 362
@@ -2355,7 +2355,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -2367,7 +2367,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -2379,7 +2379,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -2399,7 +2399,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 415
+ 414
@@ -3095,11 +3095,11 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 48
+ 45
apps/client/src/app/pages/resources/resources-page.component.ts
- 30
+ 29
libs/common/src/lib/routes/routes.ts
@@ -3243,7 +3243,7 @@
Com que ja has iniciat sessió, no pots accedir al compte de demostració.
apps/client/src/app/pages/demo/demo-page.component.ts
- 35
+ 32
@@ -3516,7 +3516,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 40
+ 39
libs/common/src/lib/routes/routes.ts
@@ -3564,7 +3564,7 @@
Programari de gestió patrimonial de codi obert
apps/client/src/app/pages/i18n/i18n-page.html
- 246
+ 237
@@ -4104,7 +4104,7 @@
Actualitzar el saldo d’efectiu
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 112
+ 108
@@ -4112,7 +4112,7 @@
Preu unitari
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 214
+ 210
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -4484,7 +4484,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 369
+ 372
apps/client/src/app/pages/features/features-page.html
@@ -4492,7 +4492,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 202
+ 198
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
@@ -5345,7 +5345,7 @@
Realment voleu eliminar el saldo d’aquest compte?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 120
+ 113
@@ -5425,7 +5425,7 @@
Setmana fins avui
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5437,7 +5437,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5445,7 +5445,7 @@
Mes fins a la data
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5457,7 +5457,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5465,7 +5465,7 @@
Any fins a la data
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -5485,7 +5485,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -5497,7 +5497,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -5645,7 +5645,7 @@
Dipòsit
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 377
+ 385
@@ -5657,11 +5657,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 359
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 387
+ 395
libs/ui/src/lib/i18n.ts
@@ -5673,7 +5673,7 @@
Estalvi
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 397
+ 405
@@ -5753,7 +5753,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 290
+ 286
libs/ui/src/lib/i18n.ts
@@ -5785,7 +5785,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 309
+ 305
libs/ui/src/lib/i18n.ts
@@ -6049,7 +6049,7 @@
Comissió
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 262
+ 258
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -6093,7 +6093,7 @@
Efectiu
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 216
+ 219
libs/ui/src/lib/i18n.ts
@@ -6757,7 +6757,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 345
+ 341
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
@@ -6813,7 +6813,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 347
+ 343
libs/ui/src/lib/i18n.ts
@@ -7117,7 +7117,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 45
+ 44
libs/common/src/lib/routes/routes.ts
@@ -7133,7 +7133,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 34
+ 33
libs/common/src/lib/routes/routes.ts
@@ -7339,7 +7339,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 356
+ 352
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html
@@ -7643,7 +7643,7 @@
Find account, holding or page...
libs/ui/src/lib/assistant/assistant.component.ts
- 151
+ 115
@@ -7888,36 +7888,12 @@
150
-
- Fee Ratio (legacy)
- Fee Ratio (legacy)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 152
-
-
-
- The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 154
-
-
-
- The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 158
-
-
Fee Ratio
Fee Ratio
apps/client/src/app/pages/i18n/i18n-page.html
- 161
+ 152
@@ -7925,7 +7901,7 @@
The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 163
+ 154
@@ -7933,7 +7909,7 @@
The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 167
+ 158
@@ -8103,7 +8079,7 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 56
+ 53
@@ -8392,7 +8368,7 @@
Fees
apps/client/src/app/pages/i18n/i18n-page.html
- 170
+ 161
@@ -8440,7 +8416,7 @@
Regional Market Cluster Risks
apps/client/src/app/pages/i18n/i18n-page.html
- 172
+ 163
@@ -8536,7 +8512,7 @@
Asia-Pacific
apps/client/src/app/pages/i18n/i18n-page.html
- 174
+ 165
@@ -8544,7 +8520,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 176
+ 167
@@ -8552,7 +8528,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 180
+ 171
@@ -8560,7 +8536,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 184
+ 175
@@ -8568,7 +8544,7 @@
Emerging Markets
apps/client/src/app/pages/i18n/i18n-page.html
- 189
+ 180
@@ -8576,7 +8552,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 192
+ 183
@@ -8584,7 +8560,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 196
+ 187
@@ -8592,7 +8568,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 200
+ 191
@@ -8600,7 +8576,7 @@
Europe
apps/client/src/app/pages/i18n/i18n-page.html
- 204
+ 195
@@ -8608,7 +8584,7 @@
The Europe market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 206
+ 197
@@ -8616,7 +8592,7 @@
The Europe market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 210
+ 201
@@ -8624,7 +8600,7 @@
The Europe market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 214
+ 205
@@ -8632,7 +8608,7 @@
Japan
apps/client/src/app/pages/i18n/i18n-page.html
- 218
+ 209
@@ -8640,7 +8616,7 @@
The Japan market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 220
+ 211
@@ -8648,7 +8624,7 @@
The Japan market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 224
+ 215
@@ -8656,7 +8632,7 @@
The Japan market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 228
+ 219
@@ -8664,7 +8640,7 @@
North America
apps/client/src/app/pages/i18n/i18n-page.html
- 232
+ 223
@@ -8672,7 +8648,7 @@
The North America market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 234
+ 225
@@ -8680,7 +8656,7 @@
The North America market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 238
+ 229
@@ -8688,7 +8664,7 @@
The North America market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 242
+ 233
diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf
index 2ca3a95bf..54c3f7de8 100644
--- a/apps/client/src/locales/messages.de.xlf
+++ b/apps/client/src/locales/messages.de.xlf
@@ -134,7 +134,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 139
+ 135
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -178,15 +178,15 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 205
+ 201
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 208
+ 204
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 211
+ 207
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -326,7 +326,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 155
+ 151
libs/ui/src/lib/i18n.ts
@@ -438,7 +438,7 @@
Datum
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 161
+ 157
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -950,7 +950,7 @@
Kaufkraft
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 245
+ 248
@@ -958,7 +958,7 @@
Gesamtvermögen
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 321
+ 324
@@ -966,7 +966,7 @@
Performance pro Jahr
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 335
+ 338
@@ -1074,7 +1074,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 363
+ 362
@@ -1086,7 +1086,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -1098,7 +1098,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -1110,7 +1110,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -1130,7 +1130,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 415
+ 414
@@ -1450,7 +1450,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 145
+ 141
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -1630,7 +1630,7 @@
Da du bereits eingeloggt bist, kannst du nicht auf die Live Demo zugreifen.
apps/client/src/app/pages/demo/demo-page.component.ts
- 35
+ 32
@@ -1694,11 +1694,11 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 48
+ 45
apps/client/src/app/pages/resources/resources-page.component.ts
- 30
+ 29
libs/common/src/lib/routes/routes.ts
@@ -1738,7 +1738,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 40
+ 39
libs/common/src/lib/routes/routes.ts
@@ -1978,7 +1978,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 124
+ 120
@@ -1990,7 +1990,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 189
+ 185
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -2006,7 +2006,7 @@
Stückpreis
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 214
+ 210
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -2026,7 +2026,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 275
+ 271
@@ -2546,7 +2546,7 @@
Einlage
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 377
+ 385
@@ -2558,11 +2558,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 359
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 387
+ 395
libs/ui/src/lib/i18n.ts
@@ -2574,7 +2574,7 @@
Ersparnisse
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 397
+ 405
@@ -2706,7 +2706,7 @@
Von der Analyse ausgenommen
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 271
+ 274
@@ -2810,7 +2810,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 290
+ 286
libs/ui/src/lib/i18n.ts
@@ -2866,7 +2866,7 @@
Bargeld
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 216
+ 219
libs/ui/src/lib/i18n.ts
@@ -3158,7 +3158,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 369
+ 372
apps/client/src/app/pages/features/features-page.html
@@ -3166,7 +3166,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 202
+ 198
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
@@ -3198,7 +3198,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 309
+ 305
libs/ui/src/lib/i18n.ts
@@ -3926,7 +3926,7 @@
Cash-Bestand aktualisieren
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 112
+ 108
@@ -4106,7 +4106,7 @@
Verbindlichkeiten
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 299
+ 302
apps/client/src/app/pages/features/features-page.html
@@ -4522,7 +4522,7 @@
Anlagevermögen
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 230
+ 233
@@ -5468,7 +5468,7 @@
Gebühr
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 262
+ 258
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -5676,7 +5676,7 @@
Open Source Software für die Vermögensverwaltung
apps/client/src/app/pages/i18n/i18n-page.html
- 246
+ 237
@@ -5776,7 +5776,7 @@
Möchtest du diesen Cash-Bestand wirklich löschen?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 120
+ 113
@@ -5952,7 +5952,7 @@
Seit Wochenbeginn
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5964,7 +5964,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5972,7 +5972,7 @@
Seit Monatsbeginn
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5984,7 +5984,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5992,7 +5992,7 @@
Seit Jahresbeginn
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -6040,7 +6040,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -6052,7 +6052,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -6781,7 +6781,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 345
+ 341
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
@@ -6837,7 +6837,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 347
+ 343
libs/ui/src/lib/i18n.ts
@@ -7141,7 +7141,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 45
+ 44
libs/common/src/lib/routes/routes.ts
@@ -7157,7 +7157,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 34
+ 33
libs/common/src/lib/routes/routes.ts
@@ -7363,7 +7363,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 356
+ 352
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html
@@ -7667,7 +7667,7 @@
Konto, Position oder Seite finden...
libs/ui/src/lib/assistant/assistant.component.ts
- 151
+ 115
@@ -7888,36 +7888,12 @@
150
-
- Fee Ratio (legacy)
- Gebührenverhältnis (veraltet)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 152
-
-
-
- The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- Die Gebühren übersteigen ${thresholdMax}% deiner ursprünglichen Investition (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 154
-
-
-
- The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- Die Gebühren übersteigen ${thresholdMax}% deiner ursprünglichen Investition (${feeRatio}%) nicht
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 158
-
-
Fee Ratio
Gebührenverhältnis
apps/client/src/app/pages/i18n/i18n-page.html
- 161
+ 152
@@ -7925,7 +7901,7 @@
Die Gebühren übersteigen ${thresholdMax}% deines gesamten Investitionsvolumens (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 163
+ 154
@@ -7933,7 +7909,7 @@
Die Gebühren übersteigen ${thresholdMax}% deines gesamten Investitionsvolumens (${feeRatio}%) nicht
apps/client/src/app/pages/i18n/i18n-page.html
- 167
+ 158
@@ -8103,7 +8079,7 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 56
+ 53
@@ -8392,7 +8368,7 @@
Gebühren
apps/client/src/app/pages/i18n/i18n-page.html
- 170
+ 161
@@ -8440,7 +8416,7 @@
Regionale Marktklumpenrisiken
apps/client/src/app/pages/i18n/i18n-page.html
- 172
+ 163
@@ -8536,7 +8512,7 @@
Asien-Pazifik
apps/client/src/app/pages/i18n/i18n-page.html
- 174
+ 165
@@ -8544,7 +8520,7 @@
Der Anteil des Asien-Pazifik-Marktes deiner aktuellen Investition (${valueRatio}%) übersteigt ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 176
+ 167
@@ -8552,7 +8528,7 @@
Der Anteil des Asien-Pazifik-Marktes deiner aktuellen Investition (${valueRatio}%) liegt unter ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 180
+ 171
@@ -8560,7 +8536,7 @@
Der Anteil des Asien-Pazifik-Marktes deiner aktuellen Investition (${valueRatio}%) liegt im Bereich zwischen ${thresholdMin}% und ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 184
+ 175
@@ -8568,7 +8544,7 @@
Schwellenländer
apps/client/src/app/pages/i18n/i18n-page.html
- 189
+ 180
@@ -8576,7 +8552,7 @@
Der Anteil der Schwellenländer deiner aktuellen Investition (${valueRatio}%) übersteigt ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 192
+ 183
@@ -8584,7 +8560,7 @@
Der Anteil der Schwellenländer deiner aktuellen Investition (${valueRatio}%) liegt unter ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 196
+ 187
@@ -8592,7 +8568,7 @@
Der Anteil der Schwellenländer deiner aktuellen Investition (${valueRatio}%) liegt im Bereich zwischen ${thresholdMin}% und ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 200
+ 191
@@ -8600,7 +8576,7 @@
Europa
apps/client/src/app/pages/i18n/i18n-page.html
- 204
+ 195
@@ -8608,7 +8584,7 @@
Der Anteil des europäischen Marktes deiner aktuellen Investition (${valueRatio}%) übersteigt ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 206
+ 197
@@ -8616,7 +8592,7 @@
Der Anteil des europäischen Marktes deiner aktuellen Investition (${valueRatio}%) liegt unter ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 210
+ 201
@@ -8624,7 +8600,7 @@
Der Anteil des europäischen Marktes deiner aktuellen Investition (${valueRatio}%) liegt im Bereich zwischen ${thresholdMin}% und ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 214
+ 205
@@ -8632,7 +8608,7 @@
Japan
apps/client/src/app/pages/i18n/i18n-page.html
- 218
+ 209
@@ -8640,7 +8616,7 @@
Der Anteil des japanischen Marktes deiner aktuellen Investition (${valueRatio}%) übersteigt ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 220
+ 211
@@ -8648,7 +8624,7 @@
Der Anteil des japanischen Marktes deiner aktuellen Investition (${valueRatio}%) liegt unter ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 224
+ 215
@@ -8656,7 +8632,7 @@
Der Anteil des japanischen Marktes deiner aktuellen Investition (${valueRatio}%) liegt im Bereich zwischen ${thresholdMin}% und ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 228
+ 219
@@ -8664,7 +8640,7 @@
Nordamerika
apps/client/src/app/pages/i18n/i18n-page.html
- 232
+ 223
@@ -8672,7 +8648,7 @@
Der Anteil des nordamerikanischen Marktes deiner aktuellen Investition (${valueRatio}%) übersteigt ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 234
+ 225
@@ -8680,7 +8656,7 @@
Der Anteil des nordamerikanischen Marktes deiner aktuellen Investition (${valueRatio}%) liegt unter ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 238
+ 229
@@ -8688,7 +8664,7 @@
Der Anteil des nordamerikanischen Marktes deiner aktuellen Investition (${valueRatio}%) liegt im Bereich zwischen ${thresholdMin}% und ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 242
+ 233
diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf
index ceb7d5b06..74e0810c1 100644
--- a/apps/client/src/locales/messages.es.xlf
+++ b/apps/client/src/locales/messages.es.xlf
@@ -135,7 +135,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 139
+ 135
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -179,15 +179,15 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 205
+ 201
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 208
+ 204
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 211
+ 207
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -327,7 +327,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 155
+ 151
libs/ui/src/lib/i18n.ts
@@ -439,7 +439,7 @@
Fecha
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 161
+ 157
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -935,7 +935,7 @@
Capacidad de compra
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 245
+ 248
@@ -943,7 +943,7 @@
Patrimonio neto
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 321
+ 324
@@ -951,7 +951,7 @@
Rendimiento anualizado
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 335
+ 338
@@ -1059,7 +1059,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 363
+ 362
@@ -1071,7 +1071,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -1083,7 +1083,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -1095,7 +1095,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -1115,7 +1115,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 415
+ 414
@@ -1435,7 +1435,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 145
+ 141
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -1615,7 +1615,7 @@
Como estás conectado, no puedes acceder a la cuenta de demostración.
apps/client/src/app/pages/demo/demo-page.component.ts
- 35
+ 32
@@ -1679,11 +1679,11 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 48
+ 45
apps/client/src/app/pages/resources/resources-page.component.ts
- 30
+ 29
libs/common/src/lib/routes/routes.ts
@@ -1723,7 +1723,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 40
+ 39
libs/common/src/lib/routes/routes.ts
@@ -1963,7 +1963,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 124
+ 120
@@ -1975,7 +1975,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 189
+ 185
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -1991,7 +1991,7 @@
Precio unitario
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 214
+ 210
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -2011,7 +2011,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 275
+ 271
@@ -2515,7 +2515,7 @@
Ahorros
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 397
+ 405
@@ -2527,11 +2527,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 359
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 387
+ 395
libs/ui/src/lib/i18n.ts
@@ -2551,7 +2551,7 @@
Depósito
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 377
+ 385
@@ -2691,7 +2691,7 @@
Excluido del análisis
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 271
+ 274
@@ -2795,7 +2795,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 290
+ 286
libs/ui/src/lib/i18n.ts
@@ -2851,7 +2851,7 @@
Efectivo
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 216
+ 219
libs/ui/src/lib/i18n.ts
@@ -3135,7 +3135,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 369
+ 372
apps/client/src/app/pages/features/features-page.html
@@ -3143,7 +3143,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 202
+ 198
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
@@ -3183,7 +3183,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 309
+ 305
libs/ui/src/lib/i18n.ts
@@ -3903,7 +3903,7 @@
Actualizar saldo en efectivo
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 112
+ 108
@@ -4083,7 +4083,7 @@
Pasivos
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 299
+ 302
apps/client/src/app/pages/features/features-page.html
@@ -4499,7 +4499,7 @@
Activos
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 230
+ 233
@@ -5445,7 +5445,7 @@
Tarifa
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 262
+ 258
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -5653,7 +5653,7 @@
Software de gestión de patrimonio de código abierto
apps/client/src/app/pages/i18n/i18n-page.html
- 246
+ 237
@@ -5753,7 +5753,7 @@
¿Realmente desea eliminar el saldo de esta cuenta?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 120
+ 113
@@ -5929,7 +5929,7 @@
Semana hasta la fecha
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5941,7 +5941,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5949,7 +5949,7 @@
Mes hasta la fecha
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5961,7 +5961,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5969,7 +5969,7 @@
El año hasta la fecha
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -6017,7 +6017,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -6029,7 +6029,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -6758,7 +6758,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 345
+ 341
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
@@ -6814,7 +6814,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 347
+ 343
libs/ui/src/lib/i18n.ts
@@ -7118,7 +7118,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 45
+ 44
libs/common/src/lib/routes/routes.ts
@@ -7134,7 +7134,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 34
+ 33
libs/common/src/lib/routes/routes.ts
@@ -7340,7 +7340,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 356
+ 352
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html
@@ -7644,7 +7644,7 @@
Buscar cuenta, posición o página...
libs/ui/src/lib/assistant/assistant.component.ts
- 151
+ 115
@@ -7889,36 +7889,12 @@
150
-
- Fee Ratio (legacy)
- Relación de tarifas (heredado)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 152
-
-
-
- The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- Las tarifas superan el ${thresholdMax}% de su inversión inicial (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 154
-
-
-
- The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- Las tarifas no superan el ${thresholdMax}% de su inversión inicial (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 158
-
-
Fee Ratio
Relación de tarifas
apps/client/src/app/pages/i18n/i18n-page.html
- 161
+ 152
@@ -7926,7 +7902,7 @@
Las tarifas superan el ${thresholdMax}% de su volumen total de inversión (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 163
+ 154
@@ -7934,7 +7910,7 @@
Las tarifas no superan el ${thresholdMax}% de su volumen total de inversión (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 167
+ 158
@@ -8104,7 +8080,7 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 56
+ 53
@@ -8393,7 +8369,7 @@
Comisiones
apps/client/src/app/pages/i18n/i18n-page.html
- 170
+ 161
@@ -8441,7 +8417,7 @@
Riesgos de los grupos de mercados regionales
apps/client/src/app/pages/i18n/i18n-page.html
- 172
+ 163
@@ -8537,7 +8513,7 @@
Asia-Pacífico
apps/client/src/app/pages/i18n/i18n-page.html
- 174
+ 165
@@ -8545,7 +8521,7 @@
La contribución al mercado de Asia-Pacífico de tu inversión actual (${valueRatio}%) supera el ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 176
+ 167
@@ -8553,7 +8529,7 @@
La contribución al mercado de Asia-Pacífico de tu inversión actual (${valueRatio}%) es inferior al ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 180
+ 171
@@ -8561,7 +8537,7 @@
La contribución al mercado de Asia-Pacífico de tu inversión actual (${valueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 184
+ 175
@@ -8569,7 +8545,7 @@
Mercados emergentes
apps/client/src/app/pages/i18n/i18n-page.html
- 189
+ 180
@@ -8577,7 +8553,7 @@
La contribución a los mercados emergentes de tu inversión actual (${valueRatio}%) supera el ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 192
+ 183
@@ -8585,7 +8561,7 @@
La contribución a los mercados emergentes de tu inversión actual (${valueRatio}%) es inferior al ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 196
+ 187
@@ -8593,7 +8569,7 @@
La contribución a los mercados emergentes de tu inversión actual (${valueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 200
+ 191
@@ -8601,7 +8577,7 @@
Europa
apps/client/src/app/pages/i18n/i18n-page.html
- 204
+ 195
@@ -8609,7 +8585,7 @@
La contribución al mercado europeo de tu inversión actual (${valueRatio}%) supera el ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 206
+ 197
@@ -8617,7 +8593,7 @@
La contribución al mercado europeo de tu inversión actual (${valueRatio}%) es inferior al ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 210
+ 201
@@ -8625,7 +8601,7 @@
La contribución al mercado europeo de tu inversión actual (${valueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 214
+ 205
@@ -8633,7 +8609,7 @@
Japón
apps/client/src/app/pages/i18n/i18n-page.html
- 218
+ 209
@@ -8641,7 +8617,7 @@
La contribución al mercado japonés de su inversión actual (${valueRatio}%) supera el ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 220
+ 211
@@ -8649,7 +8625,7 @@
La contribución al mercado japonés de su inversión actual (${valueRatio}%) es inferior a ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 224
+ 215
@@ -8657,7 +8633,7 @@
La contribución al mercado japonés de su inversión actual (${valueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 228
+ 219
@@ -8665,7 +8641,7 @@
Norteamérica
apps/client/src/app/pages/i18n/i18n-page.html
- 232
+ 223
@@ -8673,7 +8649,7 @@
La contribución del mercado de América del Norte de su inversión actual (${valueRatio}%) supera el ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 234
+ 225
@@ -8681,7 +8657,7 @@
La contribución al mercado de América del Norte de su inversión actual (${valueRatio}%) es inferior a ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 238
+ 229
@@ -8689,7 +8665,7 @@
La contribución al mercado de América del Norte de su inversión actual (${valueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 242
+ 233
diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf
index f3a8d4942..f343cb2ad 100644
--- a/apps/client/src/locales/messages.fr.xlf
+++ b/apps/client/src/locales/messages.fr.xlf
@@ -142,7 +142,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 139
+ 135
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -198,7 +198,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 145
+ 141
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -234,15 +234,15 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 205
+ 201
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 208
+ 204
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 211
+ 207
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -374,7 +374,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 155
+ 151
libs/ui/src/lib/i18n.ts
@@ -494,7 +494,7 @@
Date
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 161
+ 157
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -698,7 +698,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 275
+ 271
@@ -1218,7 +1218,7 @@
Pouvoir d’Achat
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 245
+ 248
@@ -1226,7 +1226,7 @@
Exclus de l’Analyse
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 271
+ 274
@@ -1234,7 +1234,7 @@
Fortune
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 321
+ 324
@@ -1242,7 +1242,7 @@
Performance annualisée
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 335
+ 338
@@ -1278,7 +1278,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 189
+ 185
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -1306,7 +1306,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 363
+ 362
@@ -1318,7 +1318,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -1330,7 +1330,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -1342,7 +1342,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -1362,7 +1362,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 415
+ 414
@@ -1906,7 +1906,7 @@
Puisque vous êtes déjà connecté·e, vous ne pouvez pas accéder au compte de démonstration.
apps/client/src/app/pages/demo/demo-page.component.ts
- 35
+ 32
@@ -2018,7 +2018,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 40
+ 39
libs/common/src/lib/routes/routes.ts
@@ -2142,7 +2142,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 124
+ 120
@@ -2150,7 +2150,7 @@
Prix Unitaire
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 214
+ 210
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -2406,7 +2406,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 369
+ 372
apps/client/src/app/pages/features/features-page.html
@@ -2414,7 +2414,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 202
+ 198
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
@@ -2438,7 +2438,7 @@
Dépôt
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 377
+ 385
@@ -2718,11 +2718,11 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 48
+ 45
apps/client/src/app/pages/resources/resources-page.component.ts
- 30
+ 29
libs/common/src/lib/routes/routes.ts
@@ -2854,11 +2854,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 359
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 387
+ 395
libs/ui/src/lib/i18n.ts
@@ -2870,7 +2870,7 @@
Épargne
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 397
+ 405
@@ -2942,7 +2942,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 290
+ 286
libs/ui/src/lib/i18n.ts
@@ -2974,7 +2974,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 309
+ 305
libs/ui/src/lib/i18n.ts
@@ -3054,7 +3054,7 @@
Cash
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 216
+ 219
libs/ui/src/lib/i18n.ts
@@ -3902,7 +3902,7 @@
Mettre à jour le Solde
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 112
+ 108
@@ -4082,7 +4082,7 @@
Dettes
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 299
+ 302
apps/client/src/app/pages/features/features-page.html
@@ -4498,7 +4498,7 @@
Actifs
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 230
+ 233
@@ -5444,7 +5444,7 @@
Frais
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 262
+ 258
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -5652,7 +5652,7 @@
Logiciel libre de Gestion de Patrimoine
apps/client/src/app/pages/i18n/i18n-page.html
- 246
+ 237
@@ -5752,7 +5752,7 @@
Voulez-vous vraiment supprimer ce solde de compte ?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 120
+ 113
@@ -5928,7 +5928,7 @@
Week to date
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5940,7 +5940,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5948,7 +5948,7 @@
Month to date
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5960,7 +5960,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5968,7 +5968,7 @@
Year to date
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -6016,7 +6016,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -6028,7 +6028,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -6757,7 +6757,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 345
+ 341
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
@@ -6813,7 +6813,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 347
+ 343
libs/ui/src/lib/i18n.ts
@@ -7117,7 +7117,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 45
+ 44
libs/common/src/lib/routes/routes.ts
@@ -7133,7 +7133,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 34
+ 33
libs/common/src/lib/routes/routes.ts
@@ -7339,7 +7339,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 356
+ 352
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html
@@ -7643,7 +7643,7 @@
Find account, holding or page...
libs/ui/src/lib/assistant/assistant.component.ts
- 151
+ 115
@@ -7888,36 +7888,12 @@
150
-
- Fee Ratio (legacy)
- Ratio de frais
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 152
-
-
-
- The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- Les frais dépassent ${thresholdMax}% de votre investissement initial (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 154
-
-
-
- The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- Les frais ne dépassent pas ${thresholdMax}% de votre investissement initial (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 158
-
-
Fee Ratio
Fee Ratio
apps/client/src/app/pages/i18n/i18n-page.html
- 161
+ 152
@@ -7925,7 +7901,7 @@
The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 163
+ 154
@@ -7933,7 +7909,7 @@
The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 167
+ 158
@@ -8103,7 +8079,7 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 56
+ 53
@@ -8392,7 +8368,7 @@
Fees
apps/client/src/app/pages/i18n/i18n-page.html
- 170
+ 161
@@ -8440,7 +8416,7 @@
Regional Market Cluster Risks
apps/client/src/app/pages/i18n/i18n-page.html
- 172
+ 163
@@ -8536,7 +8512,7 @@
Asia-Pacific
apps/client/src/app/pages/i18n/i18n-page.html
- 174
+ 165
@@ -8544,7 +8520,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 176
+ 167
@@ -8552,7 +8528,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 180
+ 171
@@ -8560,7 +8536,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 184
+ 175
@@ -8568,7 +8544,7 @@
Emerging Markets
apps/client/src/app/pages/i18n/i18n-page.html
- 189
+ 180
@@ -8576,7 +8552,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 192
+ 183
@@ -8584,7 +8560,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 196
+ 187
@@ -8592,7 +8568,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 200
+ 191
@@ -8600,7 +8576,7 @@
Europe
apps/client/src/app/pages/i18n/i18n-page.html
- 204
+ 195
@@ -8608,7 +8584,7 @@
The Europe market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 206
+ 197
@@ -8616,7 +8592,7 @@
The Europe market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 210
+ 201
@@ -8624,7 +8600,7 @@
The Europe market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 214
+ 205
@@ -8632,7 +8608,7 @@
Japan
apps/client/src/app/pages/i18n/i18n-page.html
- 218
+ 209
@@ -8640,7 +8616,7 @@
The Japan market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 220
+ 211
@@ -8648,7 +8624,7 @@
The Japan market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 224
+ 215
@@ -8656,7 +8632,7 @@
The Japan market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 228
+ 219
@@ -8664,7 +8640,7 @@
North America
apps/client/src/app/pages/i18n/i18n-page.html
- 232
+ 223
@@ -8672,7 +8648,7 @@
The North America market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 234
+ 225
@@ -8680,7 +8656,7 @@
The North America market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 238
+ 229
@@ -8688,7 +8664,7 @@
The North America market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 242
+ 233
diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf
index f021dae49..05bb6afb2 100644
--- a/apps/client/src/locales/messages.it.xlf
+++ b/apps/client/src/locales/messages.it.xlf
@@ -135,7 +135,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 139
+ 135
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -179,15 +179,15 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 205
+ 201
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 208
+ 204
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 211
+ 207
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -327,7 +327,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 155
+ 151
libs/ui/src/lib/i18n.ts
@@ -439,7 +439,7 @@
Data
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 161
+ 157
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -935,7 +935,7 @@
Potere d’acquisto
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 245
+ 248
@@ -943,7 +943,7 @@
Patrimonio netto
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 321
+ 324
@@ -951,7 +951,7 @@
Prestazioni annualizzate
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 335
+ 338
@@ -1059,7 +1059,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 363
+ 362
@@ -1071,7 +1071,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -1083,7 +1083,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -1095,7 +1095,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -1115,7 +1115,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 415
+ 414
@@ -1435,7 +1435,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 145
+ 141
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -1615,7 +1615,7 @@
Poiché hai già effettuato l’accesso, non puoi accedere all’account demo.
apps/client/src/app/pages/demo/demo-page.component.ts
- 35
+ 32
@@ -1679,11 +1679,11 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 48
+ 45
apps/client/src/app/pages/resources/resources-page.component.ts
- 30
+ 29
libs/common/src/lib/routes/routes.ts
@@ -1723,7 +1723,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 40
+ 39
libs/common/src/lib/routes/routes.ts
@@ -1963,7 +1963,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 124
+ 120
@@ -1975,7 +1975,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 189
+ 185
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -1991,7 +1991,7 @@
Prezzo unitario
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 214
+ 210
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -2011,7 +2011,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 275
+ 271
@@ -2515,7 +2515,7 @@
Risparmio
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 397
+ 405
@@ -2527,11 +2527,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 359
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 387
+ 395
libs/ui/src/lib/i18n.ts
@@ -2551,7 +2551,7 @@
Deposito
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 377
+ 385
@@ -2691,7 +2691,7 @@
Escluso dall’analisi
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 271
+ 274
@@ -2795,7 +2795,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 290
+ 286
libs/ui/src/lib/i18n.ts
@@ -2851,7 +2851,7 @@
Contanti
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 216
+ 219
libs/ui/src/lib/i18n.ts
@@ -3135,7 +3135,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 369
+ 372
apps/client/src/app/pages/features/features-page.html
@@ -3143,7 +3143,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 202
+ 198
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
@@ -3183,7 +3183,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 309
+ 305
libs/ui/src/lib/i18n.ts
@@ -3903,7 +3903,7 @@
Aggiornamento del saldo di cassa
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 112
+ 108
@@ -4083,7 +4083,7 @@
Passività
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 299
+ 302
apps/client/src/app/pages/features/features-page.html
@@ -4499,7 +4499,7 @@
Asset
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 230
+ 233
@@ -5445,7 +5445,7 @@
Commissione
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 262
+ 258
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -5653,7 +5653,7 @@
Software Open Source per la gestione della tua ricchezza
apps/client/src/app/pages/i18n/i18n-page.html
- 246
+ 237
@@ -5753,7 +5753,7 @@
Vuoi veramente elimnare il saldo di questo conto?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 120
+ 113
@@ -5929,7 +5929,7 @@
Da inizio settimana
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5941,7 +5941,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5949,7 +5949,7 @@
Da inizio mese
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5961,7 +5961,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5969,7 +5969,7 @@
Da inizio anno
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -6017,7 +6017,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -6029,7 +6029,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -6758,7 +6758,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 345
+ 341
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
@@ -6814,7 +6814,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 347
+ 343
libs/ui/src/lib/i18n.ts
@@ -7118,7 +7118,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 45
+ 44
libs/common/src/lib/routes/routes.ts
@@ -7134,7 +7134,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 34
+ 33
libs/common/src/lib/routes/routes.ts
@@ -7340,7 +7340,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 356
+ 352
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html
@@ -7644,7 +7644,7 @@
Find account, holding or page...
libs/ui/src/lib/assistant/assistant.component.ts
- 151
+ 115
@@ -7889,36 +7889,12 @@
150
-
- Fee Ratio (legacy)
- Rapporto tariffario
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 152
-
-
-
- The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- Le commissioni superano il ${thresholdMax}% del tuo investimento iniziale (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 154
-
-
-
- The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- Le commissioni non superano il ${thresholdMax}% del tuo investimento iniziale (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 158
-
-
Fee Ratio
Fee Ratio
apps/client/src/app/pages/i18n/i18n-page.html
- 161
+ 152
@@ -7926,7 +7902,7 @@
The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 163
+ 154
@@ -7934,7 +7910,7 @@
The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 167
+ 158
@@ -8104,7 +8080,7 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 56
+ 53
@@ -8393,7 +8369,7 @@
Fees
apps/client/src/app/pages/i18n/i18n-page.html
- 170
+ 161
@@ -8441,7 +8417,7 @@
Regional Market Cluster Risks
apps/client/src/app/pages/i18n/i18n-page.html
- 172
+ 163
@@ -8537,7 +8513,7 @@
Asia-Pacific
apps/client/src/app/pages/i18n/i18n-page.html
- 174
+ 165
@@ -8545,7 +8521,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 176
+ 167
@@ -8553,7 +8529,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 180
+ 171
@@ -8561,7 +8537,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 184
+ 175
@@ -8569,7 +8545,7 @@
Emerging Markets
apps/client/src/app/pages/i18n/i18n-page.html
- 189
+ 180
@@ -8577,7 +8553,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 192
+ 183
@@ -8585,7 +8561,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 196
+ 187
@@ -8593,7 +8569,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 200
+ 191
@@ -8601,7 +8577,7 @@
Europe
apps/client/src/app/pages/i18n/i18n-page.html
- 204
+ 195
@@ -8609,7 +8585,7 @@
The Europe market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 206
+ 197
@@ -8617,7 +8593,7 @@
The Europe market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 210
+ 201
@@ -8625,7 +8601,7 @@
The Europe market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 214
+ 205
@@ -8633,7 +8609,7 @@
Japan
apps/client/src/app/pages/i18n/i18n-page.html
- 218
+ 209
@@ -8641,7 +8617,7 @@
The Japan market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 220
+ 211
@@ -8649,7 +8625,7 @@
The Japan market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 224
+ 215
@@ -8657,7 +8633,7 @@
The Japan market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 228
+ 219
@@ -8665,7 +8641,7 @@
North America
apps/client/src/app/pages/i18n/i18n-page.html
- 232
+ 223
@@ -8673,7 +8649,7 @@
The North America market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 234
+ 225
@@ -8681,7 +8657,7 @@
The North America market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 238
+ 229
@@ -8689,7 +8665,7 @@
The North America market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 242
+ 233
diff --git a/apps/client/src/locales/messages.ko.xlf b/apps/client/src/locales/messages.ko.xlf
index f188d4924..9b7c4192e 100644
--- a/apps/client/src/locales/messages.ko.xlf
+++ b/apps/client/src/locales/messages.ko.xlf
@@ -388,7 +388,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 139
+ 135
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -444,7 +444,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 145
+ 141
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -464,15 +464,15 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 205
+ 201
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 208
+ 204
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 211
+ 207
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -624,7 +624,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 155
+ 151
libs/ui/src/lib/i18n.ts
@@ -720,7 +720,7 @@
날짜
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 161
+ 157
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -1024,7 +1024,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 275
+ 271
@@ -1068,7 +1068,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 124
+ 120
@@ -1856,7 +1856,7 @@
자산
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 230
+ 233
@@ -1864,7 +1864,7 @@
매수 가능 금액
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 245
+ 248
@@ -1872,7 +1872,7 @@
분석에서 제외됨
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 271
+ 274
@@ -1880,7 +1880,7 @@
부채
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 299
+ 302
apps/client/src/app/pages/features/features-page.html
@@ -1892,7 +1892,7 @@
순자산
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 321
+ 324
@@ -1900,7 +1900,7 @@
연환산 성과
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 335
+ 338
@@ -1936,7 +1936,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 189
+ 185
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -2132,7 +2132,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 363
+ 362
@@ -2144,7 +2144,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -2156,7 +2156,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -2168,7 +2168,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -2188,7 +2188,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 415
+ 414
@@ -2788,11 +2788,11 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 48
+ 45
apps/client/src/app/pages/resources/resources-page.component.ts
- 30
+ 29
libs/common/src/lib/routes/routes.ts
@@ -2936,7 +2936,7 @@
이미 로그인되어 있으므로 데모 계정에 접근할 수 없습니다.
apps/client/src/app/pages/demo/demo-page.component.ts
- 35
+ 32
@@ -3184,7 +3184,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 40
+ 39
libs/common/src/lib/routes/routes.ts
@@ -3224,7 +3224,7 @@
오픈 소스 자산관리 소프트웨어
apps/client/src/app/pages/i18n/i18n-page.html
- 246
+ 237
@@ -3764,7 +3764,7 @@
현금 잔액 업데이트
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 112
+ 108
@@ -3772,7 +3772,7 @@
단가
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 214
+ 210
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -4128,7 +4128,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 369
+ 372
apps/client/src/app/pages/features/features-page.html
@@ -4136,7 +4136,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 202
+ 198
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
@@ -4160,7 +4160,7 @@
보증금
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 377
+ 385
@@ -4941,7 +4941,7 @@
정말로 이 계정 잔액을 삭제하시겠습니까?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 120
+ 113
@@ -5117,11 +5117,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 359
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 387
+ 395
libs/ui/src/lib/i18n.ts
@@ -5133,7 +5133,7 @@
저금
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 397
+ 405
@@ -5213,7 +5213,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 290
+ 286
libs/ui/src/lib/i18n.ts
@@ -5245,7 +5245,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 309
+ 305
libs/ui/src/lib/i18n.ts
@@ -5501,7 +5501,7 @@
요금
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 262
+ 258
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -5545,7 +5545,7 @@
현금
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 216
+ 219
libs/ui/src/lib/i18n.ts
@@ -5953,7 +5953,7 @@
연초 현재
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -5961,7 +5961,7 @@
이번주 현재까지
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5969,7 +5969,7 @@
월간 누계
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5981,7 +5981,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5993,7 +5993,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -6041,7 +6041,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -6053,7 +6053,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -6742,7 +6742,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 345
+ 341
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
@@ -6830,7 +6830,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 347
+ 343
libs/ui/src/lib/i18n.ts
@@ -7142,7 +7142,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 45
+ 44
libs/common/src/lib/routes/routes.ts
@@ -7171,7 +7171,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 34
+ 33
libs/common/src/lib/routes/routes.ts
@@ -7364,7 +7364,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 356
+ 352
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html
@@ -7656,7 +7656,7 @@
계정, 보유 또는 페이지 찾기...
libs/ui/src/lib/assistant/assistant.component.ts
- 151
+ 115
@@ -7889,36 +7889,12 @@
150
-
- Fee Ratio (legacy)
- 수수료 비율
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 152
-
-
-
- The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- 수수료가 초기 투자금(${feeRatio}%)의 ${thresholdMax}%를 초과합니다.
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 154
-
-
-
- The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- 수수료는 초기 투자금의 ${thresholdMax}%(${feeRatio}%)를 초과하지 않습니다.
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 158
-
-
Fee Ratio
Fee Ratio
apps/client/src/app/pages/i18n/i18n-page.html
- 161
+ 152
@@ -7926,7 +7902,7 @@
The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 163
+ 154
@@ -7934,7 +7910,7 @@
The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 167
+ 158
@@ -8104,7 +8080,7 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 56
+ 53
@@ -8401,7 +8377,7 @@
수수료
apps/client/src/app/pages/i18n/i18n-page.html
- 170
+ 161
@@ -8449,7 +8425,7 @@
지역 시장 클러스터 위험
apps/client/src/app/pages/i18n/i18n-page.html
- 172
+ 163
@@ -8537,7 +8513,7 @@
아시아·태평양
apps/client/src/app/pages/i18n/i18n-page.html
- 174
+ 165
@@ -8545,7 +8521,7 @@
현재 투자의 아시아 태평양 시장 기여도(${valueRatio}%)가 ${thresholdMax}%를 초과합니다.
apps/client/src/app/pages/i18n/i18n-page.html
- 176
+ 167
@@ -8553,7 +8529,7 @@
현재 투자의 아시아 태평양 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 미만입니다.
apps/client/src/app/pages/i18n/i18n-page.html
- 180
+ 171
@@ -8561,7 +8537,7 @@
현재 투자의 아시아 태평양 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다.
apps/client/src/app/pages/i18n/i18n-page.html
- 184
+ 175
@@ -8569,7 +8545,7 @@
신흥시장
apps/client/src/app/pages/i18n/i18n-page.html
- 189
+ 180
@@ -8577,7 +8553,7 @@
현재 투자의 신흥 시장 기여도(${valueRatio}%)가 ${thresholdMax}%를 초과합니다.
apps/client/src/app/pages/i18n/i18n-page.html
- 192
+ 183
@@ -8585,7 +8561,7 @@
현재 투자의 신흥 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 미만입니다.
apps/client/src/app/pages/i18n/i18n-page.html
- 196
+ 187
@@ -8593,7 +8569,7 @@
현재 투자의 신흥 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다.
apps/client/src/app/pages/i18n/i18n-page.html
- 200
+ 191
@@ -8601,7 +8577,7 @@
유럽
apps/client/src/app/pages/i18n/i18n-page.html
- 204
+ 195
@@ -8609,7 +8585,7 @@
현재 투자의 유럽 시장 기여도(${valueRatio}%)가 ${thresholdMax}%를 초과합니다.
apps/client/src/app/pages/i18n/i18n-page.html
- 206
+ 197
@@ -8617,7 +8593,7 @@
현재 투자의 유럽 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 미만입니다.
apps/client/src/app/pages/i18n/i18n-page.html
- 210
+ 201
@@ -8625,7 +8601,7 @@
현재 투자의 유럽 시장 기여도(${valueRatio}%)는 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다.
apps/client/src/app/pages/i18n/i18n-page.html
- 214
+ 205
@@ -8633,7 +8609,7 @@
일본
apps/client/src/app/pages/i18n/i18n-page.html
- 218
+ 209
@@ -8641,7 +8617,7 @@
현재 투자의 일본 시장 기여도(${valueRatio}%)가 ${thresholdMax}%를 초과합니다.
apps/client/src/app/pages/i18n/i18n-page.html
- 220
+ 211
@@ -8649,7 +8625,7 @@
현재 투자의 일본 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 미만입니다.
apps/client/src/app/pages/i18n/i18n-page.html
- 224
+ 215
@@ -8657,7 +8633,7 @@
현재 투자의 일본 시장 기여도(${valueRatio}%)는 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다.
apps/client/src/app/pages/i18n/i18n-page.html
- 228
+ 219
@@ -8665,7 +8641,7 @@
북미
apps/client/src/app/pages/i18n/i18n-page.html
- 232
+ 223
@@ -8673,7 +8649,7 @@
현재 투자의 북미 시장 기여도(${valueRatio}%)가 ${thresholdMax}%를 초과합니다.
apps/client/src/app/pages/i18n/i18n-page.html
- 234
+ 225
@@ -8681,7 +8657,7 @@
현재 투자의 북미 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 미만입니다.
apps/client/src/app/pages/i18n/i18n-page.html
- 238
+ 229
@@ -8689,7 +8665,7 @@
현재 투자의 북미 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다.
apps/client/src/app/pages/i18n/i18n-page.html
- 242
+ 233
diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf
index 76a74e6fd..58928387b 100644
--- a/apps/client/src/locales/messages.nl.xlf
+++ b/apps/client/src/locales/messages.nl.xlf
@@ -134,7 +134,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 139
+ 135
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -178,15 +178,15 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 205
+ 201
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 208
+ 204
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 211
+ 207
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -326,7 +326,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 155
+ 151
libs/ui/src/lib/i18n.ts
@@ -438,7 +438,7 @@
Datum
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 161
+ 157
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -934,7 +934,7 @@
Koopkracht
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 245
+ 248
@@ -942,7 +942,7 @@
Netto waarde
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 321
+ 324
@@ -950,7 +950,7 @@
Rendement per jaar
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 335
+ 338
@@ -1058,7 +1058,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 363
+ 362
@@ -1070,7 +1070,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -1082,7 +1082,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -1094,7 +1094,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -1114,7 +1114,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 415
+ 414
@@ -1434,7 +1434,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 145
+ 141
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -1614,7 +1614,7 @@
Aangezien je al ingelogd bent, heb je geen toegang tot de demo-account.
apps/client/src/app/pages/demo/demo-page.component.ts
- 35
+ 32
@@ -1678,11 +1678,11 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 48
+ 45
apps/client/src/app/pages/resources/resources-page.component.ts
- 30
+ 29
libs/common/src/lib/routes/routes.ts
@@ -1722,7 +1722,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 40
+ 39
libs/common/src/lib/routes/routes.ts
@@ -1962,7 +1962,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 124
+ 120
@@ -1974,7 +1974,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 189
+ 185
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -1990,7 +1990,7 @@
Prijs per eenheid
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 214
+ 210
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -2010,7 +2010,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 275
+ 271
@@ -2514,7 +2514,7 @@
Besparingen
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 397
+ 405
@@ -2526,11 +2526,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 359
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 387
+ 395
libs/ui/src/lib/i18n.ts
@@ -2550,7 +2550,7 @@
Storting
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 377
+ 385
@@ -2690,7 +2690,7 @@
Uitgesloten van analyse
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 271
+ 274
@@ -2794,7 +2794,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 290
+ 286
libs/ui/src/lib/i18n.ts
@@ -2850,7 +2850,7 @@
Contant geld
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 216
+ 219
libs/ui/src/lib/i18n.ts
@@ -3134,7 +3134,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 369
+ 372
apps/client/src/app/pages/features/features-page.html
@@ -3142,7 +3142,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 202
+ 198
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
@@ -3182,7 +3182,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 309
+ 305
libs/ui/src/lib/i18n.ts
@@ -3902,7 +3902,7 @@
Saldo bijwerken
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 112
+ 108
@@ -4082,7 +4082,7 @@
Verplichtingen
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 299
+ 302
apps/client/src/app/pages/features/features-page.html
@@ -4498,7 +4498,7 @@
Assets
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 230
+ 233
@@ -5444,7 +5444,7 @@
Kosten
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 262
+ 258
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -5652,7 +5652,7 @@
Open Source Vermogensbeheer Software
apps/client/src/app/pages/i18n/i18n-page.html
- 246
+ 237
@@ -5752,7 +5752,7 @@
Wilt u dit rekeningsaldo echt verwijderen?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 120
+ 113
@@ -5928,7 +5928,7 @@
Week tot nu toe
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5940,7 +5940,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5948,7 +5948,7 @@
Maand tot nu toe
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5960,7 +5960,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5968,7 +5968,7 @@
Jaar tot nu toe
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -6016,7 +6016,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -6028,7 +6028,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -6757,7 +6757,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 345
+ 341
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
@@ -6813,7 +6813,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 347
+ 343
libs/ui/src/lib/i18n.ts
@@ -7117,7 +7117,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 45
+ 44
libs/common/src/lib/routes/routes.ts
@@ -7133,7 +7133,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 34
+ 33
libs/common/src/lib/routes/routes.ts
@@ -7339,7 +7339,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 356
+ 352
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html
@@ -7643,7 +7643,7 @@
Find account, holding or page...
libs/ui/src/lib/assistant/assistant.component.ts
- 151
+ 115
@@ -7888,36 +7888,12 @@
150
-
- Fee Ratio (legacy)
- Vergoedingsverhouding
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 152
-
-
-
- The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- De kosten overschrijden ${thresholdMax}% van uw initiële investering (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 154
-
-
-
- The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- De kosten bedragen niet meer dan ${thresholdMax}% van uw initiële investering (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 158
-
-
Fee Ratio
Fee Ratio
apps/client/src/app/pages/i18n/i18n-page.html
- 161
+ 152
@@ -7925,7 +7901,7 @@
The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 163
+ 154
@@ -7933,7 +7909,7 @@
The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 167
+ 158
@@ -8103,7 +8079,7 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 56
+ 53
@@ -8392,7 +8368,7 @@
Kosten
apps/client/src/app/pages/i18n/i18n-page.html
- 170
+ 161
@@ -8440,7 +8416,7 @@
Risico’s van regionale marktclusters
apps/client/src/app/pages/i18n/i18n-page.html
- 172
+ 163
@@ -8536,7 +8512,7 @@
Azië-Pacific
apps/client/src/app/pages/i18n/i18n-page.html
- 174
+ 165
@@ -8544,7 +8520,7 @@
De bijdrage van de Azië-Pacific markt aan je huidige investering (${valueRatio}%) overschrijdt ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 176
+ 167
@@ -8552,7 +8528,7 @@
De bijdrage van de Azië-Pacific markt aan je huidige investering (${valueRatio}%) ligt onder ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 180
+ 171
@@ -8560,7 +8536,7 @@
De bijdrage van de Azië-Pacific markt aan je huidige investering (${valueRatio}%) ligt binnen het bereik van ${thresholdMin}% en ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 184
+ 175
@@ -8568,7 +8544,7 @@
Opkomende markten
apps/client/src/app/pages/i18n/i18n-page.html
- 189
+ 180
@@ -8576,7 +8552,7 @@
De bijdrage van de opkomende markten aan je huidige investering (${valueRatio}%) overschrijdt ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 192
+ 183
@@ -8584,7 +8560,7 @@
De bijdrage van de opkomende markten aan je huidige investering (${valueRatio}%) ligt onder ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 196
+ 187
@@ -8592,7 +8568,7 @@
De bijdrage van de opkomende markten aan je huidige investering (${valueRatio}%) ligt binnen het bereik van ${thresholdMin}% en ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 200
+ 191
@@ -8600,7 +8576,7 @@
Europa
apps/client/src/app/pages/i18n/i18n-page.html
- 204
+ 195
@@ -8608,7 +8584,7 @@
De bijdrage van de Europese markt aan je huidige investering (${valueRatio}%) overschrijdt ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 206
+ 197
@@ -8616,7 +8592,7 @@
De bijdrage van de Europese markt aan je huidige investering (${valueRatio}%) ligt onder ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 210
+ 201
@@ -8624,7 +8600,7 @@
De bijdrage van de Europese markt aan je huidige investering (${valueRatio}%) ligt binnen het bereik van ${thresholdMin}% en ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 214
+ 205
@@ -8632,7 +8608,7 @@
Japan
apps/client/src/app/pages/i18n/i18n-page.html
- 218
+ 209
@@ -8640,7 +8616,7 @@
De bijdrage van de Japanse markt aan je huidige investering (${valueRatio}%) overschrijdt ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 220
+ 211
@@ -8648,7 +8624,7 @@
De bijdrage van de Japanse markt aan je huidige investering (${valueRatio}%) ligt onder ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 224
+ 215
@@ -8656,7 +8632,7 @@
De bijdrage van de Japanse markt aan je huidige investering (${valueRatio}%) ligt binnen het bereik van ${thresholdMin}% en ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 228
+ 219
@@ -8664,7 +8640,7 @@
Noord-Amerika
apps/client/src/app/pages/i18n/i18n-page.html
- 232
+ 223
@@ -8672,7 +8648,7 @@
De bijdrage van de Noord-Amerikaanse markt aan je huidige investering (${valueRatio}%) overschrijdt ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 234
+ 225
@@ -8680,7 +8656,7 @@
De bijdrage van de Noord-Amerikaanse markt aan je huidige investering (${valueRatio}%) ligt onder ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 238
+ 229
@@ -8688,7 +8664,7 @@
De bijdrage van de Noord-Amerikaanse markt aan je huidige investering (${valueRatio}%) ligt binnen het bereik van ${thresholdMin}% en ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 242
+ 233
diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf
index fdc528254..bc8b948cd 100644
--- a/apps/client/src/locales/messages.pl.xlf
+++ b/apps/client/src/locales/messages.pl.xlf
@@ -379,7 +379,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 139
+ 135
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -435,7 +435,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 145
+ 141
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -455,15 +455,15 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 205
+ 201
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 208
+ 204
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 211
+ 207
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -615,7 +615,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 155
+ 151
libs/ui/src/lib/i18n.ts
@@ -711,7 +711,7 @@
Data
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 161
+ 157
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -991,7 +991,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 275
+ 271
@@ -1035,7 +1035,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 124
+ 120
@@ -1823,7 +1823,7 @@
Aktywa
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 230
+ 233
@@ -1831,7 +1831,7 @@
Siła Nabywcza
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 245
+ 248
@@ -1839,7 +1839,7 @@
Wykluczone z Analizy
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 271
+ 274
@@ -1847,7 +1847,7 @@
Pasywa (Zobowiązania Finansowe)
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 299
+ 302
apps/client/src/app/pages/features/features-page.html
@@ -1859,7 +1859,7 @@
Wartość Netto
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 321
+ 324
@@ -1867,7 +1867,7 @@
Osiągi w Ujęciu Rocznym
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 335
+ 338
@@ -1903,7 +1903,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 189
+ 185
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -2099,7 +2099,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 363
+ 362
@@ -2111,7 +2111,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -2123,7 +2123,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -2135,7 +2135,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -2155,7 +2155,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 415
+ 414
@@ -2755,11 +2755,11 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 48
+ 45
apps/client/src/app/pages/resources/resources-page.component.ts
- 30
+ 29
libs/common/src/lib/routes/routes.ts
@@ -2903,7 +2903,7 @@
Ponieważ jesteś już zalogowany, nie możesz uzyskać dostępu do konta demo.
apps/client/src/app/pages/demo/demo-page.component.ts
- 35
+ 32
@@ -3151,7 +3151,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 40
+ 39
libs/common/src/lib/routes/routes.ts
@@ -3191,7 +3191,7 @@
Oprogramowanie Open Source do Zarządzania Majątkiem
apps/client/src/app/pages/i18n/i18n-page.html
- 246
+ 237
@@ -3731,7 +3731,7 @@
Zaktualizuj Saldo Gotówkowe
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 112
+ 108
@@ -3739,7 +3739,7 @@
Cena Jednostkowa
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 214
+ 210
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -4095,7 +4095,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 369
+ 372
apps/client/src/app/pages/features/features-page.html
@@ -4103,7 +4103,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 202
+ 198
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
@@ -4127,7 +4127,7 @@
Depozyt
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 377
+ 385
@@ -5048,11 +5048,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 359
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 387
+ 395
libs/ui/src/lib/i18n.ts
@@ -5064,7 +5064,7 @@
Oszczędności
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 397
+ 405
@@ -5144,7 +5144,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 290
+ 286
libs/ui/src/lib/i18n.ts
@@ -5176,7 +5176,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 309
+ 305
libs/ui/src/lib/i18n.ts
@@ -5432,7 +5432,7 @@
Opłata
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 262
+ 258
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -5476,7 +5476,7 @@
Gotówka
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 216
+ 219
libs/ui/src/lib/i18n.ts
@@ -5752,7 +5752,7 @@
Czy na pewno chcesz usunąć saldo tego konta?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 120
+ 113
@@ -5928,7 +5928,7 @@
Dotychczasowy tydzień
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5940,7 +5940,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5948,7 +5948,7 @@
Od początku miesiąca
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5960,7 +5960,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5968,7 +5968,7 @@
Od początku roku
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -6016,7 +6016,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -6028,7 +6028,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -6757,7 +6757,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 345
+ 341
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
@@ -6813,7 +6813,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 347
+ 343
libs/ui/src/lib/i18n.ts
@@ -7117,7 +7117,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 45
+ 44
libs/common/src/lib/routes/routes.ts
@@ -7133,7 +7133,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 34
+ 33
libs/common/src/lib/routes/routes.ts
@@ -7339,7 +7339,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 356
+ 352
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html
@@ -7643,7 +7643,7 @@
Find account, holding or page...
libs/ui/src/lib/assistant/assistant.component.ts
- 151
+ 115
@@ -7888,36 +7888,12 @@
150
-
- Fee Ratio (legacy)
- Stosunek opłat
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 152
-
-
-
- The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- Opłaty przekraczają ${thresholdMax}% początkowej inwestycji (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 154
-
-
-
- The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- Opłaty nie przekraczają ${thresholdMax}% początkowej inwestycji (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 158
-
-
Fee Ratio
Fee Ratio
apps/client/src/app/pages/i18n/i18n-page.html
- 161
+ 152
@@ -7925,7 +7901,7 @@
The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 163
+ 154
@@ -7933,7 +7909,7 @@
The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 167
+ 158
@@ -8103,7 +8079,7 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 56
+ 53
@@ -8392,7 +8368,7 @@
Fees
apps/client/src/app/pages/i18n/i18n-page.html
- 170
+ 161
@@ -8440,7 +8416,7 @@
Regional Market Cluster Risks
apps/client/src/app/pages/i18n/i18n-page.html
- 172
+ 163
@@ -8536,7 +8512,7 @@
Asia-Pacific
apps/client/src/app/pages/i18n/i18n-page.html
- 174
+ 165
@@ -8544,7 +8520,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 176
+ 167
@@ -8552,7 +8528,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 180
+ 171
@@ -8560,7 +8536,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 184
+ 175
@@ -8568,7 +8544,7 @@
Emerging Markets
apps/client/src/app/pages/i18n/i18n-page.html
- 189
+ 180
@@ -8576,7 +8552,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 192
+ 183
@@ -8584,7 +8560,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 196
+ 187
@@ -8592,7 +8568,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 200
+ 191
@@ -8600,7 +8576,7 @@
Europe
apps/client/src/app/pages/i18n/i18n-page.html
- 204
+ 195
@@ -8608,7 +8584,7 @@
The Europe market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 206
+ 197
@@ -8616,7 +8592,7 @@
The Europe market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 210
+ 201
@@ -8624,7 +8600,7 @@
The Europe market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 214
+ 205
@@ -8632,7 +8608,7 @@
Japan
apps/client/src/app/pages/i18n/i18n-page.html
- 218
+ 209
@@ -8640,7 +8616,7 @@
The Japan market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 220
+ 211
@@ -8648,7 +8624,7 @@
The Japan market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 224
+ 215
@@ -8656,7 +8632,7 @@
The Japan market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 228
+ 219
@@ -8664,7 +8640,7 @@
North America
apps/client/src/app/pages/i18n/i18n-page.html
- 232
+ 223
@@ -8672,7 +8648,7 @@
The North America market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 234
+ 225
@@ -8680,7 +8656,7 @@
The North America market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 238
+ 229
@@ -8688,7 +8664,7 @@
The North America market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 242
+ 233
diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf
index 194922435..e49f13b96 100644
--- a/apps/client/src/locales/messages.pt.xlf
+++ b/apps/client/src/locales/messages.pt.xlf
@@ -142,7 +142,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 139
+ 135
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -198,7 +198,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 145
+ 141
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -234,15 +234,15 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 205
+ 201
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 208
+ 204
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 211
+ 207
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -374,7 +374,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 155
+ 151
libs/ui/src/lib/i18n.ts
@@ -494,7 +494,7 @@
Data
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 161
+ 157
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -942,7 +942,7 @@
Depósito
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 377
+ 385
@@ -1102,7 +1102,7 @@
Poder de Compra
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 245
+ 248
@@ -1110,7 +1110,7 @@
Excluído da Análise
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 271
+ 274
@@ -1118,7 +1118,7 @@
Valor Líquido
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 321
+ 324
@@ -1126,7 +1126,7 @@
Desempenho Anual
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 335
+ 338
@@ -1162,7 +1162,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 189
+ 185
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -1302,7 +1302,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 363
+ 362
@@ -1314,7 +1314,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -1326,7 +1326,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -1338,7 +1338,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -1358,7 +1358,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 415
+ 414
@@ -1890,7 +1890,7 @@
Como já tem sessão iniciada, não pode aceder à conta de demonstração.
apps/client/src/app/pages/demo/demo-page.component.ts
- 35
+ 32
@@ -1954,11 +1954,11 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 48
+ 45
apps/client/src/app/pages/resources/resources-page.component.ts
- 30
+ 29
libs/common/src/lib/routes/routes.ts
@@ -1998,7 +1998,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 40
+ 39
libs/common/src/lib/routes/routes.ts
@@ -2122,7 +2122,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 124
+ 120
@@ -2130,7 +2130,7 @@
Preço por Unidade
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 214
+ 210
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -2150,7 +2150,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 275
+ 271
@@ -2754,11 +2754,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 359
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 387
+ 395
libs/ui/src/lib/i18n.ts
@@ -2770,7 +2770,7 @@
Poupanças
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 397
+ 405
@@ -2814,7 +2814,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 290
+ 286
libs/ui/src/lib/i18n.ts
@@ -2898,7 +2898,7 @@
Dinheiro
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 216
+ 219
libs/ui/src/lib/i18n.ts
@@ -3198,7 +3198,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 369
+ 372
apps/client/src/app/pages/features/features-page.html
@@ -3206,7 +3206,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 202
+ 198
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
@@ -3246,7 +3246,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 309
+ 305
libs/ui/src/lib/i18n.ts
@@ -3902,7 +3902,7 @@
Atualizar saldo em Dinheiro
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 112
+ 108
@@ -4082,7 +4082,7 @@
Responsabilidades
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 299
+ 302
apps/client/src/app/pages/features/features-page.html
@@ -4498,7 +4498,7 @@
Ativos
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 230
+ 233
@@ -5444,7 +5444,7 @@
Taxa
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 262
+ 258
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -5652,7 +5652,7 @@
Software de gerenciamento de patrimônio de código aberto
apps/client/src/app/pages/i18n/i18n-page.html
- 246
+ 237
@@ -5752,7 +5752,7 @@
Você realmente deseja excluir o saldo desta conta?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 120
+ 113
@@ -5928,7 +5928,7 @@
Semana até agora
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5940,7 +5940,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5948,7 +5948,7 @@
Do mês até a data
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5960,7 +5960,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5968,7 +5968,7 @@
No acumulado do ano
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -6016,7 +6016,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -6028,7 +6028,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -6757,7 +6757,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 345
+ 341
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
@@ -6813,7 +6813,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 347
+ 343
libs/ui/src/lib/i18n.ts
@@ -7117,7 +7117,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 45
+ 44
libs/common/src/lib/routes/routes.ts
@@ -7133,7 +7133,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 34
+ 33
libs/common/src/lib/routes/routes.ts
@@ -7339,7 +7339,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 356
+ 352
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html
@@ -7643,7 +7643,7 @@
Find account, holding or page...
libs/ui/src/lib/assistant/assistant.component.ts
- 151
+ 115
@@ -7888,36 +7888,12 @@
150
-
- Fee Ratio (legacy)
- Fee Ratio (legacy)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 152
-
-
-
- The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 154
-
-
-
- The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 158
-
-
Fee Ratio
Fee Ratio
apps/client/src/app/pages/i18n/i18n-page.html
- 161
+ 152
@@ -7925,7 +7901,7 @@
The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 163
+ 154
@@ -7933,7 +7909,7 @@
The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 167
+ 158
@@ -8103,7 +8079,7 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 56
+ 53
@@ -8392,7 +8368,7 @@
Tarifas
apps/client/src/app/pages/i18n/i18n-page.html
- 170
+ 161
@@ -8440,7 +8416,7 @@
Riscos de cluster de mercado regional
apps/client/src/app/pages/i18n/i18n-page.html
- 172
+ 163
@@ -8536,7 +8512,7 @@
Ásia-Pacífico
apps/client/src/app/pages/i18n/i18n-page.html
- 174
+ 165
@@ -8544,7 +8520,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 176
+ 167
@@ -8552,7 +8528,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 180
+ 171
@@ -8560,7 +8536,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 184
+ 175
@@ -8568,7 +8544,7 @@
Mercados Emergentes
apps/client/src/app/pages/i18n/i18n-page.html
- 189
+ 180
@@ -8576,7 +8552,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 192
+ 183
@@ -8584,7 +8560,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 196
+ 187
@@ -8592,7 +8568,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 200
+ 191
@@ -8600,7 +8576,7 @@
Europa
apps/client/src/app/pages/i18n/i18n-page.html
- 204
+ 195
@@ -8608,7 +8584,7 @@
The Europe market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 206
+ 197
@@ -8616,7 +8592,7 @@
The Europe market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 210
+ 201
@@ -8624,7 +8600,7 @@
The Europe market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 214
+ 205
@@ -8632,7 +8608,7 @@
Japão
apps/client/src/app/pages/i18n/i18n-page.html
- 218
+ 209
@@ -8640,7 +8616,7 @@
The Japan market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 220
+ 211
@@ -8648,7 +8624,7 @@
The Japan market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 224
+ 215
@@ -8656,7 +8632,7 @@
The Japan market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 228
+ 219
@@ -8664,7 +8640,7 @@
América do Norte
apps/client/src/app/pages/i18n/i18n-page.html
- 232
+ 223
@@ -8672,7 +8648,7 @@
The North America market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 234
+ 225
@@ -8680,7 +8656,7 @@
The North America market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 238
+ 229
@@ -8688,7 +8664,7 @@
The North America market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 242
+ 233
diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf
index a7b86f624..abe33aa80 100644
--- a/apps/client/src/locales/messages.tr.xlf
+++ b/apps/client/src/locales/messages.tr.xlf
@@ -339,7 +339,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 139
+ 135
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -395,7 +395,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 145
+ 141
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -415,15 +415,15 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 205
+ 201
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 208
+ 204
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 211
+ 207
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -555,7 +555,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 155
+ 151
libs/ui/src/lib/i18n.ts
@@ -675,7 +675,7 @@
Tarih
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 161
+ 157
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -923,7 +923,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 275
+ 271
@@ -951,7 +951,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 124
+ 120
@@ -1679,7 +1679,7 @@
Varlıklar
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 230
+ 233
@@ -1687,7 +1687,7 @@
Alım Limiti
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 245
+ 248
@@ -1695,7 +1695,7 @@
Analize Dahil Edilmemiştir.
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 271
+ 274
@@ -1703,7 +1703,7 @@
Yükümlülükler
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 299
+ 302
apps/client/src/app/pages/features/features-page.html
@@ -1715,7 +1715,7 @@
Toplam Varlık
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 321
+ 324
@@ -1723,7 +1723,7 @@
Yıllıklandırılmış Performans
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 335
+ 338
@@ -1759,7 +1759,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 189
+ 185
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -1967,7 +1967,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 363
+ 362
@@ -1979,7 +1979,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -1991,7 +1991,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -2003,7 +2003,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -2023,7 +2023,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 415
+ 414
@@ -2319,11 +2319,11 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 48
+ 45
apps/client/src/app/pages/resources/resources-page.component.ts
- 30
+ 29
libs/common/src/lib/routes/routes.ts
@@ -2467,7 +2467,7 @@
Oturum açmış olduğunuz için demo hesabına erişemezsiniz.
apps/client/src/app/pages/demo/demo-page.component.ts
- 35
+ 32
@@ -2727,7 +2727,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 40
+ 39
libs/common/src/lib/routes/routes.ts
@@ -3207,7 +3207,7 @@
Nakit Bakiyesini Güncelle
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 112
+ 108
@@ -3215,7 +3215,7 @@
Birim Fiyat
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 214
+ 210
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -3579,7 +3579,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 369
+ 372
apps/client/src/app/pages/features/features-page.html
@@ -3587,7 +3587,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 202
+ 198
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
@@ -3611,7 +3611,7 @@
Para Yatırma
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 377
+ 385
@@ -4744,11 +4744,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 359
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 387
+ 395
libs/ui/src/lib/i18n.ts
@@ -4760,7 +4760,7 @@
Tasarruflar
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 397
+ 405
@@ -4840,7 +4840,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 290
+ 286
libs/ui/src/lib/i18n.ts
@@ -4872,7 +4872,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 309
+ 305
libs/ui/src/lib/i18n.ts
@@ -5156,7 +5156,7 @@
Nakit
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 216
+ 219
libs/ui/src/lib/i18n.ts
@@ -5452,7 +5452,7 @@
Ücret
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 262
+ 258
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -5652,7 +5652,7 @@
Açık Kaynak Varlık Yönetim Yazılımı
apps/client/src/app/pages/i18n/i18n-page.html
- 246
+ 237
@@ -5752,7 +5752,7 @@
Bu nakit bakiyesini silmeyi gerçekten istiyor musunuz?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 120
+ 113
@@ -5928,7 +5928,7 @@
Hafta içi
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5940,7 +5940,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5948,7 +5948,7 @@
Ay içi
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5960,7 +5960,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5968,7 +5968,7 @@
Yıl içi
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -6016,7 +6016,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -6028,7 +6028,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -6757,7 +6757,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 345
+ 341
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
@@ -6813,7 +6813,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 347
+ 343
libs/ui/src/lib/i18n.ts
@@ -7117,7 +7117,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 45
+ 44
libs/common/src/lib/routes/routes.ts
@@ -7133,7 +7133,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 34
+ 33
libs/common/src/lib/routes/routes.ts
@@ -7339,7 +7339,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 356
+ 352
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html
@@ -7643,7 +7643,7 @@
Find account, holding or page...
libs/ui/src/lib/assistant/assistant.component.ts
- 151
+ 115
@@ -7888,36 +7888,12 @@
150
-
- Fee Ratio (legacy)
- Ücret Oranı
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 152
-
-
-
- The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- Ücretler, ilk yatırımınızın %${thresholdMax} kadarını aşıyor (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 154
-
-
-
- The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- Ücretler, ilk yatırımınızın %${thresholdMax}’ını (${feeRatio}%) aşmaz
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 158
-
-
Fee Ratio
Fee Ratio
apps/client/src/app/pages/i18n/i18n-page.html
- 161
+ 152
@@ -7925,7 +7901,7 @@
The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 163
+ 154
@@ -7933,7 +7909,7 @@
The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 167
+ 158
@@ -8103,7 +8079,7 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 56
+ 53
@@ -8392,7 +8368,7 @@
Fees
apps/client/src/app/pages/i18n/i18n-page.html
- 170
+ 161
@@ -8440,7 +8416,7 @@
Regional Market Cluster Risks
apps/client/src/app/pages/i18n/i18n-page.html
- 172
+ 163
@@ -8536,7 +8512,7 @@
Asya-Pasifik
apps/client/src/app/pages/i18n/i18n-page.html
- 174
+ 165
@@ -8544,7 +8520,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 176
+ 167
@@ -8552,7 +8528,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 180
+ 171
@@ -8560,7 +8536,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 184
+ 175
@@ -8568,7 +8544,7 @@
Gelişmekte Olan Piyasalar
apps/client/src/app/pages/i18n/i18n-page.html
- 189
+ 180
@@ -8576,7 +8552,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 192
+ 183
@@ -8584,7 +8560,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 196
+ 187
@@ -8592,7 +8568,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 200
+ 191
@@ -8600,7 +8576,7 @@
Avrupa
apps/client/src/app/pages/i18n/i18n-page.html
- 204
+ 195
@@ -8608,7 +8584,7 @@
The Europe market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 206
+ 197
@@ -8616,7 +8592,7 @@
The Europe market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 210
+ 201
@@ -8624,7 +8600,7 @@
The Europe market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 214
+ 205
@@ -8632,7 +8608,7 @@
Japonya
apps/client/src/app/pages/i18n/i18n-page.html
- 218
+ 209
@@ -8640,7 +8616,7 @@
The Japan market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 220
+ 211
@@ -8648,7 +8624,7 @@
The Japan market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 224
+ 215
@@ -8656,7 +8632,7 @@
The Japan market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 228
+ 219
@@ -8664,7 +8640,7 @@
Kuzey Amerika
apps/client/src/app/pages/i18n/i18n-page.html
- 232
+ 223
@@ -8672,7 +8648,7 @@
The North America market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 234
+ 225
@@ -8680,7 +8656,7 @@
The North America market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 238
+ 229
@@ -8688,7 +8664,7 @@
The North America market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 242
+ 233
diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf
index 61cebd47a..95ad50c7c 100644
--- a/apps/client/src/locales/messages.uk.xlf
+++ b/apps/client/src/locales/messages.uk.xlf
@@ -471,7 +471,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 139
+ 135
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -527,7 +527,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 145
+ 141
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -547,15 +547,15 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 205
+ 201
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 208
+ 204
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 211
+ 207
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -735,7 +735,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 155
+ 151
libs/ui/src/lib/i18n.ts
@@ -1159,7 +1159,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 275
+ 271
@@ -1211,7 +1211,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 124
+ 120
@@ -1855,7 +1855,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 189
+ 185
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -2231,7 +2231,7 @@
Активи
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 230
+ 233
@@ -2239,7 +2239,7 @@
Купівельна спроможність
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 245
+ 248
@@ -2247,7 +2247,7 @@
Виключено з аналізу
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 271
+ 274
@@ -2255,7 +2255,7 @@
Зобов’язання
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 299
+ 302
apps/client/src/app/pages/features/features-page.html
@@ -2267,7 +2267,7 @@
Чиста вартість
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 321
+ 324
@@ -2275,7 +2275,7 @@
Річна доходність
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 335
+ 338
@@ -2319,7 +2319,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 356
+ 352
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html
@@ -2555,7 +2555,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 363
+ 362
@@ -2567,7 +2567,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -2579,7 +2579,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -2591,7 +2591,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -2611,7 +2611,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 415
+ 414
@@ -3367,11 +3367,11 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 48
+ 45
apps/client/src/app/pages/resources/resources-page.component.ts
- 30
+ 29
libs/common/src/lib/routes/routes.ts
@@ -3523,7 +3523,7 @@
Оскільки ви вже ввійшли, ви не можете отримати доступ до демонстраційного обліковий запис.
apps/client/src/app/pages/demo/demo-page.component.ts
- 35
+ 32
@@ -3796,7 +3796,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 40
+ 39
libs/common/src/lib/routes/routes.ts
@@ -3844,7 +3844,7 @@
Програмне забезпечення управління багатством з відкритим кодом
apps/client/src/app/pages/i18n/i18n-page.html
- 246
+ 237
@@ -4384,7 +4384,7 @@
Оновити баланс готівки
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 112
+ 108
@@ -4392,7 +4392,7 @@
Дата
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 161
+ 157
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -4412,7 +4412,7 @@
Ціна за одиницю
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 214
+ 210
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -4800,7 +4800,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 369
+ 372
apps/client/src/app/pages/features/features-page.html
@@ -4808,7 +4808,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 202
+ 198
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
@@ -5316,7 +5316,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 45
+ 44
libs/common/src/lib/routes/routes.ts
@@ -5332,7 +5332,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 34
+ 33
libs/common/src/lib/routes/routes.ts
@@ -6075,7 +6075,7 @@
Ви дійсно хочете видалити цей рахунок?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 120
+ 113
@@ -6155,7 +6155,7 @@
Тиждень до дати
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -6167,7 +6167,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -6175,7 +6175,7 @@
Місяць до дати
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -6187,7 +6187,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -6195,7 +6195,7 @@
Рік до дати
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -6215,7 +6215,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -6227,7 +6227,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -6375,7 +6375,7 @@
Депозит
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 377
+ 385
@@ -6387,11 +6387,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 359
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 387
+ 395
libs/ui/src/lib/i18n.ts
@@ -6403,7 +6403,7 @@
Заощадження
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 397
+ 405
@@ -6499,7 +6499,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 290
+ 286
libs/ui/src/lib/i18n.ts
@@ -6531,7 +6531,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 309
+ 305
libs/ui/src/lib/i18n.ts
@@ -6587,7 +6587,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 345
+ 341
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
@@ -6651,7 +6651,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 347
+ 343
libs/ui/src/lib/i18n.ts
@@ -6915,7 +6915,7 @@
Комісія
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 262
+ 258
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -6959,7 +6959,7 @@
Готівка
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 216
+ 219
libs/ui/src/lib/i18n.ts
@@ -7643,7 +7643,7 @@
Find account, holding or page...
libs/ui/src/lib/assistant/assistant.component.ts
- 151
+ 115
@@ -7888,36 +7888,12 @@
150
-
- Fee Ratio (legacy)
- Fee Ratio (legacy)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 152
-
-
-
- The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 154
-
-
-
- The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 158
-
-
Fee Ratio
Fee Ratio
apps/client/src/app/pages/i18n/i18n-page.html
- 161
+ 152
@@ -7925,7 +7901,7 @@
The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 163
+ 154
@@ -7933,7 +7909,7 @@
The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 167
+ 158
@@ -8103,7 +8079,7 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 56
+ 53
@@ -8392,7 +8368,7 @@
Fees
apps/client/src/app/pages/i18n/i18n-page.html
- 170
+ 161
@@ -8440,7 +8416,7 @@
Regional Market Cluster Risks
apps/client/src/app/pages/i18n/i18n-page.html
- 172
+ 163
@@ -8536,7 +8512,7 @@
Asia-Pacific
apps/client/src/app/pages/i18n/i18n-page.html
- 174
+ 165
@@ -8544,7 +8520,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 176
+ 167
@@ -8552,7 +8528,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 180
+ 171
@@ -8560,7 +8536,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 184
+ 175
@@ -8568,7 +8544,7 @@
Emerging Markets
apps/client/src/app/pages/i18n/i18n-page.html
- 189
+ 180
@@ -8576,7 +8552,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 192
+ 183
@@ -8584,7 +8560,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 196
+ 187
@@ -8592,7 +8568,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 200
+ 191
@@ -8600,7 +8576,7 @@
Europe
apps/client/src/app/pages/i18n/i18n-page.html
- 204
+ 195
@@ -8608,7 +8584,7 @@
The Europe market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 206
+ 197
@@ -8616,7 +8592,7 @@
The Europe market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 210
+ 201
@@ -8624,7 +8600,7 @@
The Europe market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 214
+ 205
@@ -8632,7 +8608,7 @@
Japan
apps/client/src/app/pages/i18n/i18n-page.html
- 218
+ 209
@@ -8640,7 +8616,7 @@
The Japan market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 220
+ 211
@@ -8648,7 +8624,7 @@
The Japan market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 224
+ 215
@@ -8656,7 +8632,7 @@
The Japan market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 228
+ 219
@@ -8664,7 +8640,7 @@
North America
apps/client/src/app/pages/i18n/i18n-page.html
- 232
+ 223
@@ -8672,7 +8648,7 @@
The North America market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 234
+ 225
@@ -8680,7 +8656,7 @@
The North America market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 238
+ 229
@@ -8688,7 +8664,7 @@
The North America market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 242
+ 233
diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf
index 03644820a..b6a54edfe 100644
--- a/apps/client/src/locales/messages.xlf
+++ b/apps/client/src/locales/messages.xlf
@@ -362,7 +362,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 139
+ 135
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -416,7 +416,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 145
+ 141
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -435,15 +435,15 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 205
+ 201
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 208
+ 204
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 211
+ 207
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -589,7 +589,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 155
+ 151
libs/ui/src/lib/i18n.ts
@@ -674,7 +674,7 @@
Date
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 161
+ 157
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -952,7 +952,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 275
+ 271
@@ -992,7 +992,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 124
+ 120
@@ -1704,28 +1704,28 @@
Assets
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 230
+ 233
Buying Power
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 245
+ 248
Excluded from Analysis
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 271
+ 274
Liabilities
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 299
+ 302
apps/client/src/app/pages/features/features-page.html
@@ -1736,14 +1736,14 @@
Net Worth
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 321
+ 324
Annualized Performance
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 335
+ 338
@@ -1775,7 +1775,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 189
+ 185
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -1958,7 +1958,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 363
+ 362
@@ -1969,7 +1969,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -1980,7 +1980,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -1991,7 +1991,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -2009,7 +2009,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 415
+ 414
@@ -2554,11 +2554,11 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 48
+ 45
apps/client/src/app/pages/resources/resources-page.component.ts
- 30
+ 29
libs/common/src/lib/routes/routes.ts
@@ -2698,7 +2698,7 @@
As you are already logged in, you cannot access the demo account.
apps/client/src/app/pages/demo/demo-page.component.ts
- 35
+ 32
@@ -2927,7 +2927,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 40
+ 39
libs/common/src/lib/routes/routes.ts
@@ -2964,7 +2964,7 @@
Open Source Wealth Management Software
apps/client/src/app/pages/i18n/i18n-page.html
- 246
+ 237
@@ -3451,14 +3451,14 @@
Update Cash Balance
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 112
+ 108
Unit Price
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 214
+ 210
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -3778,7 +3778,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 369
+ 372
apps/client/src/app/pages/features/features-page.html
@@ -3786,7 +3786,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 202
+ 198
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
@@ -3808,7 +3808,7 @@
Deposit
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 377
+ 385
@@ -4513,7 +4513,7 @@
Do you really want to delete this account balance?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 120
+ 113
@@ -4669,11 +4669,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 359
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 387
+ 395
libs/ui/src/lib/i18n.ts
@@ -4684,7 +4684,7 @@
Savings
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 397
+ 405
@@ -4759,7 +4759,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 290
+ 286
libs/ui/src/lib/i18n.ts
@@ -4790,7 +4790,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 309
+ 305
libs/ui/src/lib/i18n.ts
@@ -5013,7 +5013,7 @@
Fee
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 262
+ 258
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -5053,7 +5053,7 @@
Cash
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 216
+ 219
libs/ui/src/lib/i18n.ts
@@ -5417,21 +5417,21 @@
Year to date
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
Week to date
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
Month to date
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5442,7 +5442,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5453,7 +5453,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5497,7 +5497,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -5508,7 +5508,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -6125,7 +6125,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 345
+ 341
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
@@ -6208,7 +6208,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 347
+ 343
libs/ui/src/lib/i18n.ts
@@ -6486,7 +6486,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 45
+ 44
libs/common/src/lib/routes/routes.ts
@@ -6513,7 +6513,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 34
+ 33
libs/common/src/lib/routes/routes.ts
@@ -6688,7 +6688,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 356
+ 352
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html
@@ -6947,7 +6947,7 @@
Find account, holding or page...
libs/ui/src/lib/assistant/assistant.component.ts
- 151
+ 115
@@ -7155,46 +7155,25 @@
150
-
- Fee Ratio (legacy)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 152
-
-
-
- The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 154
-
-
-
- The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 158
-
-
Fee Ratio
apps/client/src/app/pages/i18n/i18n-page.html
- 161
+ 152
The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 163
+ 154
The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 167
+ 158
@@ -7347,7 +7326,7 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 56
+ 53
@@ -7609,7 +7588,7 @@
Fees
apps/client/src/app/pages/i18n/i18n-page.html
- 170
+ 161
@@ -7651,7 +7630,7 @@
Regional Market Cluster Risks
apps/client/src/app/pages/i18n/i18n-page.html
- 172
+ 163
@@ -7728,140 +7707,140 @@
Asia-Pacific
apps/client/src/app/pages/i18n/i18n-page.html
- 174
+ 165
The Asia-Pacific market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 176
+ 167
The Asia-Pacific market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 180
+ 171
The Asia-Pacific market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 184
+ 175
Emerging Markets
apps/client/src/app/pages/i18n/i18n-page.html
- 189
+ 180
The Emerging Markets contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 192
+ 183
The Emerging Markets contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 196
+ 187
The Emerging Markets contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 200
+ 191
Europe
apps/client/src/app/pages/i18n/i18n-page.html
- 204
+ 195
The Europe market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 206
+ 197
The Europe market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 210
+ 201
The Europe market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 214
+ 205
Japan
apps/client/src/app/pages/i18n/i18n-page.html
- 218
+ 209
The Japan market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 220
+ 211
The Japan market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 224
+ 215
The Japan market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 228
+ 219
North America
apps/client/src/app/pages/i18n/i18n-page.html
- 232
+ 223
The North America market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 234
+ 225
The North America market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 238
+ 229
The North America market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 242
+ 233
diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf
index 67007cdef..ac81eebc7 100644
--- a/apps/client/src/locales/messages.zh.xlf
+++ b/apps/client/src/locales/messages.zh.xlf
@@ -388,7 +388,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 139
+ 135
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -444,7 +444,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 145
+ 141
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -464,15 +464,15 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 205
+ 201
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 208
+ 204
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 211
+ 207
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -624,7 +624,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 155
+ 151
libs/ui/src/lib/i18n.ts
@@ -720,7 +720,7 @@
日期
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 161
+ 157
libs/ui/src/lib/account-balances/account-balances.component.html
@@ -1000,7 +1000,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 275
+ 271
@@ -1044,7 +1044,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 124
+ 120
@@ -1832,7 +1832,7 @@
资产
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 230
+ 233
@@ -1840,7 +1840,7 @@
购买力
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 245
+ 248
@@ -1848,7 +1848,7 @@
从分析中排除
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 271
+ 274
@@ -1856,7 +1856,7 @@
负债
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 299
+ 302
apps/client/src/app/pages/features/features-page.html
@@ -1868,7 +1868,7 @@
净值
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 321
+ 324
@@ -1876,7 +1876,7 @@
年化业绩
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 335
+ 338
@@ -1912,7 +1912,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 189
+ 185
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -2108,7 +2108,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 363
+ 362
@@ -2120,7 +2120,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -2132,7 +2132,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -2144,7 +2144,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -2164,7 +2164,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 415
+ 414
@@ -2764,11 +2764,11 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 48
+ 45
apps/client/src/app/pages/resources/resources-page.component.ts
- 30
+ 29
libs/common/src/lib/routes/routes.ts
@@ -2912,7 +2912,7 @@
由于您已经登录,因此无法访问模拟帐户。
apps/client/src/app/pages/demo/demo-page.component.ts
- 35
+ 32
@@ -3160,7 +3160,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 40
+ 39
libs/common/src/lib/routes/routes.ts
@@ -3200,7 +3200,7 @@
开源财富管理软件
apps/client/src/app/pages/i18n/i18n-page.html
- 246
+ 237
@@ -3748,7 +3748,7 @@
更新现金余额
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 112
+ 108
@@ -3756,7 +3756,7 @@
单价
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 214
+ 210
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -4112,7 +4112,7 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 369
+ 372
apps/client/src/app/pages/features/features-page.html
@@ -4120,7 +4120,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 202
+ 198
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
@@ -4144,7 +4144,7 @@
存款
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 377
+ 385
@@ -4925,7 +4925,7 @@
您确实要删除该帐户余额吗?
libs/ui/src/lib/account-balances/account-balances.component.ts
- 120
+ 113
@@ -5101,11 +5101,11 @@
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 356
+ 359
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 387
+ 395
libs/ui/src/lib/i18n.ts
@@ -5117,7 +5117,7 @@
储蓄
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 397
+ 405
@@ -5197,7 +5197,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 290
+ 286
libs/ui/src/lib/i18n.ts
@@ -5229,7 +5229,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 309
+ 305
libs/ui/src/lib/i18n.ts
@@ -5477,7 +5477,7 @@
费用
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 262
+ 258
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -5521,7 +5521,7 @@
现金
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
- 216
+ 219
libs/ui/src/lib/i18n.ts
@@ -5929,7 +5929,7 @@
今年迄今为止
libs/ui/src/lib/assistant/assistant.component.ts
- 375
+ 374
@@ -5937,7 +5937,7 @@
本周至今
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -5945,7 +5945,7 @@
本月至今
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5957,7 +5957,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 371
+ 370
@@ -5969,7 +5969,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 367
+ 366
@@ -6017,7 +6017,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 385
+ 384
@@ -6029,7 +6029,7 @@
libs/ui/src/lib/assistant/assistant.component.ts
- 409
+ 408
@@ -6758,7 +6758,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 345
+ 341
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
@@ -6814,7 +6814,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 347
+ 343
libs/ui/src/lib/i18n.ts
@@ -7118,7 +7118,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 45
+ 44
libs/common/src/lib/routes/routes.ts
@@ -7134,7 +7134,7 @@
apps/client/src/app/pages/resources/resources-page.component.ts
- 34
+ 33
libs/common/src/lib/routes/routes.ts
@@ -7340,7 +7340,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 356
+ 352
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html
@@ -7644,7 +7644,7 @@
查找账户、持仓或页面...
libs/ui/src/lib/assistant/assistant.component.ts
- 151
+ 115
@@ -7889,36 +7889,12 @@
150
-
- Fee Ratio (legacy)
- 费率(旧版)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 152
-
-
-
- The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- 费用超过了您初始投资的 ${thresholdMax}% (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 154
-
-
-
- The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%)
- 费用未超过您初始投资的 ${thresholdMax}% (${feeRatio}%)
-
- apps/client/src/app/pages/i18n/i18n-page.html
- 158
-
-
Fee Ratio
费率
apps/client/src/app/pages/i18n/i18n-page.html
- 161
+ 152
@@ -7926,7 +7902,7 @@
费用已超过您总投资金额的 ${thresholdMax}%(${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 163
+ 154
@@ -7934,7 +7910,7 @@
费用未超过您总投资金额的 ${thresholdMax}%(${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
- 167
+ 158
@@ -8104,7 +8080,7 @@
apps/client/src/app/pages/admin/admin-page.component.ts
- 56
+ 53
@@ -8393,7 +8369,7 @@
费用
apps/client/src/app/pages/i18n/i18n-page.html
- 170
+ 161
@@ -8441,7 +8417,7 @@
区域市场集群风险
apps/client/src/app/pages/i18n/i18n-page.html
- 172
+ 163
@@ -8537,7 +8513,7 @@
亚太地区
apps/client/src/app/pages/i18n/i18n-page.html
- 174
+ 165
@@ -8545,7 +8521,7 @@
亚太地区对您的当前投资 (${valueRatio}%) 的贡献超过了 ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 176
+ 167
@@ -8553,7 +8529,7 @@
亚太地区对您的当前投资 (${valueRatio}%) 的贡献低于 ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 180
+ 171
@@ -8561,7 +8537,7 @@
亚太地区对您的当前投资 (${valueRatio}%) 的贡献在 ${thresholdMin}% 和 ${thresholdMax}% 之间
apps/client/src/app/pages/i18n/i18n-page.html
- 184
+ 175
@@ -8569,7 +8545,7 @@
新兴市场
apps/client/src/app/pages/i18n/i18n-page.html
- 189
+ 180
@@ -8577,7 +8553,7 @@
新兴市场对您的当前投资 (${valueRatio}%) 的贡献超过了 ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 192
+ 183
@@ -8585,7 +8561,7 @@
新兴市场对您的当前投资 (${valueRatio}%) 的贡献低于 ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 196
+ 187
@@ -8593,7 +8569,7 @@
新兴市场对您的当前投资 (${valueRatio}%) 的贡献在 ${thresholdMin}% 和 ${thresholdMax}% 之间
apps/client/src/app/pages/i18n/i18n-page.html
- 200
+ 191
@@ -8601,7 +8577,7 @@
欧洲市场
apps/client/src/app/pages/i18n/i18n-page.html
- 204
+ 195
@@ -8609,7 +8585,7 @@
欧洲市场对您的当前投资 (${valueRatio}%) 的贡献超过了 ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 206
+ 197
@@ -8617,7 +8593,7 @@
欧洲市场对您的当前投资 (${valueRatio}%) 的贡献低于 ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 210
+ 201
@@ -8625,7 +8601,7 @@
欧洲市场对您的当前投资 (${valueRatio}%) 的贡献在 ${thresholdMin}% 和 ${thresholdMax}% 之间
apps/client/src/app/pages/i18n/i18n-page.html
- 214
+ 205
@@ -8633,7 +8609,7 @@
日本市场
apps/client/src/app/pages/i18n/i18n-page.html
- 218
+ 209
@@ -8641,7 +8617,7 @@
日本市场对您的当前投资 (${valueRatio}%) 的贡献超过了 ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 220
+ 211
@@ -8649,7 +8625,7 @@
日本市场对您的当前投资 (${valueRatio}%) 的贡献低于 ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 224
+ 215
@@ -8657,7 +8633,7 @@
日本市场对您的当前投资 (${valueRatio}%) 的贡献在 ${thresholdMin}% 和 ${thresholdMax}% 之间
apps/client/src/app/pages/i18n/i18n-page.html
- 228
+ 219
@@ -8665,7 +8641,7 @@
北美市场
apps/client/src/app/pages/i18n/i18n-page.html
- 232
+ 223
@@ -8673,7 +8649,7 @@
北美市场对您的当前投资 (${valueRatio}%) 的贡献超过了 ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
- 234
+ 225
@@ -8681,7 +8657,7 @@
北美市场对您的当前投资 (${valueRatio}%) 的贡献低于 ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
- 238
+ 229
@@ -8689,7 +8665,7 @@
北美市场对您的当前投资 (${valueRatio}%) 的贡献在 ${thresholdMin}% 和 ${thresholdMax}% 之间
apps/client/src/app/pages/i18n/i18n-page.html
- 242
+ 233
From f2c81ada90d040da961702d702a3daf93ec1b9b9 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sat, 28 Feb 2026 10:43:52 +0100
Subject: [PATCH 058/224] Task/refactor $queryRawUnsafe() in data provider
service (#6408)
* Refactor $queryRawUnsafe()
* Update changelog
---
CHANGELOG.md | 1 +
.../data-provider/data-provider.service.ts | 33 +++++++++----------
2 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0b25ff7e6..7b79e434f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- Removed the deprecated static portfolio analysis rule: _Fees_ (Fee Ratio)
+- Refactored queries in the data provider service to use Prisma’s safe query methods
### Fixed
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 8ee8761c0..a6b12cce2 100644
--- a/apps/api/src/services/data-provider/data-provider.service.ts
+++ b/apps/api/src/services/data-provider/data-provider.service.ts
@@ -30,7 +30,7 @@ import {
import type { Granularity, UserWithSettings } from '@ghostfolio/common/types';
import { Inject, Injectable, Logger, OnModuleInit } from '@nestjs/common';
-import { DataSource, MarketData, SymbolProfile } from '@prisma/client';
+import { DataSource, MarketData, Prisma, SymbolProfile } from '@prisma/client';
import { Big } from 'big.js';
import { eachDayOfInterval, format, isValid } from 'date-fns';
import { groupBy, isEmpty, isNumber, uniqWith } from 'lodash';
@@ -347,36 +347,35 @@ export class DataProviderService implements OnModuleInit {
const granularityQuery =
aGranularity === 'month'
- ? `AND (date_part('day', date) = 1 OR date >= TIMESTAMP 'yesterday')`
- : '';
+ ? Prisma.sql`AND (date_part('day', date) = 1 OR date >= TIMESTAMP 'yesterday')`
+ : Prisma.empty;
const rangeQuery =
from && to
- ? `AND date >= '${format(from, DATE_FORMAT)}' AND date <= '${format(
+ ? Prisma.sql`AND date >= ${format(from, DATE_FORMAT)}::timestamp AND date <= ${format(
to,
DATE_FORMAT
- )}'`
- : '';
+ )}::timestamp`
+ : Prisma.empty;
const dataSources = aItems.map(({ dataSource }) => {
return dataSource;
});
+
const symbols = aItems.map(({ symbol }) => {
return symbol;
});
try {
- const queryRaw = `
- SELECT *
- FROM "MarketData"
- WHERE "dataSource" IN ('${dataSources.join(`','`)}')
- AND "symbol" IN ('${symbols.join(
- `','`
- )}') ${granularityQuery} ${rangeQuery}
- ORDER BY date;`;
-
- const marketDataByGranularity: MarketData[] =
- await this.prismaService.$queryRawUnsafe(queryRaw);
+ const marketDataByGranularity: MarketData[] = await this.prismaService
+ .$queryRaw`
+ SELECT *
+ FROM "MarketData"
+ WHERE "dataSource"::text IN (${Prisma.join(dataSources)})
+ AND "symbol" IN (${Prisma.join(symbols)})
+ ${granularityQuery}
+ ${rangeQuery}
+ ORDER BY date;`;
response = marketDataByGranularity.reduce((r, marketData) => {
const { date, marketPrice, symbol } = marketData;
From 9493f79f8e288581e0e9f2b539b69041731c0028 Mon Sep 17 00:00:00 2001
From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com>
Date: Sat, 28 Feb 2026 13:46:37 +0400
Subject: [PATCH 059/224] Task/improve type safety in portfolio filter form
component (#6404)
* fix(lib): resolve typescript errors in portfolio filter form
* fix(lib): type safety in template
* feat(lib): implement takeUntilDestroyed
* feat(lib): replace constructor params with injections
* feat(lib): change accounts to input signal
* feat(lib): change assetClasses to input signal
* feat(lib): change holdings to input signal
* feat(lib): change tags to input signal
* fix(lib): implement signal for disabled
* fix(lib): implement model signal for disabled
* fix(lib): reduce any types
---
.../portfolio-filter-form.component.html | 12 ++--
...portfolio-filter-form.component.stories.ts | 4 +-
.../portfolio-filter-form.component.ts | 69 ++++++++++---------
3 files changed, 43 insertions(+), 42 deletions(-)
diff --git a/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html
index e017d33d6..f5dbac698 100644
--- a/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html
+++ b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html
@@ -4,14 +4,14 @@
Account
- @for (account of accounts; track account.id) {
+ @for (account of accounts(); track account.id) {
@if (account.platform?.url) {
}
{{ account.name }}
@@ -32,7 +32,7 @@
filterForm.get('holding')?.value?.name
}}
- @for (holding of holdings; track holding.name) {
+ @for (holding of holdings(); track holding.name) {
Tag
- @for (tag of tags; track tag.id) {
+ @for (tag of tags(); track tag.id) {
{{ tag.label }}
}
@@ -64,7 +64,7 @@
Asset Class
- @for (assetClass of assetClasses; track assetClass.id) {
+ @for (assetClass of assetClasses(); track assetClass.id) {
{{
assetClass.label
}}
diff --git a/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.stories.ts b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.stories.ts
index 710a4e9c5..665bec3e4 100644
--- a/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.stories.ts
+++ b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.stories.ts
@@ -40,7 +40,7 @@ export const Default: Story = {
{ id: 'COMMODITY', label: 'Commodity', type: 'ASSET_CLASS' },
{ id: 'EQUITY', label: 'Equity', type: 'ASSET_CLASS' },
{ id: 'FIXED_INCOME', label: 'Fixed Income', type: 'ASSET_CLASS' }
- ] as any,
+ ],
holdings: [
{
currency: 'USD',
@@ -66,7 +66,7 @@ export const Default: Story = {
label: 'Retirement Fund',
type: 'TAG'
}
- ] as any,
+ ],
disabled: false
}
};
diff --git a/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.ts b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.ts
index afbe5af4e..c1f82315c 100644
--- a/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.ts
+++ b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.ts
@@ -8,12 +8,15 @@ import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
- Input,
+ DestroyRef,
OnChanges,
- OnDestroy,
OnInit,
- forwardRef
+ forwardRef,
+ inject,
+ input,
+ model
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import {
ControlValueAccessor,
FormBuilder,
@@ -25,7 +28,6 @@ import {
} from '@angular/forms';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatSelectModule } from '@angular/material/select';
-import { Subject, takeUntil } from 'rxjs';
import { GfEntityLogoComponent } from '../entity-logo/entity-logo.component';
import { PortfolioFilterFormValue } from './interfaces';
@@ -53,33 +55,37 @@ import { PortfolioFilterFormValue } from './interfaces';
templateUrl: './portfolio-filter-form.component.html'
})
export class GfPortfolioFilterFormComponent
- implements ControlValueAccessor, OnInit, OnChanges, OnDestroy
+ implements ControlValueAccessor, OnChanges, OnInit
{
- @Input() accounts: AccountWithPlatform[] = [];
- @Input() assetClasses: Filter[] = [];
- @Input() holdings: PortfolioPosition[] = [];
- @Input() tags: Filter[] = [];
- @Input() disabled = false;
-
- public filterForm: FormGroup;
-
- private unsubscribeSubject = new Subject();
-
- public constructor(
- private changeDetectorRef: ChangeDetectorRef,
- private formBuilder: FormBuilder
- ) {
+ public readonly accounts = input([]);
+ public readonly assetClasses = input([]);
+ public readonly disabled = model(false);
+ public readonly holdings = input([]);
+ public readonly tags = input([]);
+
+ public filterForm: FormGroup<{
+ account: FormControl;
+ assetClass: FormControl;
+ holding: FormControl;
+ tag: FormControl;
+ }>;
+
+ private readonly changeDetectorRef = inject(ChangeDetectorRef);
+ private readonly destroyRef = inject(DestroyRef);
+ private readonly formBuilder = inject(FormBuilder);
+
+ public constructor() {
this.filterForm = this.formBuilder.group({
- account: new FormControl(null),
- assetClass: new FormControl(null),
- holding: new FormControl(null),
- tag: new FormControl(null)
+ account: new FormControl(null),
+ assetClass: new FormControl(null),
+ holding: new FormControl(null),
+ tag: new FormControl(null)
});
}
public ngOnInit() {
this.filterForm.valueChanges
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((value) => {
this.onChange(value as PortfolioFilterFormValue);
this.onTouched();
@@ -108,7 +114,7 @@ export class GfPortfolioFilterFormComponent
}
public ngOnChanges() {
- if (this.disabled) {
+ if (this.disabled()) {
this.filterForm.disable({ emitEvent: false });
} else {
this.filterForm.enable({ emitEvent: false });
@@ -116,9 +122,9 @@ export class GfPortfolioFilterFormComponent
const tagControl = this.filterForm.get('tag');
- if (this.tags.length === 0) {
+ if (this.tags().length === 0) {
tagControl?.disable({ emitEvent: false });
- } else if (!this.disabled) {
+ } else if (!this.disabled()) {
tagControl?.enable({ emitEvent: false });
}
@@ -134,9 +140,9 @@ export class GfPortfolioFilterFormComponent
}
public setDisabledState(isDisabled: boolean) {
- this.disabled = isDisabled;
+ this.disabled.set(isDisabled);
- if (this.disabled) {
+ if (this.disabled()) {
this.filterForm.disable({ emitEvent: false });
} else {
this.filterForm.enable({ emitEvent: false });
@@ -161,11 +167,6 @@ export class GfPortfolioFilterFormComponent
}
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
private onChange = (_value: PortfolioFilterFormValue): void => {
// ControlValueAccessor onChange callback
From 98fb0b86af0f1bac6bd54499be38feada9bd3bcd Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sat, 28 Feb 2026 10:47:09 +0100
Subject: [PATCH 060/224] Task/improve usability of asset profile details
dialog for currencies (#6406)
* Improve usability
* Update changelog
---
CHANGELOG.md | 1 +
apps/api/src/app/admin/admin.service.ts | 6 ++++-
.../asset-profile-dialog.component.ts | 24 +++++++++++++++----
.../asset-profile-dialog.html | 11 +++++++--
4 files changed, 35 insertions(+), 7 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7b79e434f..08e1b0f1c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
+- Improved the usability of the asset profile details dialog in the admin control panel for currencies
- Removed the deprecated static portfolio analysis rule: _Fees_ (Fee Ratio)
- Refactored queries in the data provider service to use Prisma’s safe query methods
diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts
index d77fde346..1f8745cd1 100644
--- a/apps/api/src/app/admin/admin.service.ts
+++ b/apps/api/src/app/admin/admin.service.ts
@@ -470,7 +470,9 @@ export class AdminService {
let currency: EnhancedSymbolProfile['currency'] = '-';
let dateOfFirstActivity: EnhancedSymbolProfile['dateOfFirstActivity'];
- if (isCurrency(getCurrencyFromSymbol(symbol))) {
+ const isCurrencyAssetProfile = isCurrency(getCurrencyFromSymbol(symbol));
+
+ if (isCurrencyAssetProfile) {
currency = getCurrencyFromSymbol(symbol);
({ activitiesCount, dateOfFirstActivity } =
await this.orderService.getStatisticsByCurrency(currency));
@@ -508,6 +510,8 @@ export class AdminService {
dataSource,
dateOfFirstActivity,
symbol,
+ assetClass: isCurrencyAssetProfile ? AssetClass.LIQUIDITY : undefined,
+ assetSubClass: isCurrencyAssetProfile ? AssetSubClass.CASH : undefined,
isActive: true
}
};
diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
index cbd8deba3..b1519e35b 100644
--- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
+++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
@@ -5,7 +5,11 @@ import {
PROPERTY_IS_DATA_GATHERING_ENABLED
} from '@ghostfolio/common/config';
import { UpdateAssetProfileDto } from '@ghostfolio/common/dtos';
-import { DATE_FORMAT } from '@ghostfolio/common/helper';
+import {
+ DATE_FORMAT,
+ getCurrencyFromSymbol,
+ isCurrency
+} from '@ghostfolio/common/helper';
import {
AdminMarketDataDetails,
AssetClassSelectorOption,
@@ -138,7 +142,6 @@ export class GfAssetProfileDialogComponent implements OnDestroy, OnInit {
});
public assetSubClassOptions: AssetClassSelectorOption[] = [];
-
public assetProfile: AdminMarketDataDetails['assetProfile'];
public assetProfileForm = this.formBuilder.group({
@@ -180,12 +183,14 @@ export class GfAssetProfileDialogComponent implements OnDestroy, OnInit {
);
public benchmarks: Partial[];
+ public canEditAssetProfile = true;
public countries: {
[code: string]: { name: string; value: number };
};
public currencies: string[] = [];
+
public dateRangeOptions = [
{
label: $localize`Current week` + ' (' + $localize`WTD` + ')',
@@ -260,7 +265,7 @@ export class GfAssetProfileDialogComponent implements OnDestroy, OnInit {
}
public get canSaveAssetProfileIdentifier() {
- return !this.assetProfileForm.dirty;
+ return !this.assetProfileForm.dirty && this.canEditAssetProfile;
}
public ngOnInit() {
@@ -324,6 +329,11 @@ export class GfAssetProfileDialogComponent implements OnDestroy, OnInit {
this.assetClassLabel = translate(this.assetProfile?.assetClass);
this.assetSubClassLabel = translate(this.assetProfile?.assetSubClass);
+
+ this.canEditAssetProfile = !isCurrency(
+ getCurrencyFromSymbol(this.data.symbol)
+ );
+
this.countries = {};
this.isBenchmark = this.benchmarks.some(({ id }) => {
@@ -390,6 +400,10 @@ export class GfAssetProfileDialogComponent implements OnDestroy, OnInit {
url: this.assetProfile?.url ?? ''
});
+ if (!this.canEditAssetProfile) {
+ this.assetProfileForm.disable();
+ }
+
this.assetProfileForm.markAsPristine();
this.changeDetectorRef.markForCheck();
@@ -399,7 +413,9 @@ export class GfAssetProfileDialogComponent implements OnDestroy, OnInit {
public onCancelEditAssetProfileIdentifierMode() {
this.isEditAssetProfileIdentifierMode = false;
- this.assetProfileForm.enable();
+ if (this.canEditAssetProfile) {
+ this.assetProfileForm.enable();
+ }
this.assetProfileIdentifierForm.reset();
}
diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
index a60e10edc..6b3141bfe 100644
--- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
+++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
@@ -300,6 +300,7 @@
diff --git a/libs/ui/src/lib/activities-table/activities-table.component.html b/libs/ui/src/lib/activities-table/activities-table.component.html
index bdb1e6373..b8fe962d7 100644
--- a/libs/ui/src/lib/activities-table/activities-table.component.html
+++ b/libs/ui/src/lib/activities-table/activities-table.component.html
@@ -1,77 +1,101 @@
-@if (hasPermissionToCreateActivity) {
-
-
-
- Import Activities ...
-
- @if (hasPermissionToExportActivities) {
-
-
-
+
+
+ @if (hasPermissionToFilterByType) {
+
+ Type
+
+ @for (
+ activityType of activityTypesTranslationMap | keyvalue;
+ track activityType.key
+ ) {
+
+ {{ activityType.value }}
+
+ }
+
+
}
-
+
+
+ @if (hasPermissionToCreateActivity) {
+
-
-
- Import Dividends ...
-
+
+ Import Activities ...
@if (hasPermissionToExportActivities) {
+
+
+ }
+
+
-
- Export Activities
+
+ Import Dividends ...
- }
- @if (hasPermissionToExportActivities) {
+ @if (hasPermissionToExportActivities) {
+
+
+
+ Export Activities
+
+
+ }
+ @if (hasPermissionToExportActivities) {
+
+
+
+ Export Drafts as ICS
+
+
+ }
+
-
- Export Drafts as ICS
+
+ Delete Activities
- }
-
-
-
-
- Delete Activities
-
-
-
-
-}
+
+
+ }
+
();
@Output() selectedActivities = new EventEmitter();
@Output() sortChanged = new EventEmitter();
+ @Output() typesFilterChanged = new EventEmitter();
@ViewChild(MatPaginator) paginator: MatPaginator;
@ViewChild(MatSort) sort: MatSort;
+ public activityTypesTranslationMap = new Map();
public hasDrafts = false;
public hasErrors = false;
public isUUID = isUUID;
public selectedRows = new SelectionModel(true, []);
+ public typesFilter = new FormControl([]);
public readonly dataSource = input.required<
MatTableDataSource | undefined
@@ -189,6 +201,13 @@ export class GfActivitiesTableComponent
private readonly unsubscribeSubject = new Subject();
public constructor() {
+ for (const type of Object.keys(ActivityType) as ActivityType[]) {
+ this.activityTypesTranslationMap.set(
+ ActivityType[type],
+ translate(ActivityType[type])
+ );
+ }
+
addIcons({
alertCircleOutline,
calendarClearOutline,
@@ -214,6 +233,12 @@ export class GfActivitiesTableComponent
this.selectedActivities.emit(selectedRows.source.selected);
});
}
+
+ this.typesFilter.valueChanges
+ .pipe(takeUntil(this.unsubscribeSubject))
+ .subscribe((types) => {
+ this.typesFilterChanged.emit(types ?? []);
+ });
}
public ngAfterViewInit() {
diff --git a/libs/ui/src/lib/services/data.service.ts b/libs/ui/src/lib/services/data.service.ts
index f3e3fb81f..7f2dac0b1 100644
--- a/libs/ui/src/lib/services/data.service.ts
+++ b/libs/ui/src/lib/services/data.service.ts
@@ -209,6 +209,7 @@ export class DataService {
}
public fetchActivities({
+ activityTypes,
filters,
range,
skip,
@@ -216,6 +217,7 @@ export class DataService {
sortDirection,
take
}: {
+ activityTypes?: string[];
filters?: Filter[];
range?: DateRange;
skip?: number;
@@ -225,6 +227,10 @@ export class DataService {
}): Observable {
let params = this.buildFiltersAsQueryParams({ filters });
+ if (activityTypes?.length) {
+ params = params.append('activityTypes', activityTypes.join(','));
+ }
+
if (range) {
params = params.append('range', range);
}
@@ -411,9 +417,11 @@ export class DataService {
public fetchExport({
activityIds,
+ activityTypes,
filters
}: {
activityIds?: string[];
+ activityTypes?: string[];
filters?: Filter[];
} = {}) {
let params = this.buildFiltersAsQueryParams({ filters });
@@ -422,6 +430,10 @@ export class DataService {
params = params.append('activityIds', activityIds.join(','));
}
+ if (activityTypes?.length) {
+ params = params.append('activityTypes', activityTypes.join(','));
+ }
+
return this.http.get('/api/v1/export', {
params
});
diff --git a/prisma/migrations/20260321200654_added_index_for_type_to_order/migration.sql b/prisma/migrations/20260321200654_added_index_for_type_to_order/migration.sql
new file mode 100644
index 000000000..ba4d1b1ff
--- /dev/null
+++ b/prisma/migrations/20260321200654_added_index_for_type_to_order/migration.sql
@@ -0,0 +1,2 @@
+-- CreateIndex
+CREATE INDEX "Order_type_idx" ON "Order"("type");
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index 232dde9ca..50aac91fb 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -158,6 +158,7 @@ model Order {
@@index([accountId])
@@index([date])
@@index([isDraft])
+ @@index([type])
@@index([userId])
}
From 1b26b6ced04b5eaa50317b087163e9dbeaf34d04 Mon Sep 17 00:00:00 2001
From: Erwin <111194281+Erwin-N@users.noreply.github.com>
Date: Fri, 3 Apr 2026 16:57:19 +0200
Subject: [PATCH 204/224] Task/eliminate OnDestroy lifecycle hook from
activities table page (#6672)
Eliminate OnDestroy lifecycle hook
---
.../activities-table.component.ts | 20 ++++++-------------
1 file changed, 6 insertions(+), 14 deletions(-)
diff --git a/libs/ui/src/lib/activities-table/activities-table.component.ts b/libs/ui/src/lib/activities-table/activities-table.component.ts
index 4d88960b9..ffc07f09c 100644
--- a/libs/ui/src/lib/activities-table/activities-table.component.ts
+++ b/libs/ui/src/lib/activities-table/activities-table.component.ts
@@ -20,9 +20,9 @@ import {
CUSTOM_ELEMENTS_SCHEMA,
ChangeDetectionStrategy,
Component,
+ DestroyRef,
EventEmitter,
Input,
- OnDestroy,
OnInit,
Output,
ViewChild,
@@ -30,6 +30,7 @@ import {
inject,
input
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { FormControl, ReactiveFormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
@@ -68,7 +69,6 @@ import {
trashOutline
} from 'ionicons/icons';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
-import { Subject, takeUntil } from 'rxjs';
import { GfActivityTypeComponent } from '../activity-type/activity-type.component';
import { GfEntityLogoComponent } from '../entity-logo/entity-logo.component';
@@ -102,9 +102,7 @@ import { GfValueComponent } from '../value/value.component';
styleUrls: ['./activities-table.component.scss'],
templateUrl: './activities-table.component.html'
})
-export class GfActivitiesTableComponent
- implements AfterViewInit, OnDestroy, OnInit
-{
+export class GfActivitiesTableComponent implements AfterViewInit, OnInit {
@Input() baseCurrency: string;
@Input() deviceType: string;
@Input() hasActivities: boolean;
@@ -198,9 +196,8 @@ export class GfActivitiesTableComponent
});
private readonly notificationService = inject(NotificationService);
- private readonly unsubscribeSubject = new Subject();
- public constructor() {
+ public constructor(private destroyRef: DestroyRef) {
for (const type of Object.keys(ActivityType) as ActivityType[]) {
this.activityTypesTranslationMap.set(
ActivityType[type],
@@ -228,14 +225,14 @@ export class GfActivitiesTableComponent
if (this.showCheckbox()) {
this.toggleAllRows();
this.selectedRows.changed
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((selectedRows) => {
this.selectedActivities.emit(selectedRows.source.selected);
});
}
this.typesFilter.valueChanges
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((types) => {
this.typesFilterChanged.emit(types ?? []);
});
@@ -367,9 +364,4 @@ export class GfActivitiesTableComponent
this.selectedActivities.emit(this.selectedRows.selected);
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From 875f173c34ecdec91d632389dfbeac0ae17779b3 Mon Sep 17 00:00:00 2001
From: Erwin <111194281+Erwin-N@users.noreply.github.com>
Date: Fri, 3 Apr 2026 17:01:51 +0200
Subject: [PATCH 205/224] Task/eliminate OnDestroy lifecycle hook from
benchmark detail dialog component (#6675)
Eliminate OnDestroy lifecycle hook
---
.../benchmark-detail-dialog.component.ts | 17 +++++------------
1 file changed, 5 insertions(+), 12 deletions(-)
diff --git a/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts b/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts
index 2f4c18288..0c75b5954 100644
--- a/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts
+++ b/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts
@@ -12,18 +12,17 @@ import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
+ DestroyRef,
Inject,
- OnDestroy,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import {
MAT_DIALOG_DATA,
MatDialogModule,
MatDialogRef
} from '@angular/material/dialog';
import { format } from 'date-fns';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
import { GfLineChartComponent } from '../../line-chart/line-chart.component';
import { GfValueComponent } from '../../value/value.component';
@@ -44,16 +43,15 @@ import { BenchmarkDetailDialogParams } from './interfaces/interfaces';
styleUrls: ['./benchmark-detail-dialog.component.scss'],
templateUrl: 'benchmark-detail-dialog.html'
})
-export class GfBenchmarkDetailDialogComponent implements OnDestroy, OnInit {
+export class GfBenchmarkDetailDialogComponent implements OnInit {
public assetProfile: AdminMarketDataDetails['assetProfile'];
public historicalDataItems: LineChartItem[];
public value: number;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
public dialogRef: MatDialogRef,
@Inject(MAT_DIALOG_DATA) public data: BenchmarkDetailDialogParams
) {}
@@ -64,7 +62,7 @@ export class GfBenchmarkDetailDialogComponent implements OnDestroy, OnInit {
dataSource: this.data.dataSource,
symbol: this.data.symbol
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ assetProfile, marketData }) => {
this.assetProfile = assetProfile;
@@ -88,9 +86,4 @@ export class GfBenchmarkDetailDialogComponent implements OnDestroy, OnInit {
public onClose() {
this.dialogRef.close();
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From 2cdfeb84d6768523ea8994a31b922ace16831836 Mon Sep 17 00:00:00 2001
From: Erwin <111194281+Erwin-N@users.noreply.github.com>
Date: Fri, 3 Apr 2026 17:03:26 +0200
Subject: [PATCH 206/224] Task/eliminate OnDestroy lifecycle hook from create
watchlist item dialog component (#6676)
Eliminate OnDestroy lifecycle hook
---
.../create-watchlist-item-dialog.component.ts | 17 ++---------------
1 file changed, 2 insertions(+), 15 deletions(-)
diff --git a/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts
index 60d74be92..4669a827d 100644
--- a/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts
+++ b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts
@@ -1,11 +1,6 @@
import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete';
-import {
- ChangeDetectionStrategy,
- Component,
- OnDestroy,
- OnInit
-} from '@angular/core';
+import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
import {
AbstractControl,
FormBuilder,
@@ -19,7 +14,6 @@ import {
import { MatButtonModule } from '@angular/material/button';
import { MatDialogModule, MatDialogRef } from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field';
-import { Subject } from 'rxjs';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
@@ -36,11 +30,9 @@ import { Subject } from 'rxjs';
styleUrls: ['./create-watchlist-item-dialog.component.scss'],
templateUrl: 'create-watchlist-item-dialog.html'
})
-export class GfCreateWatchlistItemDialogComponent implements OnDestroy, OnInit {
+export class GfCreateWatchlistItemDialogComponent implements OnInit {
public createWatchlistItemForm: FormGroup;
- private unsubscribeSubject = new Subject();
-
public constructor(
public readonly dialogRef: MatDialogRef,
public readonly formBuilder: FormBuilder
@@ -69,11 +61,6 @@ export class GfCreateWatchlistItemDialogComponent implements OnDestroy, OnInit {
});
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private validator(control: AbstractControl): ValidationErrors {
const searchSymbolControl = control.get('searchSymbol');
From 77b94b28ac2918ae71cc00272ee1acab54331f0b Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Fri, 3 Apr 2026 18:12:49 +0200
Subject: [PATCH 207/224] Task/eliminate OnDestroy lifecycle hook in SaaS FAQ
page component (#6663)
Eliminate OnDestroy lifecycle hook
---
.../app/pages/faq/saas/saas-page.component.ts | 16 +++++-----------
1 file changed, 5 insertions(+), 11 deletions(-)
diff --git a/apps/client/src/app/pages/faq/saas/saas-page.component.ts b/apps/client/src/app/pages/faq/saas/saas-page.component.ts
index 4429fe492..0c221f047 100644
--- a/apps/client/src/app/pages/faq/saas/saas-page.component.ts
+++ b/apps/client/src/app/pages/faq/saas/saas-page.component.ts
@@ -7,11 +7,11 @@ import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
- OnDestroy
+ DestroyRef
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatCardModule } from '@angular/material/card';
import { RouterModule } from '@angular/router';
-import { Subject, takeUntil } from 'rxjs';
@Component({
host: { class: 'page' },
@@ -21,7 +21,7 @@ import { Subject, takeUntil } from 'rxjs';
styleUrls: ['./saas-page.scss'],
templateUrl: './saas-page.html'
})
-export class GfSaasPageComponent implements OnDestroy {
+export class GfSaasPageComponent {
public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${publicRoutes.pricing.path}`;
public routerLinkAccount = internalRoutes.account.routerLink;
public routerLinkAccountMembership =
@@ -30,16 +30,15 @@ export class GfSaasPageComponent implements OnDestroy {
public routerLinkRegister = publicRoutes.register.routerLink;
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
+ private destroyRef: DestroyRef,
private userService: UserService
) {}
public ngOnInit() {
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -48,9 +47,4 @@ export class GfSaasPageComponent implements OnDestroy {
}
});
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From 8f9c31a5640130bb7c3cd4645a7bcd9906833475 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Fri, 3 Apr 2026 18:13:30 +0200
Subject: [PATCH 208/224] Task/eliminate OnDestroy lifecycle hook in user
detail dialog component (#6664)
Eliminate OnDestroy lifecycle hook
---
.../user-detail-dialog.component.ts | 19 +++++++------------
1 file changed, 7 insertions(+), 12 deletions(-)
diff --git a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts
index 6f7f4ead6..fec2d4b06 100644
--- a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts
+++ b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts
@@ -7,10 +7,11 @@ import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
+ DestroyRef,
Inject,
- OnDestroy,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { MatDialogModule } from '@angular/material/dialog';
@@ -18,8 +19,8 @@ import { MatMenuModule } from '@angular/material/menu';
import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { ellipsisVertical } from 'ionicons/icons';
-import { EMPTY, Subject } from 'rxjs';
-import { catchError, takeUntil } from 'rxjs/operators';
+import { EMPTY } from 'rxjs';
+import { catchError } from 'rxjs/operators';
import { UserDetailDialogParams } from './interfaces/interfaces';
@@ -38,15 +39,14 @@ import { UserDetailDialogParams } from './interfaces/interfaces';
styleUrls: ['./user-detail-dialog.component.scss'],
templateUrl: './user-detail-dialog.html'
})
-export class GfUserDetailDialogComponent implements OnDestroy, OnInit {
+export class GfUserDetailDialogComponent implements OnInit {
public user: AdminUserResponse;
- private unsubscribeSubject = new Subject();
-
public constructor(
private adminService: AdminService,
private changeDetectorRef: ChangeDetectorRef,
@Inject(MAT_DIALOG_DATA) public data: UserDetailDialogParams,
+ private destroyRef: DestroyRef,
public dialogRef: MatDialogRef
) {
addIcons({
@@ -58,7 +58,7 @@ export class GfUserDetailDialogComponent implements OnDestroy, OnInit {
this.adminService
.fetchUserById(this.data.userId)
.pipe(
- takeUntil(this.unsubscribeSubject),
+ takeUntilDestroyed(this.destroyRef),
catchError(() => {
this.dialogRef.close();
@@ -82,9 +82,4 @@ export class GfUserDetailDialogComponent implements OnDestroy, OnInit {
public onClose() {
this.dialogRef.close();
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
From d9e934aa6b206acd14c76c218d662e5e1a65456a Mon Sep 17 00:00:00 2001
From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com>
Date: Sat, 4 Apr 2026 12:57:58 +0700
Subject: [PATCH 209/224] Task/improve type safety for routes by implementing
satisfies operator (#6681)
* Improve type safety
---
.../admin-users/admin-users.component.ts | 2 +-
.../app/components/footer/footer.component.ts | 8 ++++----
.../home-overview/home-overview.component.ts | 2 +-
.../src/app/pages/about/about-page.routes.ts | 10 +++++-----
.../about/changelog/changelog-page.routes.ts | 2 +-
.../about/license/license-page.routes.ts | 2 +-
.../oss-friends/oss-friends-page.routes.ts | 2 +-
.../privacy-policy-page.routes.ts | 2 +-
.../terms-of-service-page.routes.ts | 2 +-
.../src/app/pages/admin/admin-page.routes.ts | 20 +++++++++----------
...tfolio-joins-oss-friends-page.component.ts | 2 +-
.../src/app/pages/faq/faq-page.routes.ts | 4 ++--
.../app/pages/faq/saas/saas-page.component.ts | 2 +-
.../app/pages/faq/saas/saas-page.routes.ts | 2 +-
.../self-hosting/self-hosting-page.routes.ts | 2 +-
.../src/app/pages/home/home-page.routes.ts | 20 +++++++++----------
.../activities/activities-page.routes.ts | 2 +-
.../analysis/analysis-page.routes.ts | 2 +-
.../pages/portfolio/portfolio-page.routes.ts | 8 ++++----
.../glossary/resources-glossary.component.ts | 2 +-
.../glossary/resources-glossary.routes.ts | 2 +-
.../guides/resources-guides.routes.ts | 2 +-
.../markets/resources-markets.routes.ts | 2 +-
.../overview/resources-overview.component.ts | 12 +++++------
.../personal-finance-tools-page.routes.ts | 6 +++---
.../pages/resources/resources-page.routes.ts | 8 ++++----
.../user-account/user-account-page.routes.ts | 8 ++++----
.../src/app/pages/zen/zen-page.routes.ts | 4 ++--
libs/common/src/lib/routes/routes.ts | 8 ++++----
.../assistant-list-item.component.ts | 2 +-
.../src/lib/assistant/assistant.component.ts | 6 +++---
.../no-transactions-info.component.ts | 2 +-
32 files changed, 80 insertions(+), 80 deletions(-)
diff --git a/apps/client/src/app/components/admin-users/admin-users.component.ts b/apps/client/src/app/components/admin-users/admin-users.component.ts
index 3b57ba1c8..874bbc1db 100644
--- a/apps/client/src/app/components/admin-users/admin-users.component.ts
+++ b/apps/client/src/app/components/admin-users/admin-users.component.ts
@@ -89,7 +89,7 @@ export class GfAdminUsersComponent implements OnInit {
public isLoading = false;
public pageSize = DEFAULT_PAGE_SIZE;
public routerLinkAdminControlUsers =
- internalRoutes.adminControl.subRoutes?.users.routerLink;
+ internalRoutes.adminControl.subRoutes.users.routerLink;
public totalItems = 0;
public user: User;
diff --git a/apps/client/src/app/components/footer/footer.component.ts b/apps/client/src/app/components/footer/footer.component.ts
index d06e711b9..48f010565 100644
--- a/apps/client/src/app/components/footer/footer.component.ts
+++ b/apps/client/src/app/components/footer/footer.component.ts
@@ -33,13 +33,13 @@ export class GfFooterComponent implements OnChanges {
public hasPermissionToAccessFearAndGreedIndex: boolean;
public routerLinkAbout = publicRoutes.about.routerLink;
public routerLinkAboutChangelog =
- publicRoutes.about.subRoutes?.changelog.routerLink;
+ publicRoutes.about.subRoutes.changelog.routerLink;
public routerLinkAboutLicense =
- publicRoutes.about.subRoutes?.license.routerLink;
+ publicRoutes.about.subRoutes.license.routerLink;
public routerLinkAboutPrivacyPolicy =
- publicRoutes.about.subRoutes?.privacyPolicy.routerLink;
+ publicRoutes.about.subRoutes.privacyPolicy.routerLink;
public routerLinkAboutTermsOfService =
- publicRoutes.about.subRoutes?.termsOfService.routerLink;
+ publicRoutes.about.subRoutes.termsOfService.routerLink;
public routerLinkBlog = publicRoutes.blog.routerLink;
public routerLinkFaq = publicRoutes.faq.routerLink;
public routerLinkFeatures = publicRoutes.features.routerLink;
diff --git a/apps/client/src/app/components/home-overview/home-overview.component.ts b/apps/client/src/app/components/home-overview/home-overview.component.ts
index 9b4f646c3..58284d27d 100644
--- a/apps/client/src/app/components/home-overview/home-overview.component.ts
+++ b/apps/client/src/app/components/home-overview/home-overview.component.ts
@@ -56,7 +56,7 @@ export class GfHomeOverviewComponent implements OnInit {
public routerLinkAccounts = internalRoutes.accounts.routerLink;
public routerLinkPortfolio = internalRoutes.portfolio.routerLink;
public routerLinkPortfolioActivities =
- internalRoutes.portfolio.subRoutes?.activities.routerLink;
+ internalRoutes.portfolio.subRoutes.activities.routerLink;
public showDetails = false;
public unit: string;
public user: User;
diff --git a/apps/client/src/app/pages/about/about-page.routes.ts b/apps/client/src/app/pages/about/about-page.routes.ts
index b4466fbab..4cb13280a 100644
--- a/apps/client/src/app/pages/about/about-page.routes.ts
+++ b/apps/client/src/app/pages/about/about-page.routes.ts
@@ -15,29 +15,29 @@ export const routes: Routes = [
import('./overview/about-overview-page.routes').then((m) => m.routes)
},
{
- path: publicRoutes.about.subRoutes?.changelog.path,
+ path: publicRoutes.about.subRoutes.changelog.path,
loadChildren: () =>
import('./changelog/changelog-page.routes').then((m) => m.routes)
},
{
- path: publicRoutes.about.subRoutes?.license.path,
+ path: publicRoutes.about.subRoutes.license.path,
loadChildren: () =>
import('./license/license-page.routes').then((m) => m.routes)
},
{
- path: publicRoutes.about.subRoutes?.ossFriends.path,
+ path: publicRoutes.about.subRoutes.ossFriends.path,
loadChildren: () =>
import('./oss-friends/oss-friends-page.routes').then((m) => m.routes)
},
{
- path: publicRoutes.about.subRoutes?.privacyPolicy.path,
+ path: publicRoutes.about.subRoutes.privacyPolicy.path,
loadChildren: () =>
import('./privacy-policy/privacy-policy-page.routes').then(
(m) => m.routes
)
},
{
- path: publicRoutes.about.subRoutes?.termsOfService.path,
+ path: publicRoutes.about.subRoutes.termsOfService.path,
loadChildren: () =>
import('./terms-of-service/terms-of-service-page.routes').then(
(m) => m.routes
diff --git a/apps/client/src/app/pages/about/changelog/changelog-page.routes.ts b/apps/client/src/app/pages/about/changelog/changelog-page.routes.ts
index 7b67283e9..523218acc 100644
--- a/apps/client/src/app/pages/about/changelog/changelog-page.routes.ts
+++ b/apps/client/src/app/pages/about/changelog/changelog-page.routes.ts
@@ -10,6 +10,6 @@ export const routes: Routes = [
canActivate: [AuthGuard],
component: GfChangelogPageComponent,
path: '',
- title: publicRoutes.about.subRoutes?.changelog.title
+ title: publicRoutes.about.subRoutes.changelog.title
}
];
diff --git a/apps/client/src/app/pages/about/license/license-page.routes.ts b/apps/client/src/app/pages/about/license/license-page.routes.ts
index 45de6aaa2..1684bb0c5 100644
--- a/apps/client/src/app/pages/about/license/license-page.routes.ts
+++ b/apps/client/src/app/pages/about/license/license-page.routes.ts
@@ -10,6 +10,6 @@ export const routes: Routes = [
canActivate: [AuthGuard],
component: GfLicensePageComponent,
path: '',
- title: publicRoutes.about.subRoutes?.license.title
+ title: publicRoutes.about.subRoutes.license.title
}
];
diff --git a/apps/client/src/app/pages/about/oss-friends/oss-friends-page.routes.ts b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.routes.ts
index dfe65d962..8dbb9d52a 100644
--- a/apps/client/src/app/pages/about/oss-friends/oss-friends-page.routes.ts
+++ b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.routes.ts
@@ -10,6 +10,6 @@ export const routes: Routes = [
canActivate: [AuthGuard],
component: GfOpenSourceSoftwareFriendsPageComponent,
path: '',
- title: publicRoutes.about.subRoutes?.ossFriends.title
+ title: publicRoutes.about.subRoutes.ossFriends.title
}
];
diff --git a/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.routes.ts b/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.routes.ts
index 934e06289..e87436c17 100644
--- a/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.routes.ts
+++ b/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.routes.ts
@@ -10,6 +10,6 @@ export const routes: Routes = [
canActivate: [AuthGuard],
component: GfPrivacyPolicyPageComponent,
path: '',
- title: publicRoutes.about.subRoutes?.privacyPolicy.title
+ title: publicRoutes.about.subRoutes.privacyPolicy.title
}
];
diff --git a/apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.routes.ts b/apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.routes.ts
index caf8751f1..34d7a72d0 100644
--- a/apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.routes.ts
+++ b/apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.routes.ts
@@ -10,6 +10,6 @@ export const routes: Routes = [
canActivate: [AuthGuard],
component: GfTermsOfServicePageComponent,
path: '',
- title: publicRoutes.about.subRoutes?.termsOfService.title
+ title: publicRoutes.about.subRoutes.termsOfService.title
}
];
diff --git a/apps/client/src/app/pages/admin/admin-page.routes.ts b/apps/client/src/app/pages/admin/admin-page.routes.ts
index 08fce248c..c5309edbb 100644
--- a/apps/client/src/app/pages/admin/admin-page.routes.ts
+++ b/apps/client/src/app/pages/admin/admin-page.routes.ts
@@ -20,29 +20,29 @@ export const routes: Routes = [
title: internalRoutes.adminControl.title
},
{
- path: internalRoutes.adminControl.subRoutes?.jobs.path,
+ path: internalRoutes.adminControl.subRoutes.jobs.path,
component: GfAdminJobsComponent,
- title: internalRoutes.adminControl.subRoutes?.jobs.title
+ title: internalRoutes.adminControl.subRoutes.jobs.title
},
{
- path: internalRoutes.adminControl.subRoutes?.marketData.path,
+ path: internalRoutes.adminControl.subRoutes.marketData.path,
component: GfAdminMarketDataComponent,
- title: internalRoutes.adminControl.subRoutes?.marketData.title
+ title: internalRoutes.adminControl.subRoutes.marketData.title
},
{
- path: internalRoutes.adminControl.subRoutes?.settings.path,
+ path: internalRoutes.adminControl.subRoutes.settings.path,
component: GfAdminSettingsComponent,
- title: internalRoutes.adminControl.subRoutes?.settings.title
+ title: internalRoutes.adminControl.subRoutes.settings.title
},
{
- path: internalRoutes.adminControl.subRoutes?.users.path,
+ path: internalRoutes.adminControl.subRoutes.users.path,
component: GfAdminUsersComponent,
- title: internalRoutes.adminControl.subRoutes?.users.title
+ title: internalRoutes.adminControl.subRoutes.users.title
},
{
- path: `${internalRoutes.adminControl.subRoutes?.users.path}/:userId`,
+ path: `${internalRoutes.adminControl.subRoutes.users.path}/:userId`,
component: GfAdminUsersComponent,
- title: internalRoutes.adminControl.subRoutes?.users.title
+ title: internalRoutes.adminControl.subRoutes.users.title
}
],
component: AdminPageComponent,
diff --git a/apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts b/apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts
index 4b62e4449..c5a9cf178 100644
--- a/apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts
+++ b/apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts
@@ -12,6 +12,6 @@ import { RouterModule } from '@angular/router';
})
export class GhostfolioJoinsOssFriendsPageComponent {
public routerLinkAboutOssFriends =
- publicRoutes.about.subRoutes?.ossFriends.routerLink;
+ publicRoutes.about.subRoutes.ossFriends.routerLink;
public routerLinkBlog = publicRoutes.blog.routerLink;
}
diff --git a/apps/client/src/app/pages/faq/faq-page.routes.ts b/apps/client/src/app/pages/faq/faq-page.routes.ts
index f80304a08..2999e3c80 100644
--- a/apps/client/src/app/pages/faq/faq-page.routes.ts
+++ b/apps/client/src/app/pages/faq/faq-page.routes.ts
@@ -15,12 +15,12 @@ export const routes: Routes = [
import('./overview/faq-overview-page.routes').then((m) => m.routes)
},
{
- path: publicRoutes.faq.subRoutes?.saas.path,
+ path: publicRoutes.faq.subRoutes.saas.path,
loadChildren: () =>
import('./saas/saas-page.routes').then((m) => m.routes)
},
{
- path: publicRoutes.faq.subRoutes?.selfHosting.path,
+ path: publicRoutes.faq.subRoutes.selfHosting.path,
loadChildren: () =>
import('./self-hosting/self-hosting-page.routes').then(
(m) => m.routes
diff --git a/apps/client/src/app/pages/faq/saas/saas-page.component.ts b/apps/client/src/app/pages/faq/saas/saas-page.component.ts
index 0c221f047..3f44653d2 100644
--- a/apps/client/src/app/pages/faq/saas/saas-page.component.ts
+++ b/apps/client/src/app/pages/faq/saas/saas-page.component.ts
@@ -25,7 +25,7 @@ export class GfSaasPageComponent {
public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${publicRoutes.pricing.path}`;
public routerLinkAccount = internalRoutes.account.routerLink;
public routerLinkAccountMembership =
- internalRoutes.account.subRoutes?.membership.routerLink;
+ internalRoutes.account.subRoutes.membership.routerLink;
public routerLinkMarkets = publicRoutes.markets.routerLink;
public routerLinkRegister = publicRoutes.register.routerLink;
public user: User;
diff --git a/apps/client/src/app/pages/faq/saas/saas-page.routes.ts b/apps/client/src/app/pages/faq/saas/saas-page.routes.ts
index d68893640..dcb574c38 100644
--- a/apps/client/src/app/pages/faq/saas/saas-page.routes.ts
+++ b/apps/client/src/app/pages/faq/saas/saas-page.routes.ts
@@ -10,6 +10,6 @@ export const routes: Routes = [
canActivate: [AuthGuard],
component: GfSaasPageComponent,
path: '',
- title: `${publicRoutes.faq.subRoutes?.saas.title} - ${publicRoutes.faq.title}`
+ title: `${publicRoutes.faq.subRoutes.saas.title} - ${publicRoutes.faq.title}`
}
];
diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.routes.ts b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.routes.ts
index ccf034421..d08cdb312 100644
--- a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.routes.ts
+++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.routes.ts
@@ -10,6 +10,6 @@ export const routes: Routes = [
canActivate: [AuthGuard],
component: GfSelfHostingPageComponent,
path: '',
- title: `${publicRoutes.faq.subRoutes?.selfHosting.title} - ${publicRoutes.faq.title}`
+ title: `${publicRoutes.faq.subRoutes.selfHosting.title} - ${publicRoutes.faq.title}`
}
];
diff --git a/apps/client/src/app/pages/home/home-page.routes.ts b/apps/client/src/app/pages/home/home-page.routes.ts
index 436826674..82ef1e521 100644
--- a/apps/client/src/app/pages/home/home-page.routes.ts
+++ b/apps/client/src/app/pages/home/home-page.routes.ts
@@ -20,29 +20,29 @@ export const routes: Routes = [
component: GfHomeOverviewComponent
},
{
- path: internalRoutes.home.subRoutes?.holdings.path,
+ path: internalRoutes.home.subRoutes.holdings.path,
component: GfHomeHoldingsComponent,
- title: internalRoutes.home.subRoutes?.holdings.title
+ title: internalRoutes.home.subRoutes.holdings.title
},
{
- path: internalRoutes.home.subRoutes?.summary.path,
+ path: internalRoutes.home.subRoutes.summary.path,
component: GfHomeSummaryComponent,
- title: internalRoutes.home.subRoutes?.summary.title
+ title: internalRoutes.home.subRoutes.summary.title
},
{
- path: internalRoutes.home.subRoutes?.markets.path,
+ path: internalRoutes.home.subRoutes.markets.path,
component: GfHomeMarketComponent,
- title: internalRoutes.home.subRoutes?.markets.title
+ title: internalRoutes.home.subRoutes.markets.title
},
{
- path: internalRoutes.home.subRoutes?.marketsPremium.path,
+ path: internalRoutes.home.subRoutes.marketsPremium.path,
component: GfMarketsComponent,
- title: internalRoutes.home.subRoutes?.marketsPremium.title
+ title: internalRoutes.home.subRoutes.marketsPremium.title
},
{
- path: internalRoutes.home.subRoutes?.watchlist.path,
+ path: internalRoutes.home.subRoutes.watchlist.path,
component: GfHomeWatchlistComponent,
- title: internalRoutes.home.subRoutes?.watchlist.title
+ title: internalRoutes.home.subRoutes.watchlist.title
}
],
component: GfHomePageComponent,
diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page.routes.ts b/apps/client/src/app/pages/portfolio/activities/activities-page.routes.ts
index e1c75f6cc..c96c8a558 100644
--- a/apps/client/src/app/pages/portfolio/activities/activities-page.routes.ts
+++ b/apps/client/src/app/pages/portfolio/activities/activities-page.routes.ts
@@ -10,6 +10,6 @@ export const routes: Routes = [
canActivate: [AuthGuard],
component: GfActivitiesPageComponent,
path: '',
- title: internalRoutes.portfolio.subRoutes?.activities.title
+ title: internalRoutes.portfolio.subRoutes.activities.title
}
];
diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.routes.ts b/apps/client/src/app/pages/portfolio/analysis/analysis-page.routes.ts
index 343d6ced5..91cf4c91b 100644
--- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.routes.ts
+++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.routes.ts
@@ -10,6 +10,6 @@ export const routes: Routes = [
canActivate: [AuthGuard],
component: GfAnalysisPageComponent,
path: '',
- title: internalRoutes.portfolio.subRoutes?.analysis.title
+ title: internalRoutes.portfolio.subRoutes.analysis.title
}
];
diff --git a/apps/client/src/app/pages/portfolio/portfolio-page.routes.ts b/apps/client/src/app/pages/portfolio/portfolio-page.routes.ts
index a4fdc3f61..aeebf4a6b 100644
--- a/apps/client/src/app/pages/portfolio/portfolio-page.routes.ts
+++ b/apps/client/src/app/pages/portfolio/portfolio-page.routes.ts
@@ -15,22 +15,22 @@ export const routes: Routes = [
import('./analysis/analysis-page.routes').then((m) => m.routes)
},
{
- path: internalRoutes.portfolio.subRoutes?.activities.path,
+ path: internalRoutes.portfolio.subRoutes.activities.path,
loadChildren: () =>
import('./activities/activities-page.routes').then((m) => m.routes)
},
{
- path: internalRoutes.portfolio.subRoutes?.allocations.path,
+ path: internalRoutes.portfolio.subRoutes.allocations.path,
loadChildren: () =>
import('./allocations/allocations-page.routes').then((m) => m.routes)
},
{
- path: internalRoutes.portfolio.subRoutes?.fire.path,
+ path: internalRoutes.portfolio.subRoutes.fire.path,
loadChildren: () =>
import('./fire/fire-page.routes').then((m) => m.routes)
},
{
- path: internalRoutes.portfolio.subRoutes?.xRay.path,
+ path: internalRoutes.portfolio.subRoutes.xRay.path,
loadChildren: () =>
import('./x-ray/x-ray-page.routes').then((m) => m.routes)
}
diff --git a/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts b/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts
index 9c86f2c83..112619239 100644
--- a/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts
+++ b/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts
@@ -16,7 +16,7 @@ export class ResourcesGlossaryPageComponent implements OnInit {
public hasPermissionForSubscription: boolean;
public info: InfoItem;
public routerLinkResourcesPersonalFinanceTools =
- publicRoutes.resources.subRoutes?.personalFinanceTools.routerLink;
+ publicRoutes.resources.subRoutes.personalFinanceTools.routerLink;
public constructor(private dataService: DataService) {
this.info = this.dataService.fetchInfo();
diff --git a/apps/client/src/app/pages/resources/glossary/resources-glossary.routes.ts b/apps/client/src/app/pages/resources/glossary/resources-glossary.routes.ts
index 4096dfecd..2f864155a 100644
--- a/apps/client/src/app/pages/resources/glossary/resources-glossary.routes.ts
+++ b/apps/client/src/app/pages/resources/glossary/resources-glossary.routes.ts
@@ -8,6 +8,6 @@ export const routes: Routes = [
{
component: ResourcesGlossaryPageComponent,
path: '',
- title: publicRoutes.resources.subRoutes?.glossary.title
+ title: publicRoutes.resources.subRoutes.glossary.title
}
];
diff --git a/apps/client/src/app/pages/resources/guides/resources-guides.routes.ts b/apps/client/src/app/pages/resources/guides/resources-guides.routes.ts
index eb8c39e24..f9f65f44a 100644
--- a/apps/client/src/app/pages/resources/guides/resources-guides.routes.ts
+++ b/apps/client/src/app/pages/resources/guides/resources-guides.routes.ts
@@ -8,6 +8,6 @@ export const routes: Routes = [
{
component: ResourcesGuidesComponent,
path: '',
- title: publicRoutes.resources.subRoutes?.guides.title
+ title: publicRoutes.resources.subRoutes.guides.title
}
];
diff --git a/apps/client/src/app/pages/resources/markets/resources-markets.routes.ts b/apps/client/src/app/pages/resources/markets/resources-markets.routes.ts
index a56dc7cf7..4bcb66789 100644
--- a/apps/client/src/app/pages/resources/markets/resources-markets.routes.ts
+++ b/apps/client/src/app/pages/resources/markets/resources-markets.routes.ts
@@ -8,6 +8,6 @@ export const routes: Routes = [
{
component: ResourcesMarketsComponent,
path: '',
- title: publicRoutes.resources.subRoutes?.markets.title
+ title: publicRoutes.resources.subRoutes.markets.title
}
];
diff --git a/apps/client/src/app/pages/resources/overview/resources-overview.component.ts b/apps/client/src/app/pages/resources/overview/resources-overview.component.ts
index 310f16a5e..81338200f 100644
--- a/apps/client/src/app/pages/resources/overview/resources-overview.component.ts
+++ b/apps/client/src/app/pages/resources/overview/resources-overview.component.ts
@@ -20,20 +20,20 @@ export class ResourcesOverviewComponent {
{
description:
'Explore our guides to help you get started with investing and managing your finances.',
- routerLink: publicRoutes.resources.subRoutes?.guides.routerLink,
- title: publicRoutes.resources.subRoutes?.guides.title
+ routerLink: publicRoutes.resources.subRoutes.guides.routerLink,
+ title: publicRoutes.resources.subRoutes.guides.title
},
{
description:
'Access various market resources and tools to stay informed about financial markets.',
- routerLink: publicRoutes.resources.subRoutes?.markets.routerLink,
- title: publicRoutes.resources.subRoutes?.markets.title
+ routerLink: publicRoutes.resources.subRoutes.markets.routerLink,
+ title: publicRoutes.resources.subRoutes.markets.title
},
{
description:
'Learn key financial terms and concepts in our comprehensive glossary.',
- routerLink: publicRoutes.resources.subRoutes?.glossary.routerLink,
- title: publicRoutes.resources.subRoutes?.glossary.title
+ routerLink: publicRoutes.resources.subRoutes.glossary.routerLink,
+ title: publicRoutes.resources.subRoutes.glossary.title
}
];
}
diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.routes.ts b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.routes.ts
index 081c34000..9081f6b28 100644
--- a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.routes.ts
+++ b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.routes.ts
@@ -11,7 +11,7 @@ export const routes: Routes = [
canActivate: [AuthGuard],
component: PersonalFinanceToolsPageComponent,
path: '',
- title: publicRoutes.resources.subRoutes?.personalFinanceTools.title
+ title: publicRoutes.resources.subRoutes.personalFinanceTools.title
},
...personalFinanceTools.map(({ alias, key, name }) => {
return {
@@ -23,8 +23,8 @@ export const routes: Routes = [
return GfProductPageComponent;
}
),
- path: `${publicRoutes.resources.subRoutes?.personalFinanceTools.subRoutes?.product.path}-${alias ?? key}`,
- title: `${publicRoutes.resources.subRoutes?.personalFinanceTools.subRoutes?.product.title} ${name}`
+ path: `${publicRoutes.resources.subRoutes.personalFinanceTools.subRoutes.product.path}-${alias ?? key}`,
+ title: `${publicRoutes.resources.subRoutes.personalFinanceTools.subRoutes.product.title} ${name}`
};
})
];
diff --git a/apps/client/src/app/pages/resources/resources-page.routes.ts b/apps/client/src/app/pages/resources/resources-page.routes.ts
index 6e59f0995..107988238 100644
--- a/apps/client/src/app/pages/resources/resources-page.routes.ts
+++ b/apps/client/src/app/pages/resources/resources-page.routes.ts
@@ -16,22 +16,22 @@ export const routes: Routes = [
import('./overview/resources-overview.routes').then((m) => m.routes)
},
{
- path: publicRoutes.resources.subRoutes?.glossary.path,
+ path: publicRoutes.resources.subRoutes.glossary.path,
loadChildren: () =>
import('./glossary/resources-glossary.routes').then((m) => m.routes)
},
{
- path: publicRoutes.resources.subRoutes?.guides.path,
+ path: publicRoutes.resources.subRoutes.guides.path,
loadChildren: () =>
import('./guides/resources-guides.routes').then((m) => m.routes)
},
{
- path: publicRoutes.resources.subRoutes?.markets.path,
+ path: publicRoutes.resources.subRoutes.markets.path,
loadChildren: () =>
import('./markets/resources-markets.routes').then((m) => m.routes)
},
{
- path: publicRoutes.resources.subRoutes?.personalFinanceTools.path,
+ path: publicRoutes.resources.subRoutes.personalFinanceTools.path,
loadChildren: () =>
import('./personal-finance-tools/personal-finance-tools-page.routes').then(
(m) => m.routes
diff --git a/apps/client/src/app/pages/user-account/user-account-page.routes.ts b/apps/client/src/app/pages/user-account/user-account-page.routes.ts
index 7eac1298e..5d0f5b202 100644
--- a/apps/client/src/app/pages/user-account/user-account-page.routes.ts
+++ b/apps/client/src/app/pages/user-account/user-account-page.routes.ts
@@ -18,14 +18,14 @@ export const routes: Routes = [
title: internalRoutes.account.title
},
{
- path: internalRoutes.account.subRoutes?.membership.path,
+ path: internalRoutes.account.subRoutes.membership.path,
component: GfUserAccountMembershipComponent,
- title: internalRoutes.account.subRoutes?.membership.title
+ title: internalRoutes.account.subRoutes.membership.title
},
{
- path: internalRoutes.account.subRoutes?.access.path,
+ path: internalRoutes.account.subRoutes.access.path,
component: GfUserAccountAccessComponent,
- title: internalRoutes.account.subRoutes?.access.title
+ title: internalRoutes.account.subRoutes.access.title
}
],
component: GfUserAccountPageComponent,
diff --git a/apps/client/src/app/pages/zen/zen-page.routes.ts b/apps/client/src/app/pages/zen/zen-page.routes.ts
index 38929dc85..60e163ca4 100644
--- a/apps/client/src/app/pages/zen/zen-page.routes.ts
+++ b/apps/client/src/app/pages/zen/zen-page.routes.ts
@@ -16,9 +16,9 @@ export const routes: Routes = [
component: GfHomeOverviewComponent
},
{
- path: internalRoutes.zen.subRoutes?.holdings.path,
+ path: internalRoutes.zen.subRoutes.holdings.path,
component: GfHomeHoldingsComponent,
- title: internalRoutes.home.subRoutes?.holdings.title
+ title: internalRoutes.home.subRoutes.holdings.title
}
],
component: GfZenPageComponent,
diff --git a/libs/common/src/lib/routes/routes.ts b/libs/common/src/lib/routes/routes.ts
index 53ecd104e..2785efdde 100644
--- a/libs/common/src/lib/routes/routes.ts
+++ b/libs/common/src/lib/routes/routes.ts
@@ -15,7 +15,7 @@ if (typeof window !== 'undefined') {
};
}
-export const internalRoutes: Record = {
+export const internalRoutes = {
account: {
path: 'account',
routerLink: ['/account'],
@@ -169,9 +169,9 @@ export const internalRoutes: Record = {
},
title: $localize`Overview`
}
-};
+} satisfies Record;
-export const publicRoutes: Record = {
+export const publicRoutes = {
about: {
path: $localize`:kebab-case@@routes.about:about`,
routerLink: ['/' + $localize`:kebab-case@@routes.about:about`],
@@ -336,4 +336,4 @@ export const publicRoutes: Record = {
path: $localize`:kebab-case@@routes.start:start`,
routerLink: ['/' + $localize`:kebab-case@@routes.start:start`]
}
-};
+} satisfies Record;
diff --git a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts
index 05750cea4..36127a566 100644
--- a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts
+++ b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts
@@ -67,7 +67,7 @@ export class GfAssistantListItemComponent
};
this.routerLink =
- internalRoutes.adminControl.subRoutes?.marketData.routerLink ?? [];
+ internalRoutes.adminControl.subRoutes.marketData.routerLink ?? [];
} else if (this.item?.mode === SearchMode.HOLDING) {
this.queryParams = {
dataSource: this.item.dataSource,
diff --git a/libs/ui/src/lib/assistant/assistant.component.ts b/libs/ui/src/lib/assistant/assistant.component.ts
index 1c67e4fa2..22d276cd3 100644
--- a/libs/ui/src/lib/assistant/assistant.component.ts
+++ b/libs/ui/src/lib/assistant/assistant.component.ts
@@ -717,7 +717,7 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
private searchQuickLinks(aSearchTerm: string): SearchResultItem[] {
const searchTerm = aSearchTerm.toLowerCase();
- const allRoutes = Object.values(internalRoutes)
+ const allRoutes = Object.values(internalRoutes)
.filter(({ excludeFromAssistant }) => {
if (isFunction(excludeFromAssistant)) {
return excludeFromAssistant(this.user);
@@ -725,13 +725,13 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
return !excludeFromAssistant;
})
- .reduce((acc, route) => {
+ .reduce((acc, route) => {
acc.push(route);
if (route.subRoutes) {
acc.push(...Object.values(route.subRoutes));
}
return acc;
- }, [] as InternalRoute[]);
+ }, []);
const fuse = new Fuse(allRoutes, {
keys: ['title'],
diff --git a/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts b/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts
index 9ca91d111..8691dc998 100644
--- a/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts
+++ b/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts
@@ -24,5 +24,5 @@ export class GfNoTransactionsInfoComponent {
@HostBinding('class.has-border') @Input() hasBorder = true;
public routerLinkPortfolioActivities =
- internalRoutes.portfolio.subRoutes?.activities.routerLink;
+ internalRoutes.portfolio.subRoutes.activities.routerLink;
}
From 453d8d88189eee069d0d6cc5d376a9368aefa22c Mon Sep 17 00:00:00 2001
From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com>
Date: Sun, 5 Apr 2026 14:08:07 +0700
Subject: [PATCH 210/224] Task/improve type safety in create or update account
dialog (#6683)
* Improve type safety
---
...eate-or-update-account-dialog.component.ts | 58 +++++++++----------
1 file changed, 29 insertions(+), 29 deletions(-)
diff --git a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts
index 6cdd18251..53d8380e1 100644
--- a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts
+++ b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts
@@ -5,7 +5,7 @@ import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo';
import { DataService } from '@ghostfolio/ui/services';
import { CommonModule, NgClass } from '@angular/common';
-import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
+import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
import {
AbstractControl,
FormBuilder,
@@ -51,17 +51,17 @@ import { CreateOrUpdateAccountDialogParams } from './interfaces/interfaces';
templateUrl: 'create-or-update-account-dialog.html'
})
export class GfCreateOrUpdateAccountDialogComponent {
- public accountForm: FormGroup;
- public currencies: string[] = [];
- public filteredPlatforms: Observable;
- public platforms: Platform[] = [];
-
- public constructor(
- @Inject(MAT_DIALOG_DATA) public data: CreateOrUpdateAccountDialogParams,
- private dataService: DataService,
- public dialogRef: MatDialogRef,
- private formBuilder: FormBuilder
- ) {}
+ protected accountForm: FormGroup;
+ protected currencies: string[] = [];
+ protected filteredPlatforms: Observable | undefined;
+ protected platforms: Platform[] = [];
+
+ protected readonly data =
+ inject(MAT_DIALOG_DATA);
+ private readonly dataService = inject(DataService);
+ private readonly dialogRef =
+ inject>(MatDialogRef);
+ private readonly formBuilder = inject(FormBuilder);
public ngOnInit() {
const { currencies } = this.dataService.fetchInfo();
@@ -93,18 +93,18 @@ export class GfCreateOrUpdateAccountDialogComponent {
this.filteredPlatforms = this.accountForm
.get('platformId')
- .valueChanges.pipe(
+ ?.valueChanges.pipe(
startWith(''),
- map((value) => {
+ map((value: Platform | string) => {
const name = typeof value === 'string' ? value : value?.name;
- return name ? this.filter(name as string) : this.platforms.slice();
+ return name ? this.filter(name) : this.platforms.slice();
})
);
});
}
- public autoCompleteCheck() {
- const inputValue = this.accountForm.get('platformId').value;
+ protected autoCompleteCheck() {
+ const inputValue = this.accountForm.get('platformId')?.value;
if (typeof inputValue === 'string') {
const matchingEntry = this.platforms.find(({ name }) => {
@@ -112,28 +112,28 @@ export class GfCreateOrUpdateAccountDialogComponent {
});
if (matchingEntry) {
- this.accountForm.get('platformId').setValue(matchingEntry);
+ this.accountForm.get('platformId')?.setValue(matchingEntry);
}
}
}
- public displayFn(platform: Platform) {
+ protected displayFn(platform: Platform) {
return platform?.name ?? '';
}
- public onCancel() {
+ protected onCancel() {
this.dialogRef.close();
}
- public async onSubmit() {
+ protected async onSubmit() {
const account: CreateAccountDto | UpdateAccountDto = {
- balance: this.accountForm.get('balance').value,
- comment: this.accountForm.get('comment').value || null,
- currency: this.accountForm.get('currency').value,
- id: this.accountForm.get('accountId').value,
- isExcluded: this.accountForm.get('isExcluded').value,
- name: this.accountForm.get('name').value,
- platformId: this.accountForm.get('platformId').value?.id || null
+ balance: this.accountForm.get('balance')?.value,
+ comment: this.accountForm.get('comment')?.value || null,
+ currency: this.accountForm.get('currency')?.value,
+ id: this.accountForm.get('accountId')?.value,
+ isExcluded: this.accountForm.get('isExcluded')?.value,
+ name: this.accountForm.get('name')?.value,
+ platformId: this.accountForm.get('platformId')?.value?.id || null
};
try {
@@ -177,7 +177,7 @@ export class GfCreateOrUpdateAccountDialogComponent {
const filterValue = value.toLowerCase();
return this.platforms.filter(({ name }) => {
- return name.toLowerCase().startsWith(filterValue);
+ return name?.toLowerCase().startsWith(filterValue);
});
}
}
From 50751d3eb9798ba7379a8f05a047b283cab20491 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rapha=C3=ABl=20TISON?=
<13355624+Airthee@users.noreply.github.com>
Date: Sun, 5 Apr 2026 09:08:53 +0200
Subject: [PATCH 211/224] Task/show loading state on activities type filter
change (#6677)
* Show loading state on activities type filter change
---------
Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
---
.../activities/activities-page.component.ts | 19 +++++++++++++++++--
1 file changed, 17 insertions(+), 2 deletions(-)
diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts b/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts
index faadef54f..acd6cba10 100644
--- a/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts
+++ b/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts
@@ -65,7 +65,7 @@ export class GfActivitiesPageComponent implements OnInit {
public routeQueryParams: Subscription;
public sortColumn = 'date';
public sortDirection: SortDirection = 'desc';
- public totalItems: number;
+ public totalItems: number | undefined;
public user: User;
public constructor(
@@ -135,8 +135,11 @@ export class GfActivitiesPageComponent implements OnInit {
}
public fetchActivities() {
- const dateRange = this.user?.settings?.dateRange;
+ // Reset dataSource and totalItems to show loading state
+ this.dataSource = undefined;
+ this.totalItems = undefined;
+ const dateRange = this.user?.settings?.dateRange;
const range = this.isCalendarYear(dateRange) ? dateRange : undefined;
this.dataService
@@ -200,6 +203,8 @@ export class GfActivitiesPageComponent implements OnInit {
.subscribe();
this.fetchActivities();
+
+ this.changeDetectorRef.markForCheck();
});
}
@@ -214,6 +219,8 @@ export class GfActivitiesPageComponent implements OnInit {
.subscribe();
this.fetchActivities();
+
+ this.changeDetectorRef.markForCheck();
});
}
@@ -289,6 +296,8 @@ export class GfActivitiesPageComponent implements OnInit {
.subscribe();
this.fetchActivities();
+
+ this.changeDetectorRef.markForCheck();
});
}
@@ -316,6 +325,8 @@ export class GfActivitiesPageComponent implements OnInit {
.subscribe();
this.fetchActivities();
+
+ this.changeDetectorRef.markForCheck();
});
}
@@ -365,6 +376,8 @@ export class GfActivitiesPageComponent implements OnInit {
.subscribe({
next: () => {
this.fetchActivities();
+
+ this.changeDetectorRef.markForCheck();
}
});
}
@@ -422,6 +435,8 @@ export class GfActivitiesPageComponent implements OnInit {
.subscribe();
this.fetchActivities();
+
+ this.changeDetectorRef.markForCheck();
}
});
}
From 211745d93480badf8f00a451ec2bff4f10caf8ad Mon Sep 17 00:00:00 2001
From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com>
Date: Sun, 5 Apr 2026 22:42:10 +0700
Subject: [PATCH 212/224] Task/improve type safety in create or update activity
dialog component (#6682)
Improve type safety
---
...ate-or-update-activity-dialog.component.ts | 234 +++++++++---------
.../create-or-update-activity-dialog.html | 10 +-
.../interfaces/interfaces.ts | 4 +-
3 files changed, 121 insertions(+), 127 deletions(-)
diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts
index 9cc312b25..277701862 100644
--- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts
+++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts
@@ -1,5 +1,6 @@
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { ASSET_CLASS_MAPPING } from '@ghostfolio/common/config';
+import { locale as defaultLocale } from '@ghostfolio/common/config';
import { CreateOrderDto, UpdateOrderDto } from '@ghostfolio/common/dtos';
import { getDateFormatString } from '@ghostfolio/common/helper';
import {
@@ -89,11 +90,11 @@ export class GfCreateOrUpdateActivityDialogComponent {
public assetSubClassOptions: AssetClassSelectorOption[] = [];
public currencies: string[] = [];
- public currencyOfAssetProfile: string;
- public currentMarketPrice = null;
+ public currencyOfAssetProfile: string | undefined;
+ public currentMarketPrice: number | null = null;
public defaultDateFormat: string;
public defaultLookupItems: LookupItem[] = [];
- public hasPermissionToCreateOwnTag: boolean;
+ public hasPermissionToCreateOwnTag: boolean | undefined;
public isLoading = false;
public isToday = isToday;
public mode: 'create' | 'update';
@@ -106,7 +107,7 @@ export class GfCreateOrUpdateActivityDialogComponent {
private changeDetectorRef: ChangeDetectorRef,
@Inject(MAT_DIALOG_DATA) public data: CreateOrUpdateActivityDialogParams,
private dataService: DataService,
- private dateAdapter: DateAdapter,
+ private dateAdapter: DateAdapter,
private destroyRef: DestroyRef,
public dialogRef: MatDialogRef,
private formBuilder: FormBuilder,
@@ -121,7 +122,7 @@ export class GfCreateOrUpdateActivityDialogComponent {
this.hasPermissionToCreateOwnTag =
this.data.user?.settings?.isExperimentalFeatures &&
hasPermission(this.data.user?.permissions, permissions.createOwnTag);
- this.locale = this.data.user?.settings?.locale;
+ this.locale = this.data.user.settings.locale ?? defaultLocale;
this.mode = this.data.activity?.id ? 'update' : 'create';
this.dateAdapter.setLocale(this.locale);
@@ -136,34 +137,25 @@ export class GfCreateOrUpdateActivityDialogComponent {
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ holdings }) => {
this.defaultLookupItems = holdings
- .filter(({ assetSubClass }) => {
- return !['CASH'].includes(assetSubClass);
+ .filter(({ assetProfile }) => {
+ return !['CASH'].includes(assetProfile.assetSubClass);
})
.sort((a, b) => {
return a.name?.localeCompare(b.name);
})
- .map(
- ({
- assetClass,
- assetSubClass,
- currency,
- dataSource,
- name,
- symbol
- }) => {
- return {
- assetClass,
- assetSubClass,
- currency,
- dataSource,
- name,
- symbol,
- dataProviderInfo: {
- isPremium: false
- }
- };
- }
- );
+ .map(({ assetProfile }) => {
+ return {
+ assetClass: assetProfile.assetClass,
+ assetSubClass: assetProfile.assetSubClass,
+ currency: assetProfile.currency ?? '',
+ dataProviderInfo: {
+ isPremium: false
+ },
+ dataSource: assetProfile.dataSource,
+ name: assetProfile.name ?? '',
+ symbol: assetProfile.symbol
+ };
+ });
this.changeDetectorRef.markForCheck();
});
@@ -242,25 +234,25 @@ export class GfCreateOrUpdateActivityDialogComponent {
.subscribe(async () => {
if (
['BUY', 'FEE', 'VALUABLE'].includes(
- this.activityForm.get('type').value
+ this.activityForm.get('type')?.value
)
) {
this.total =
- this.activityForm.get('quantity').value *
- this.activityForm.get('unitPrice').value +
- (this.activityForm.get('fee').value ?? 0);
+ this.activityForm.get('quantity')?.value *
+ this.activityForm.get('unitPrice')?.value +
+ (this.activityForm.get('fee')?.value ?? 0);
} else {
this.total =
- this.activityForm.get('quantity').value *
- this.activityForm.get('unitPrice').value -
- (this.activityForm.get('fee').value ?? 0);
+ this.activityForm.get('quantity')?.value *
+ this.activityForm.get('unitPrice')?.value -
+ (this.activityForm.get('fee')?.value ?? 0);
}
this.changeDetectorRef.markForCheck();
});
- this.activityForm.get('accountId').valueChanges.subscribe((accountId) => {
- const type = this.activityForm.get('type').value;
+ this.activityForm.get('accountId')?.valueChanges.subscribe((accountId) => {
+ const type = this.activityForm.get('type')?.value;
if (['FEE', 'INTEREST', 'LIABILITY', 'VALUABLE'].includes(type)) {
const currency =
@@ -268,15 +260,15 @@ export class GfCreateOrUpdateActivityDialogComponent {
return id === accountId;
})?.currency ?? this.data.user.settings.baseCurrency;
- this.activityForm.get('currency').setValue(currency);
- this.activityForm.get('currencyOfUnitPrice').setValue(currency);
+ this.activityForm.get('currency')?.setValue(currency);
+ this.activityForm.get('currencyOfUnitPrice')?.setValue(currency);
if (['FEE', 'INTEREST'].includes(type)) {
- if (this.activityForm.get('accountId').value) {
- this.activityForm.get('updateAccountBalance').enable();
+ if (this.activityForm.get('accountId')?.value) {
+ this.activityForm.get('updateAccountBalance')?.enable();
} else {
- this.activityForm.get('updateAccountBalance').disable();
- this.activityForm.get('updateAccountBalance').setValue(false);
+ this.activityForm.get('updateAccountBalance')?.disable();
+ this.activityForm.get('updateAccountBalance')?.setValue(false);
}
}
}
@@ -284,7 +276,7 @@ export class GfCreateOrUpdateActivityDialogComponent {
this.activityForm
.get('assetClass')
- .valueChanges.pipe(takeUntilDestroyed(this.destroyRef))
+ ?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((assetClass) => {
const assetSubClasses = ASSET_CLASS_MAPPING.get(assetClass) ?? [];
@@ -297,28 +289,28 @@ export class GfCreateOrUpdateActivityDialogComponent {
})
.sort((a, b) => a.label.localeCompare(b.label));
- this.activityForm.get('assetSubClass').setValue(null);
+ this.activityForm.get('assetSubClass')?.setValue(null);
this.changeDetectorRef.markForCheck();
});
- this.activityForm.get('date').valueChanges.subscribe(() => {
- if (isToday(this.activityForm.get('date').value)) {
- this.activityForm.get('updateAccountBalance').enable();
+ this.activityForm.get('date')?.valueChanges.subscribe(() => {
+ if (isToday(this.activityForm.get('date')?.value)) {
+ this.activityForm.get('updateAccountBalance')?.enable();
} else {
- this.activityForm.get('updateAccountBalance').disable();
- this.activityForm.get('updateAccountBalance').setValue(false);
+ this.activityForm.get('updateAccountBalance')?.disable();
+ this.activityForm.get('updateAccountBalance')?.setValue(false);
}
this.changeDetectorRef.markForCheck();
});
- this.activityForm.get('searchSymbol').valueChanges.subscribe(() => {
- if (this.activityForm.get('searchSymbol').invalid) {
+ this.activityForm.get('searchSymbol')?.valueChanges.subscribe(() => {
+ if (this.activityForm.get('searchSymbol')?.invalid) {
this.data.activity.SymbolProfile = null;
} else if (
['BUY', 'DIVIDEND', 'SELL'].includes(
- this.activityForm.get('type').value
+ this.activityForm.get('type')?.value
)
) {
this.updateAssetProfile();
@@ -327,7 +319,7 @@ export class GfCreateOrUpdateActivityDialogComponent {
this.changeDetectorRef.markForCheck();
});
- this.activityForm.get('tags').valueChanges.subscribe((tags: Tag[]) => {
+ this.activityForm.get('tags')?.valueChanges.subscribe((tags: Tag[]) => {
const newTag = tags.find(({ id }) => {
return id === undefined;
});
@@ -337,7 +329,7 @@ export class GfCreateOrUpdateActivityDialogComponent {
.postTag({ ...newTag, userId: this.data.user.id })
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((tag) => {
- this.activityForm.get('tags').setValue(
+ this.activityForm.get('tags')?.setValue(
tags.map((currentTag) => {
if (currentTag.id === undefined) {
return tag;
@@ -357,106 +349,106 @@ export class GfCreateOrUpdateActivityDialogComponent {
this.activityForm
.get('type')
- .valueChanges.pipe(takeUntilDestroyed(this.destroyRef))
+ ?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((type: ActivityType) => {
if (
type === 'VALUABLE' ||
- (this.activityForm.get('dataSource').value === 'MANUAL' &&
+ (this.activityForm.get('dataSource')?.value === 'MANUAL' &&
type === 'BUY')
) {
const currency =
this.data.accounts.find(({ id }) => {
- return id === this.activityForm.get('accountId').value;
+ return id === this.activityForm.get('accountId')?.value;
})?.currency ?? this.data.user.settings.baseCurrency;
- this.activityForm.get('currency').setValue(currency);
- this.activityForm.get('currencyOfUnitPrice').setValue(currency);
+ this.activityForm.get('currency')?.setValue(currency);
+ this.activityForm.get('currencyOfUnitPrice')?.setValue(currency);
this.activityForm
.get('dataSource')
- .removeValidators(Validators.required);
- this.activityForm.get('dataSource').updateValueAndValidity();
- this.activityForm.get('fee').setValue(0);
- this.activityForm.get('name').setValidators(Validators.required);
- this.activityForm.get('name').updateValueAndValidity();
+ ?.removeValidators(Validators.required);
+ this.activityForm.get('dataSource')?.updateValueAndValidity();
+ this.activityForm.get('fee')?.setValue(0);
+ this.activityForm.get('name')?.setValidators(Validators.required);
+ this.activityForm.get('name')?.updateValueAndValidity();
if (type === 'VALUABLE') {
- this.activityForm.get('quantity').setValue(1);
+ this.activityForm.get('quantity')?.setValue(1);
}
this.activityForm
.get('searchSymbol')
- .removeValidators(Validators.required);
- this.activityForm.get('searchSymbol').updateValueAndValidity();
- this.activityForm.get('updateAccountBalance').disable();
- this.activityForm.get('updateAccountBalance').setValue(false);
+ ?.removeValidators(Validators.required);
+ this.activityForm.get('searchSymbol')?.updateValueAndValidity();
+ this.activityForm.get('updateAccountBalance')?.disable();
+ this.activityForm.get('updateAccountBalance')?.setValue(false);
} else if (['FEE', 'INTEREST', 'LIABILITY'].includes(type)) {
const currency =
this.data.accounts.find(({ id }) => {
- return id === this.activityForm.get('accountId').value;
+ return id === this.activityForm.get('accountId')?.value;
})?.currency ?? this.data.user.settings.baseCurrency;
- this.activityForm.get('currency').setValue(currency);
- this.activityForm.get('currencyOfUnitPrice').setValue(currency);
+ this.activityForm.get('currency')?.setValue(currency);
+ this.activityForm.get('currencyOfUnitPrice')?.setValue(currency);
this.activityForm
.get('dataSource')
- .removeValidators(Validators.required);
- this.activityForm.get('dataSource').updateValueAndValidity();
+ ?.removeValidators(Validators.required);
+ this.activityForm.get('dataSource')?.updateValueAndValidity();
if (['INTEREST', 'LIABILITY'].includes(type)) {
- this.activityForm.get('fee').setValue(0);
+ this.activityForm.get('fee')?.setValue(0);
}
- this.activityForm.get('name').setValidators(Validators.required);
- this.activityForm.get('name').updateValueAndValidity();
+ this.activityForm.get('name')?.setValidators(Validators.required);
+ this.activityForm.get('name')?.updateValueAndValidity();
if (type === 'FEE') {
- this.activityForm.get('quantity').setValue(0);
+ this.activityForm.get('quantity')?.setValue(0);
} else if (['INTEREST', 'LIABILITY'].includes(type)) {
- this.activityForm.get('quantity').setValue(1);
+ this.activityForm.get('quantity')?.setValue(1);
}
this.activityForm
.get('searchSymbol')
- .removeValidators(Validators.required);
- this.activityForm.get('searchSymbol').updateValueAndValidity();
+ ?.removeValidators(Validators.required);
+ this.activityForm.get('searchSymbol')?.updateValueAndValidity();
if (type === 'FEE') {
- this.activityForm.get('unitPrice').setValue(0);
+ this.activityForm.get('unitPrice')?.setValue(0);
}
if (
['FEE', 'INTEREST'].includes(type) &&
- this.activityForm.get('accountId').value
+ this.activityForm.get('accountId')?.value
) {
- this.activityForm.get('updateAccountBalance').enable();
+ this.activityForm.get('updateAccountBalance')?.enable();
} else {
- this.activityForm.get('updateAccountBalance').disable();
- this.activityForm.get('updateAccountBalance').setValue(false);
+ this.activityForm.get('updateAccountBalance')?.disable();
+ this.activityForm.get('updateAccountBalance')?.setValue(false);
}
} else {
this.activityForm
.get('dataSource')
- .setValidators(Validators.required);
- this.activityForm.get('dataSource').updateValueAndValidity();
- this.activityForm.get('name').removeValidators(Validators.required);
- this.activityForm.get('name').updateValueAndValidity();
+ ?.setValidators(Validators.required);
+ this.activityForm.get('dataSource')?.updateValueAndValidity();
+ this.activityForm.get('name')?.removeValidators(Validators.required);
+ this.activityForm.get('name')?.updateValueAndValidity();
this.activityForm
.get('searchSymbol')
- .setValidators(Validators.required);
- this.activityForm.get('searchSymbol').updateValueAndValidity();
- this.activityForm.get('updateAccountBalance').enable();
+ ?.setValidators(Validators.required);
+ this.activityForm.get('searchSymbol')?.updateValueAndValidity();
+ this.activityForm.get('updateAccountBalance')?.enable();
}
this.changeDetectorRef.markForCheck();
});
- this.activityForm.get('type').setValue(this.data.activity?.type);
+ this.activityForm.get('type')?.setValue(this.data.activity?.type);
if (this.data.activity?.id) {
- this.activityForm.get('searchSymbol').disable();
- this.activityForm.get('type').disable();
+ this.activityForm.get('searchSymbol')?.disable();
+ this.activityForm.get('type')?.disable();
}
if (this.data.activity?.SymbolProfile?.symbol) {
@@ -476,7 +468,7 @@ export class GfCreateOrUpdateActivityDialogComponent {
public applyCurrentMarketPrice() {
this.activityForm.patchValue({
- currencyOfUnitPrice: this.activityForm.get('currency').value,
+ currencyOfUnitPrice: this.activityForm.get('currency')?.value,
unitPrice: this.currentMarketPrice
});
}
@@ -495,42 +487,42 @@ export class GfCreateOrUpdateActivityDialogComponent {
public async onSubmit() {
const activity: CreateOrderDto | UpdateOrderDto = {
- accountId: this.activityForm.get('accountId').value,
- assetClass: this.activityForm.get('assetClass').value,
- assetSubClass: this.activityForm.get('assetSubClass').value,
- comment: this.activityForm.get('comment').value || null,
- currency: this.activityForm.get('currency').value,
- customCurrency: this.activityForm.get('currencyOfUnitPrice').value,
+ accountId: this.activityForm.get('accountId')?.value,
+ assetClass: this.activityForm.get('assetClass')?.value,
+ assetSubClass: this.activityForm.get('assetSubClass')?.value,
+ comment: this.activityForm.get('comment')?.value || null,
+ currency: this.activityForm.get('currency')?.value,
+ customCurrency: this.activityForm.get('currencyOfUnitPrice')?.value,
dataSource: ['FEE', 'INTEREST', 'LIABILITY', 'VALUABLE'].includes(
- this.activityForm.get('type').value
+ this.activityForm.get('type')?.value
)
? 'MANUAL'
- : this.activityForm.get('dataSource').value,
- date: this.activityForm.get('date').value,
- fee: this.activityForm.get('fee').value,
- quantity: this.activityForm.get('quantity').value,
+ : this.activityForm.get('dataSource')?.value,
+ date: this.activityForm.get('date')?.value,
+ fee: this.activityForm.get('fee')?.value,
+ quantity: this.activityForm.get('quantity')?.value,
symbol:
(['FEE', 'INTEREST', 'LIABILITY', 'VALUABLE'].includes(
- this.activityForm.get('type').value
+ this.activityForm.get('type')?.value
)
? undefined
: this.activityForm.get('searchSymbol')?.value?.symbol) ??
this.activityForm.get('name')?.value,
- tags: this.activityForm.get('tags').value?.map(({ id }) => {
+ tags: this.activityForm.get('tags')?.value?.map(({ id }) => {
return id;
}),
type:
- this.activityForm.get('type').value === 'VALUABLE'
+ this.activityForm.get('type')?.value === 'VALUABLE'
? 'BUY'
- : this.activityForm.get('type').value,
- unitPrice: this.activityForm.get('unitPrice').value
+ : this.activityForm.get('type')?.value,
+ unitPrice: this.activityForm.get('unitPrice')?.value
};
try {
if (this.mode === 'create') {
activity.updateAccountBalance = this.activityForm.get(
'updateAccountBalance'
- ).value;
+ )?.value;
await validateObjectForForm({
classDto: CreateOrderDto,
@@ -563,8 +555,8 @@ export class GfCreateOrUpdateActivityDialogComponent {
this.dataService
.fetchSymbolItem({
- dataSource: this.activityForm.get('searchSymbol').value.dataSource,
- symbol: this.activityForm.get('searchSymbol').value.symbol
+ dataSource: this.activityForm.get('searchSymbol')?.value.dataSource,
+ symbol: this.activityForm.get('searchSymbol')?.value.symbol
})
.pipe(
catchError(() => {
@@ -580,9 +572,9 @@ export class GfCreateOrUpdateActivityDialogComponent {
)
.subscribe(({ currency, dataSource, marketPrice }) => {
if (this.mode === 'create') {
- this.activityForm.get('currency').setValue(currency);
- this.activityForm.get('currencyOfUnitPrice').setValue(currency);
- this.activityForm.get('dataSource').setValue(dataSource);
+ this.activityForm.get('currency')?.setValue(currency);
+ this.activityForm.get('currencyOfUnitPrice')?.setValue(currency);
+ this.activityForm.get('dataSource')?.setValue(dataSource);
}
this.currencyOfAssetProfile = currency;
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 278ddcbbd..038da44cb 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
@@ -15,7 +15,7 @@
Type
{{
- typesTranslationMap[activityForm.get('type').value]
+ typesTranslationMap[activityForm.get('type')?.value]
}}
@@ -128,7 +128,7 @@
@@ -228,7 +228,7 @@
@if (
currencyOfAssetProfile ===
- activityForm.get('currencyOfUnitPrice').value &&
+ activityForm.get('currencyOfUnitPrice')?.value &&
currentMarketPrice &&
['BUY', 'SELL'].includes(data.activity.type) &&
isToday(activityForm.get('date')?.value)
@@ -262,7 +262,7 @@
matTextSuffix
[ngClass]="{ 'd-none': !activityForm.get('currency')?.value }"
>
- {{ activityForm.get('currencyOfUnitPrice').value }}
+ {{ activityForm.get('currencyOfUnitPrice')?.value }}
diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts
index 5206aacf9..322bcc076 100644
--- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts
+++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts
@@ -4,6 +4,8 @@ import { Account } from '@prisma/client';
export interface CreateOrUpdateActivityDialogParams {
accounts: Account[];
- activity: Activity;
+ activity: Omit & {
+ SymbolProfile: Activity['SymbolProfile'] | null;
+ };
user: User;
}
From c17bc77c3bc3fac2c7e629e43a4eb23bd6b9d9de Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 6 Apr 2026 08:50:27 +0200
Subject: [PATCH 213/224] Task/upgrade prisma to version 6.19.3 (#6686)
* Upgrade prisma to version 6.19.3
* Update changelog
---
CHANGELOG.md | 4 ++
package-lock.json | 130 ++++++++++++++++++++++++----------------------
package.json | 4 +-
3 files changed, 75 insertions(+), 63 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 53461fd8f..f5d57d96b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Added support for filtering by activity type on the activities page (experimental)
+### Changed
+
+- Upgraded `prisma` from version `6.19.0` to `6.19.3`
+
## 2.252.0 - 2026-03-02
### Added
diff --git a/package-lock.json b/package-lock.json
index 49974055d..824703b65 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -41,7 +41,7 @@
"@nestjs/schedule": "6.1.1",
"@nestjs/serve-static": "5.0.4",
"@openrouter/ai-sdk-provider": "0.7.2",
- "@prisma/client": "6.19.0",
+ "@prisma/client": "6.19.3",
"@simplewebauthn/browser": "13.2.2",
"@simplewebauthn/server": "13.2.2",
"ai": "4.3.16",
@@ -150,7 +150,7 @@
"nx": "22.5.3",
"prettier": "3.8.1",
"prettier-plugin-organize-attributes": "1.0.0",
- "prisma": "6.19.0",
+ "prisma": "6.19.3",
"react": "18.2.0",
"react-dom": "18.2.0",
"replace-in-file": "8.4.0",
@@ -10492,9 +10492,9 @@
"license": "MIT"
},
"node_modules/@prisma/client": {
- "version": "6.19.0",
- "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.0.tgz",
- "integrity": "sha512-QXFT+N/bva/QI2qoXmjBzL7D6aliPffIwP+81AdTGq0FXDoLxLkWivGMawG8iM5B9BKfxLIXxfWWAF6wbuJU6g==",
+ "version": "6.19.3",
+ "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.3.tgz",
+ "integrity": "sha512-mKq3jQFhjvko5LTJFHGilsuQs+W+T3Gm451NzuTDGQxwCzwXHYnIu2zGkRoW+Exq3Rob7yp2MfzSrdIiZVhrBg==",
"hasInstallScript": true,
"license": "Apache-2.0",
"engines": {
@@ -10514,66 +10514,66 @@
}
},
"node_modules/@prisma/config": {
- "version": "6.19.0",
- "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.0.tgz",
- "integrity": "sha512-zwCayme+NzI/WfrvFEtkFhhOaZb/hI+X8TTjzjJ252VbPxAl2hWHK5NMczmnG9sXck2lsXrxIZuK524E25UNmg==",
+ "version": "6.19.3",
+ "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.3.tgz",
+ "integrity": "sha512-CBPT44BjlQxEt8kiMEauji2WHTDoVBOKl7UlewXmUgBPnr/oPRZC3psci5chJnYmH0ivEIog2OU9PGWoki3DLQ==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
"c12": "3.1.0",
"deepmerge-ts": "7.1.5",
- "effect": "3.18.4",
+ "effect": "3.21.0",
"empathic": "2.0.0"
}
},
"node_modules/@prisma/debug": {
- "version": "6.19.0",
- "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.0.tgz",
- "integrity": "sha512-8hAdGG7JmxrzFcTzXZajlQCidX0XNkMJkpqtfbLV54wC6LSSX6Vni25W/G+nAANwLnZ2TmwkfIuWetA7jJxJFA==",
+ "version": "6.19.3",
+ "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.3.tgz",
+ "integrity": "sha512-ljkJ+SgpXNktLG0Q/n4JGYCkKf0f8oYLyjImS2I8e2q2WCfdRRtWER062ZV/ixaNP2M2VKlWXVJiGzZaUgbKZw==",
"devOptional": true,
"license": "Apache-2.0"
},
"node_modules/@prisma/engines": {
- "version": "6.19.0",
- "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.0.tgz",
- "integrity": "sha512-pMRJ+1S6NVdXoB8QJAPIGpKZevFjxhKt0paCkRDTZiczKb7F4yTgRP8M4JdVkpQwmaD4EoJf6qA+p61godDokw==",
+ "version": "6.19.3",
+ "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.3.tgz",
+ "integrity": "sha512-RSYxtlYFl5pJ8ZePgMv0lZ9IzVCOdTPOegrs2qcbAEFrBI1G33h6wyC9kjQvo0DnYEhEVY0X4LsuFHXLKQk88g==",
"devOptional": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
- "@prisma/debug": "6.19.0",
- "@prisma/engines-version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773",
- "@prisma/fetch-engine": "6.19.0",
- "@prisma/get-platform": "6.19.0"
+ "@prisma/debug": "6.19.3",
+ "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7",
+ "@prisma/fetch-engine": "6.19.3",
+ "@prisma/get-platform": "6.19.3"
}
},
"node_modules/@prisma/engines-version": {
- "version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773",
- "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773.tgz",
- "integrity": "sha512-gV7uOBQfAFlWDvPJdQxMT1aSRur3a0EkU/6cfbAC5isV67tKDWUrPauyaHNpB+wN1ebM4A9jn/f4gH+3iHSYSQ==",
+ "version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7",
+ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7.tgz",
+ "integrity": "sha512-03bgb1VD5gvuumNf+7fVGBzfpJPjmqV423l/WxsWk2cNQ42JD0/SsFBPhN6z8iAvdHs07/7ei77SKu7aZfq8bA==",
"devOptional": true,
"license": "Apache-2.0"
},
"node_modules/@prisma/fetch-engine": {
- "version": "6.19.0",
- "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.0.tgz",
- "integrity": "sha512-OOx2Lda0DGrZ1rodADT06ZGqHzr7HY7LNMaFE2Vp8dp146uJld58sRuasdX0OiwpHgl8SqDTUKHNUyzEq7pDdQ==",
+ "version": "6.19.3",
+ "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.3.tgz",
+ "integrity": "sha512-tKtl/qco9Nt7LU5iKhpultD8O4vMCZcU2CHjNTnRrL1QvSUr5W/GcyFPjNL87GtRrwBc7ubXXD9xy4EvLvt8JA==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
- "@prisma/debug": "6.19.0",
- "@prisma/engines-version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773",
- "@prisma/get-platform": "6.19.0"
+ "@prisma/debug": "6.19.3",
+ "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7",
+ "@prisma/get-platform": "6.19.3"
}
},
"node_modules/@prisma/get-platform": {
- "version": "6.19.0",
- "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.0.tgz",
- "integrity": "sha512-ym85WDO2yDhC3fIXHWYpG3kVMBA49cL1XD2GCsCF8xbwoy2OkDQY44gEbAt2X46IQ4Apq9H6g0Ex1iFfPqEkHA==",
+ "version": "6.19.3",
+ "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.3.tgz",
+ "integrity": "sha512-xFj1VcJ1N3MKooOQAGO0W5tsd0W2QzIvW7DD7c/8H14Zmp4jseeWAITm+w2LLoLrlhoHdPPh0NMZ8mfL6puoHA==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
- "@prisma/debug": "6.19.0"
+ "@prisma/debug": "6.19.3"
}
},
"node_modules/@redis/client": {
@@ -16949,9 +16949,9 @@
"license": "MIT"
},
"node_modules/confbox": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz",
- "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==",
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz",
+ "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==",
"devOptional": true,
"license": "MIT"
},
@@ -18548,9 +18548,9 @@
}
},
"node_modules/defu": {
- "version": "6.1.4",
- "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
- "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
+ "version": "6.1.6",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.6.tgz",
+ "integrity": "sha512-f8mefEW4WIVg4LckePx3mALjQSPQgFlg9U8yaPdlsbdYcHQyj9n2zL2LJEA52smeYxOvmd/nB7TpMtHGMTHcug==",
"devOptional": true,
"license": "MIT"
},
@@ -18910,9 +18910,9 @@
"license": "MIT"
},
"node_modules/effect": {
- "version": "3.18.4",
- "resolved": "https://registry.npmjs.org/effect/-/effect-3.18.4.tgz",
- "integrity": "sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==",
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/effect/-/effect-3.21.0.tgz",
+ "integrity": "sha512-PPN80qRokCd1f015IANNhrwOnLO7GrrMQfk4/lnZRE/8j7UPWrNNjPV0uBrZutI/nHzernbW+J0hdqQysHiSnQ==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -20104,9 +20104,9 @@
}
},
"node_modules/exsolve": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz",
- "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz",
+ "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==",
"devOptional": true,
"license": "MIT"
},
@@ -27177,25 +27177,30 @@
}
},
"node_modules/nypm": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.2.tgz",
- "integrity": "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==",
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.5.tgz",
+ "integrity": "sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==",
"devOptional": true,
"license": "MIT",
"dependencies": {
- "citty": "^0.1.6",
- "consola": "^3.4.2",
+ "citty": "^0.2.0",
"pathe": "^2.0.3",
- "pkg-types": "^2.3.0",
- "tinyexec": "^1.0.1"
+ "tinyexec": "^1.0.2"
},
"bin": {
"nypm": "dist/cli.mjs"
},
"engines": {
- "node": "^14.16.0 || >=16.10.0"
+ "node": ">=18"
}
},
+ "node_modules/nypm/node_modules/citty": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz",
+ "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==",
+ "devOptional": true,
+ "license": "MIT"
+ },
"node_modules/oauth": {
"version": "0.10.2",
"resolved": "https://registry.npmjs.org/oauth/-/oauth-0.10.2.tgz",
@@ -29200,15 +29205,15 @@
}
},
"node_modules/prisma": {
- "version": "6.19.0",
- "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.0.tgz",
- "integrity": "sha512-F3eX7K+tWpkbhl3l4+VkFtrwJlLXbAM+f9jolgoUZbFcm1DgHZ4cq9AgVEgUym2au5Ad/TDLN8lg83D+M10ycw==",
+ "version": "6.19.3",
+ "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.3.tgz",
+ "integrity": "sha512-++ZJ0ijLrDJF6hNB4t4uxg2br3fC4H9Yc9tcbjr2fcNFP3rh/SBNrAgjhsqBU4Ght8JPrVofG/ZkXfnSfnYsFg==",
"devOptional": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
- "@prisma/config": "6.19.0",
- "@prisma/engines": "6.19.0"
+ "@prisma/config": "6.19.3",
+ "@prisma/engines": "6.19.3"
},
"bin": {
"prisma": "build/index.js"
@@ -32951,11 +32956,14 @@
"license": "MIT"
},
"node_modules/tinyexec": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz",
- "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz",
+ "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==",
"devOptional": true,
- "license": "MIT"
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
},
"node_modules/tinyglobby": {
"version": "0.2.15",
diff --git a/package.json b/package.json
index cf5787a4c..812aa4cfa 100644
--- a/package.json
+++ b/package.json
@@ -86,7 +86,7 @@
"@nestjs/schedule": "6.1.1",
"@nestjs/serve-static": "5.0.4",
"@openrouter/ai-sdk-provider": "0.7.2",
- "@prisma/client": "6.19.0",
+ "@prisma/client": "6.19.3",
"@simplewebauthn/browser": "13.2.2",
"@simplewebauthn/server": "13.2.2",
"ai": "4.3.16",
@@ -195,7 +195,7 @@
"nx": "22.5.3",
"prettier": "3.8.1",
"prettier-plugin-organize-attributes": "1.0.0",
- "prisma": "6.19.0",
+ "prisma": "6.19.3",
"react": "18.2.0",
"react-dom": "18.2.0",
"replace-in-file": "8.4.0",
From ced2b5518255c1ccc46aea44308fc06e5a5f3626 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 6 Apr 2026 08:51:18 +0200
Subject: [PATCH 214/224] Task/remove NEW badge from settings tab in admin
control page (#6687)
Remove NEW badge
---
apps/client/src/app/pages/admin/admin-page.component.ts | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/apps/client/src/app/pages/admin/admin-page.component.ts b/apps/client/src/app/pages/admin/admin-page.component.ts
index 284d3c41d..66312ef33 100644
--- a/apps/client/src/app/pages/admin/admin-page.component.ts
+++ b/apps/client/src/app/pages/admin/admin-page.component.ts
@@ -47,11 +47,7 @@ export class AdminPageComponent implements OnInit {
},
{
iconName: 'settings-outline',
- label:
- internalRoutes.adminControl.subRoutes.settings.title +
- '' +
- $localize`new` +
- ' ',
+ label: internalRoutes.adminControl.subRoutes.settings.title,
routerLink: internalRoutes.adminControl.subRoutes.settings.routerLink
},
{
From 10e185766af6546c98433bece73a6b33cdee7d59 Mon Sep 17 00:00:00 2001
From: Trevin Chow
Date: Sun, 5 Apr 2026 23:54:40 -0700
Subject: [PATCH 215/224] Task/remove unused getCategoryName() from rule
classes (#6688)
Remove unused getCategoryName()
---
apps/api/src/models/rule.ts | 2 --
.../rules/account-cluster-risk/current-investment.ts | 7 -------
.../models/rules/account-cluster-risk/single-account.ts | 7 -------
.../src/models/rules/asset-class-cluster-risk/equity.ts | 7 -------
.../models/rules/asset-class-cluster-risk/fixed-income.ts | 7 -------
.../base-currency-current-investment.ts | 7 -------
.../rules/currency-cluster-risk/current-investment.ts | 7 -------
.../economic-market-cluster-risk/developed-markets.ts | 7 -------
.../rules/economic-market-cluster-risk/emerging-markets.ts | 7 -------
.../models/rules/emergency-fund/emergency-fund-setup.ts | 7 -------
.../models/rules/fees/fee-ratio-total-investment-volume.ts | 7 -------
apps/api/src/models/rules/liquidity/buying-power.ts | 7 -------
.../rules/regional-market-cluster-risk/asia-pacific.ts | 4 ----
.../rules/regional-market-cluster-risk/emerging-markets.ts | 4 ----
.../models/rules/regional-market-cluster-risk/europe.ts | 4 ----
.../src/models/rules/regional-market-cluster-risk/japan.ts | 4 ----
.../rules/regional-market-cluster-risk/north-america.ts | 4 ----
17 files changed, 99 deletions(-)
diff --git a/apps/api/src/models/rule.ts b/apps/api/src/models/rule.ts
index 622375b5b..5603964c5 100644
--- a/apps/api/src/models/rule.ts
+++ b/apps/api/src/models/rule.ts
@@ -70,8 +70,6 @@ export abstract class Rule implements RuleInterface {
public abstract evaluate(aRuleSettings: T): EvaluationResult;
- public abstract getCategoryName(): string;
-
public abstract getConfiguration(): Partial<
PortfolioReportRule['configuration']
>;
diff --git a/apps/api/src/models/rules/account-cluster-risk/current-investment.ts b/apps/api/src/models/rules/account-cluster-risk/current-investment.ts
index 0004d394e..400a2506f 100644
--- a/apps/api/src/models/rules/account-cluster-risk/current-investment.ts
+++ b/apps/api/src/models/rules/account-cluster-risk/current-investment.ts
@@ -98,13 +98,6 @@ export class AccountClusterRiskCurrentInvestment extends Rule {
};
}
- public getCategoryName() {
- return this.i18nService.getTranslation({
- id: 'rule.accountClusterRisk.category',
- languageCode: this.getLanguageCode()
- });
- }
-
public getConfiguration() {
return {
threshold: {
diff --git a/apps/api/src/models/rules/account-cluster-risk/single-account.ts b/apps/api/src/models/rules/account-cluster-risk/single-account.ts
index 9988ea3cc..e4ee99064 100644
--- a/apps/api/src/models/rules/account-cluster-risk/single-account.ts
+++ b/apps/api/src/models/rules/account-cluster-risk/single-account.ts
@@ -57,13 +57,6 @@ export class AccountClusterRiskSingleAccount extends Rule {
};
}
- public getCategoryName() {
- return this.i18nService.getTranslation({
- id: 'rule.accountClusterRisk.category',
- languageCode: this.getLanguageCode()
- });
- }
-
public getConfiguration() {
return undefined;
}
diff --git a/apps/api/src/models/rules/asset-class-cluster-risk/equity.ts b/apps/api/src/models/rules/asset-class-cluster-risk/equity.ts
index f70756e91..372b0bb06 100644
--- a/apps/api/src/models/rules/asset-class-cluster-risk/equity.ts
+++ b/apps/api/src/models/rules/asset-class-cluster-risk/equity.ts
@@ -85,13 +85,6 @@ export class AssetClassClusterRiskEquity extends Rule {
};
}
- public getCategoryName() {
- return this.i18nService.getTranslation({
- id: 'rule.assetClassClusterRisk.category',
- languageCode: this.getLanguageCode()
- });
- }
-
public getConfiguration() {
return {
threshold: {
diff --git a/apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts b/apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts
index 3bd835e4d..404b4cd32 100644
--- a/apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts
+++ b/apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts
@@ -85,13 +85,6 @@ export class AssetClassClusterRiskFixedIncome extends Rule {
};
}
- public getCategoryName() {
- return this.i18nService.getTranslation({
- id: 'rule.assetClassClusterRisk.category',
- languageCode: this.getLanguageCode()
- });
- }
-
public getConfiguration() {
return {
threshold: {
diff --git a/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts b/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts
index d3176582f..83c72eeb8 100644
--- a/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts
+++ b/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts
@@ -82,13 +82,6 @@ export class CurrencyClusterRiskBaseCurrencyCurrentInvestment extends Rule {
};
}
- public getCategoryName() {
- return this.i18nService.getTranslation({
- id: 'rule.currencyClusterRisk.category',
- languageCode: this.getLanguageCode()
- });
- }
-
public getConfiguration() {
return {
threshold: {
diff --git a/apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts b/apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts
index df9b78eef..70f09f58c 100644
--- a/apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts
+++ b/apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts
@@ -76,13 +76,6 @@ export class EconomicMarketClusterRiskDevelopedMarkets extends Rule {
};
}
- public getCategoryName() {
- return this.i18nService.getTranslation({
- id: 'rule.economicMarketClusterRisk.category',
- languageCode: this.getLanguageCode()
- });
- }
-
public getConfiguration() {
return {
threshold: {
diff --git a/apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts b/apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts
index 4583dc50a..120c3f6a2 100644
--- a/apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts
+++ b/apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts
@@ -76,13 +76,6 @@ export class EconomicMarketClusterRiskEmergingMarkets extends Rule {
};
}
- public getCategoryName() {
- return this.i18nService.getTranslation({
- id: 'rule.economicMarketClusterRisk.category',
- languageCode: this.getLanguageCode()
- });
- }
-
public getConfiguration() {
return {
threshold: {
diff --git a/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts b/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts
index b956263f8..fcbd99d54 100644
--- a/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts
+++ b/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts
@@ -40,13 +40,6 @@ export class EmergencyFundSetup extends Rule {
};
}
- public getCategoryName() {
- return this.i18nService.getTranslation({
- id: 'rule.emergencyFund.category',
- languageCode: this.getLanguageCode()
- });
- }
-
public getConfiguration() {
return undefined;
}
diff --git a/apps/api/src/models/rules/fees/fee-ratio-total-investment-volume.ts b/apps/api/src/models/rules/fees/fee-ratio-total-investment-volume.ts
index 07bf5fa2c..23f9076e8 100644
--- a/apps/api/src/models/rules/fees/fee-ratio-total-investment-volume.ts
+++ b/apps/api/src/models/rules/fees/fee-ratio-total-investment-volume.ts
@@ -56,13 +56,6 @@ export class FeeRatioTotalInvestmentVolume extends Rule {
};
}
- public getCategoryName() {
- return this.i18nService.getTranslation({
- id: 'rule.fees.category',
- languageCode: this.getLanguageCode()
- });
- }
-
public getConfiguration() {
return {
threshold: {
diff --git a/apps/api/src/models/rules/liquidity/buying-power.ts b/apps/api/src/models/rules/liquidity/buying-power.ts
index 541750d7e..7e8b96143 100644
--- a/apps/api/src/models/rules/liquidity/buying-power.ts
+++ b/apps/api/src/models/rules/liquidity/buying-power.ts
@@ -63,13 +63,6 @@ export class BuyingPower extends Rule {
};
}
- public getCategoryName() {
- return this.i18nService.getTranslation({
- id: 'rule.liquidity.category',
- languageCode: this.getLanguageCode()
- });
- }
-
public getConfiguration() {
return {
threshold: {
diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/asia-pacific.ts b/apps/api/src/models/rules/regional-market-cluster-risk/asia-pacific.ts
index 1242df759..4723389b0 100644
--- a/apps/api/src/models/rules/regional-market-cluster-risk/asia-pacific.ts
+++ b/apps/api/src/models/rules/regional-market-cluster-risk/asia-pacific.ts
@@ -70,10 +70,6 @@ export class RegionalMarketClusterRiskAsiaPacific extends Rule {
};
}
- public getCategoryName() {
- return 'Regional Market Cluster Risk'; // TODO: Replace hardcoded text with i18n translation
- }
-
public getConfiguration() {
return {
threshold: {
diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/emerging-markets.ts b/apps/api/src/models/rules/regional-market-cluster-risk/emerging-markets.ts
index 8486d843b..d4695406a 100644
--- a/apps/api/src/models/rules/regional-market-cluster-risk/emerging-markets.ts
+++ b/apps/api/src/models/rules/regional-market-cluster-risk/emerging-markets.ts
@@ -72,10 +72,6 @@ export class RegionalMarketClusterRiskEmergingMarkets extends Rule {
};
}
- public getCategoryName() {
- return 'Regional Market Cluster Risk'; // TODO: Replace hardcoded text with i18n translation
- }
-
public getConfiguration() {
return {
threshold: {
diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/europe.ts b/apps/api/src/models/rules/regional-market-cluster-risk/europe.ts
index 459848db4..c5cb4d134 100644
--- a/apps/api/src/models/rules/regional-market-cluster-risk/europe.ts
+++ b/apps/api/src/models/rules/regional-market-cluster-risk/europe.ts
@@ -70,10 +70,6 @@ export class RegionalMarketClusterRiskEurope extends Rule {
};
}
- public getCategoryName() {
- return 'Regional Market Cluster Risk'; // TODO: Replace hardcoded text with i18n translation
- }
-
public getConfiguration() {
return {
threshold: {
diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/japan.ts b/apps/api/src/models/rules/regional-market-cluster-risk/japan.ts
index d9c1cff6b..fc9ab92ee 100644
--- a/apps/api/src/models/rules/regional-market-cluster-risk/japan.ts
+++ b/apps/api/src/models/rules/regional-market-cluster-risk/japan.ts
@@ -70,10 +70,6 @@ export class RegionalMarketClusterRiskJapan extends Rule {
};
}
- public getCategoryName() {
- return 'Regional Market Cluster Risk'; // TODO: Replace hardcoded text with i18n translation
- }
-
public getConfiguration() {
return {
threshold: {
diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts b/apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts
index 6180a2cc5..8bd3fb0cf 100644
--- a/apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts
+++ b/apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts
@@ -70,10 +70,6 @@ export class RegionalMarketClusterRiskNorthAmerica extends Rule {
};
}
- public getCategoryName() {
- return 'Regional Market Cluster Risk'; // TODO: Replace hardcoded text with i18n translation
- }
-
public getConfiguration() {
return {
threshold: {
From 56c4626bbd6b447902b1fb079da6aa66bc3affaa Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 6 Apr 2026 08:55:23 +0200
Subject: [PATCH 216/224] Feature/add copy-to-clipboard button to version of
admin overview (#6670)
* Add copy-to-clipboard button to version
* Update changelog
---
CHANGELOG.md | 1 +
.../src/app/components/admin-overview/admin-overview.html | 5 ++++-
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f5d57d96b..3a6488ab6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Added support for filtering by activity type on the activities page (experimental)
+- Extended the admin control panel by adding a copy-to-clipboard button for the application version
### Changed
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 f0a6ea1d5..55fa8dac5 100644
--- a/apps/client/src/app/components/admin-overview/admin-overview.html
+++ b/apps/client/src/app/components/admin-overview/admin-overview.html
@@ -6,7 +6,10 @@
From c3ca05bbddd4866f7acd6ad33ae1062de4485dc0 Mon Sep 17 00:00:00 2001
From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com>
Date: Mon, 6 Apr 2026 13:56:10 +0700
Subject: [PATCH 217/224] Task/improve type safety in create or update access
dialog (#6685)
Improve type safety
---
...reate-or-update-access-dialog.component.ts | 80 +++++++++++--------
.../create-or-update-access-dialog.html | 4 +-
2 files changed, 47 insertions(+), 37 deletions(-)
diff --git a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts
index a4fadeecf..97bd272d4 100644
--- a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts
+++ b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts
@@ -3,12 +3,13 @@ import { validateObjectForForm } from '@ghostfolio/common/utils';
import { NotificationService } from '@ghostfolio/ui/notifications';
import { DataService } from '@ghostfolio/ui/services';
+import type { HttpErrorResponse } from '@angular/common/http';
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
DestroyRef,
- Inject,
+ inject,
OnInit
} from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
@@ -50,18 +51,24 @@ import { CreateOrUpdateAccessDialogParams } from './interfaces/interfaces';
templateUrl: 'create-or-update-access-dialog.html'
})
export class GfCreateOrUpdateAccessDialogComponent implements OnInit {
- public accessForm: FormGroup;
- public mode: 'create' | 'update';
-
- public constructor(
- private changeDetectorRef: ChangeDetectorRef,
- @Inject(MAT_DIALOG_DATA) private data: CreateOrUpdateAccessDialogParams,
- public dialogRef: MatDialogRef,
- private dataService: DataService,
- private destroyRef: DestroyRef,
- private formBuilder: FormBuilder,
- private notificationService: NotificationService
- ) {
+ protected accessForm: FormGroup;
+ protected mode: 'create' | 'update';
+
+ private readonly changeDetectorRef = inject(ChangeDetectorRef);
+
+ private readonly data =
+ inject(MAT_DIALOG_DATA);
+
+ private readonly dataService = inject(DataService);
+ private readonly destroyRef = inject(DestroyRef);
+
+ private readonly dialogRef =
+ inject>(MatDialogRef);
+
+ private readonly formBuilder = inject(FormBuilder);
+ private readonly notificationService = inject(NotificationService);
+
+ public constructor() {
this.mode = this.data.access?.id ? 'update' : 'create';
}
@@ -81,22 +88,25 @@ export class GfCreateOrUpdateAccessDialogComponent implements OnInit {
]
});
- this.accessForm.get('type').valueChanges.subscribe((accessType) => {
- const granteeUserIdControl = this.accessForm.get('granteeUserId');
- const permissionsControl = this.accessForm.get('permissions');
+ this.accessForm
+ .get('type')
+ ?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef))
+ .subscribe((accessType) => {
+ const granteeUserIdControl = this.accessForm.get('granteeUserId');
+ const permissionsControl = this.accessForm.get('permissions');
- if (accessType === 'PRIVATE') {
- granteeUserIdControl.setValidators(Validators.required);
- } else {
- granteeUserIdControl.clearValidators();
- granteeUserIdControl.setValue(null);
- permissionsControl.setValue(this.data.access.permissions[0]);
- }
+ if (accessType === 'PRIVATE') {
+ granteeUserIdControl?.setValidators(Validators.required);
+ } else {
+ granteeUserIdControl?.clearValidators();
+ granteeUserIdControl?.setValue(null);
+ permissionsControl?.setValue(this.data.access.permissions[0]);
+ }
- granteeUserIdControl.updateValueAndValidity();
+ granteeUserIdControl?.updateValueAndValidity();
- this.changeDetectorRef.markForCheck();
- });
+ this.changeDetectorRef.markForCheck();
+ });
}
public onCancel() {
@@ -113,9 +123,9 @@ export class GfCreateOrUpdateAccessDialogComponent implements OnInit {
private async createAccess() {
const access: CreateAccessDto = {
- alias: this.accessForm.get('alias').value,
- granteeUserId: this.accessForm.get('granteeUserId').value,
- permissions: [this.accessForm.get('permissions').value]
+ alias: this.accessForm.get('alias')?.value,
+ granteeUserId: this.accessForm.get('granteeUserId')?.value,
+ permissions: [this.accessForm.get('permissions')?.value]
};
try {
@@ -128,7 +138,7 @@ export class GfCreateOrUpdateAccessDialogComponent implements OnInit {
this.dataService
.postAccess(access)
.pipe(
- catchError((error) => {
+ catchError((error: HttpErrorResponse) => {
if (error.status === StatusCodes.BAD_REQUEST) {
this.notificationService.alert({
title: $localize`Oops! Could not grant access.`
@@ -149,10 +159,10 @@ export class GfCreateOrUpdateAccessDialogComponent implements OnInit {
private async updateAccess() {
const access: UpdateAccessDto = {
- alias: this.accessForm.get('alias').value,
- granteeUserId: this.accessForm.get('granteeUserId').value,
+ alias: this.accessForm.get('alias')?.value,
+ granteeUserId: this.accessForm.get('granteeUserId')?.value,
id: this.data.access.id,
- permissions: [this.accessForm.get('permissions').value]
+ permissions: [this.accessForm.get('permissions')?.value]
};
try {
@@ -165,8 +175,8 @@ export class GfCreateOrUpdateAccessDialogComponent implements OnInit {
this.dataService
.putAccess(access)
.pipe(
- catchError(({ status }) => {
- if (status.status === StatusCodes.BAD_REQUEST) {
+ catchError(({ status }: HttpErrorResponse) => {
+ if (status === StatusCodes.BAD_REQUEST) {
this.notificationService.alert({
title: $localize`Oops! Could not update access.`
});
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 11669041d..93614b55a 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
@@ -38,13 +38,13 @@
Permission
Restricted view
- @if (accessForm.get('type').value === 'PRIVATE') {
+ @if (accessForm.get('type')?.value === 'PRIVATE') {
View
}
- @if (accessForm.get('type').value === 'PRIVATE') {
+ @if (accessForm.get('type')?.value === 'PRIVATE') {
From b994d983590bbcc8455b642ae90f510fb1cad9a7 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 6 Apr 2026 11:11:51 +0200
Subject: [PATCH 218/224] Task/extend ToS (#6690)
* Extend ToS
* Update changelog
---
CHANGELOG.md | 1 +
apps/client/src/assets/terms-of-service.md | 12 +++++++++++-
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3a6488ab6..d6a539243 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
+- Extended the terms of service for the _Ghostfolio_ SaaS (cloud) to include _Paid Plans_ and _Refund Policy_
- Upgraded `prisma` from version `6.19.0` to `6.19.3`
## 2.252.0 - 2026-03-02
diff --git a/apps/client/src/assets/terms-of-service.md b/apps/client/src/assets/terms-of-service.md
index d2a6e598d..4f62eee5b 100644
--- a/apps/client/src/assets/terms-of-service.md
+++ b/apps/client/src/assets/terms-of-service.md
@@ -51,8 +51,18 @@ This Agreement constitutes the entire agreement between the User and LICENSEE re
LICENSEE reserves the right to modify this Agreement at any time. Users are encouraged to review this Agreement periodically for updates. Continued use of the Service after changes to this Agreement constitutes acceptance of the modified terms.
+## Paid Plans
+
+LICENSEE offers paid plans (such as [Ghostfolio Premium](https://ghostfol.io/en/pricing)) for a fixed term as specified at the time of purchase. Paid plans do not renew automatically.
+
+LICENSEE may change the features or pricing of paid plans. For any existing paid plan, if a material feature is removed, LICENSEE may, acting in good faith, offer a pro-rata refund for the unused portion of the term upon the User’s request.
+
+## Refund Policy
+
+LICENSEE may offer a free trial of paid plans. Users are encouraged to use any available free trial to evaluate the Service before purchasing. While all purchases are final, a refund may be requested within fourteen (14) days of the purchase date by contacting LICENSEE. Requests after this period will not be honored.
+
By accessing or using the Service, or downloading data provided by the Service, the User acknowledges that they have read, understood, and agreed to be bound by this Terms of Service Agreement.
For any questions or concerns regarding this Agreement, please contact us [here](https://ghostfol.io/en/about).
-Date of Last Revision: March 29, 2025
+Date of Last Revision: April 6, 2026
From dd31c18e2dceb4b8d3c38df96b8de90f34f31cf2 Mon Sep 17 00:00:00 2001
From: David Requeno <108202767+DavidReque@users.noreply.github.com>
Date: Mon, 6 Apr 2026 03:12:41 -0600
Subject: [PATCH 219/224] Bugfix/fix broken allocation charts in presenter view
(#6689)
* Fix broken allocation charts in presenter view
* Update changelog
---------
Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
---
CHANGELOG.md | 8 +++++
.../allocations/allocations-page.component.ts | 19 ++++++-----
.../allocations/allocations-page.html | 32 ++++++++-----------
3 files changed, 33 insertions(+), 26 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d6a539243..dff59ac5a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -17,6 +17,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Extended the terms of service for the _Ghostfolio_ SaaS (cloud) to include _Paid Plans_ and _Refund Policy_
- Upgraded `prisma` from version `6.19.0` to `6.19.3`
+### Fixed
+
+- Fixed the allocations by account chart on the allocations page in the _Presenter View_
+- Fixed the allocations by asset class chart on the allocations page in the _Presenter View_
+- Fixed the allocations by currency chart on the allocations page in the _Presenter View_
+- Fixed the allocations by ETF provider chart on the allocations page in the _Presenter View_
+- Fixed the allocations by platform chart on the allocations page in the _Presenter View_
+
## 2.252.0 - 2026-03-02
### Added
diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
index 367716d2d..b0282c937 100644
--- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
+++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
@@ -159,10 +159,9 @@ export class GfAllocationsPageComponent implements OnInit {
if (state?.user) {
this.user = state.user;
- this.worldMapChartFormat =
- this.hasImpersonationId || this.user.settings.isRestrictedView
- ? `{0}%`
- : `{0} ${this.user?.settings?.baseCurrency}`;
+ this.worldMapChartFormat = this.showValuesInPercentage()
+ ? `{0}%`
+ : `{0} ${this.user?.settings?.baseCurrency}`;
this.isLoading = true;
@@ -310,7 +309,7 @@ export class GfAllocationsPageComponent implements OnInit {
] of Object.entries(this.portfolioDetails.accounts)) {
let value = 0;
- if (this.hasImpersonationId) {
+ if (this.showValuesInPercentage()) {
value = valueInPercentage;
} else {
value = valueInBaseCurrency;
@@ -328,7 +327,7 @@ export class GfAllocationsPageComponent implements OnInit {
)) {
let value = 0;
- if (this.hasImpersonationId) {
+ if (this.showValuesInPercentage()) {
value = position.allocationInPercentage;
} else {
value = position.valueInBaseCurrency;
@@ -491,7 +490,7 @@ export class GfAllocationsPageComponent implements OnInit {
] of Object.entries(this.portfolioDetails.platforms)) {
let value = 0;
- if (this.hasImpersonationId) {
+ if (this.showValuesInPercentage()) {
value = valueInPercentage;
} else {
value = valueInBaseCurrency;
@@ -506,7 +505,7 @@ export class GfAllocationsPageComponent implements OnInit {
this.topHoldings = Object.values(this.topHoldingsMap)
.map(({ name, value }) => {
- if (this.hasImpersonationId || this.user.settings.isRestrictedView) {
+ if (this.showValuesInPercentage()) {
return {
name,
allocationInPercentage: value,
@@ -597,4 +596,8 @@ export class GfAllocationsPageComponent implements OnInit {
this.router.navigate(['.'], { relativeTo: this.route });
});
}
+
+ public showValuesInPercentage() {
+ return this.hasImpersonationId || this.user?.settings?.isRestrictedView;
+ }
}
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 8d5503840..0b75c6d8f 100644
--- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html
+++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html
@@ -25,11 +25,9 @@
@@ -49,7 +47,7 @@
[baseCurrency]="user?.settings?.baseCurrency"
[colorScheme]="user?.settings?.colorScheme"
[data]="platforms"
- [isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
+ [isInPercent]="showValuesInPercentage()"
[keys]="['id']"
[locale]="user?.settings?.locale"
/>
@@ -71,7 +69,7 @@
[baseCurrency]="user?.settings?.baseCurrency"
[colorScheme]="user?.settings?.colorScheme"
[data]="holdings"
- [isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
+ [isInPercent]="showValuesInPercentage()"
[keys]="['currency']"
[locale]="user?.settings?.locale"
/>
@@ -93,7 +91,7 @@
[baseCurrency]="user?.settings?.baseCurrency"
[colorScheme]="user?.settings?.colorScheme"
[data]="holdings"
- [isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
+ [isInPercent]="showValuesInPercentage()"
[keys]="['assetClassLabel', 'assetSubClassLabel']"
[locale]="user?.settings?.locale"
/>
@@ -114,7 +112,7 @@
[baseCurrency]="user?.settings?.baseCurrency"
[colorScheme]="user?.settings?.colorScheme"
[data]="symbols"
- [isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
+ [isInPercent]="showValuesInPercentage()"
[keys]="['symbol']"
[locale]="user?.settings?.locale"
[showLabels]="deviceType !== 'mobile'"
@@ -138,7 +136,7 @@
[baseCurrency]="user?.settings?.baseCurrency"
[colorScheme]="user?.settings?.colorScheme"
[data]="sectors"
- [isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
+ [isInPercent]="showValuesInPercentage()"
[keys]="['name']"
[locale]="user?.settings?.locale"
[maxItems]="10"
@@ -161,7 +159,7 @@
[baseCurrency]="user?.settings?.baseCurrency"
[colorScheme]="user?.settings?.colorScheme"
[data]="continents"
- [isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
+ [isInPercent]="showValuesInPercentage()"
[keys]="['name']"
[locale]="user?.settings?.locale"
/>
@@ -183,7 +181,7 @@
[baseCurrency]="user?.settings?.baseCurrency"
[colorScheme]="user?.settings?.colorScheme"
[data]="marketsAdvanced"
- [isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
+ [isInPercent]="showValuesInPercentage()"
[locale]="user?.settings?.locale"
/>
@@ -206,9 +204,7 @@
@@ -272,7 +268,7 @@
[baseCurrency]="user?.settings?.baseCurrency"
[colorScheme]="user?.settings?.colorScheme"
[data]="countries"
- [isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
+ [isInPercent]="showValuesInPercentage()"
[keys]="['name']"
[locale]="user?.settings?.locale"
[maxItems]="10"
@@ -291,7 +287,7 @@
[baseCurrency]="user?.settings?.baseCurrency"
[colorScheme]="user?.settings?.colorScheme"
[data]="accounts"
- [isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
+ [isInPercent]="showValuesInPercentage()"
[keys]="['id']"
[locale]="user?.settings?.locale"
(proportionChartClicked)="onAccountChartClicked($event)"
@@ -314,7 +310,7 @@
[baseCurrency]="user?.settings?.baseCurrency"
[colorScheme]="user?.settings?.colorScheme"
[data]="holdings"
- [isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
+ [isInPercent]="showValuesInPercentage()"
[keys]="['etfProvider']"
[locale]="user?.settings?.locale"
/>
From cebf15284e73884a57da725dc5c715b699812e91 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 6 Apr 2026 15:43:16 +0200
Subject: [PATCH 220/224] Task/refactor input in world map chart component
(#6692)
Refactor input to isInPercentage
---
.../src/app/pages/portfolio/allocations/allocations-page.html | 2 +-
apps/client/src/app/pages/public/public-page.html | 2 +-
.../lib/world-map-chart/world-map-chart.component.stories.ts | 4 ++--
libs/ui/src/lib/world-map-chart/world-map-chart.component.ts | 4 ++--
4 files changed, 6 insertions(+), 6 deletions(-)
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 0b75c6d8f..530b528e6 100644
--- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html
+++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html
@@ -204,7 +204,7 @@
diff --git a/apps/client/src/app/pages/public/public-page.html b/apps/client/src/app/pages/public/public-page.html
index c422f9006..53132442b 100644
--- a/apps/client/src/app/pages/public/public-page.html
+++ b/apps/client/src/app/pages/public/public-page.html
@@ -154,7 +154,7 @@
diff --git a/libs/ui/src/lib/world-map-chart/world-map-chart.component.stories.ts b/libs/ui/src/lib/world-map-chart/world-map-chart.component.stories.ts
index bdc983ae3..6d9d85295 100644
--- a/libs/ui/src/lib/world-map-chart/world-map-chart.component.stories.ts
+++ b/libs/ui/src/lib/world-map-chart/world-map-chart.component.stories.ts
@@ -44,7 +44,7 @@ export const Default: Story = {
})
),
format: `{0} ${DEFAULT_CURRENCY}`,
- isInPercent: false
+ isInPercentage: false
}
};
@@ -52,6 +52,6 @@ export const InPercentage: Story = {
args: {
countries: VWRL_COUNTRY_ALLOCATION,
format: '{0}%',
- isInPercent: true
+ isInPercentage: true
}
};
diff --git a/libs/ui/src/lib/world-map-chart/world-map-chart.component.ts b/libs/ui/src/lib/world-map-chart/world-map-chart.component.ts
index 2a926cf7c..f86d4d010 100644
--- a/libs/ui/src/lib/world-map-chart/world-map-chart.component.ts
+++ b/libs/ui/src/lib/world-map-chart/world-map-chart.component.ts
@@ -21,7 +21,7 @@ import svgMap from 'svgmap';
export class GfWorldMapChartComponent implements OnChanges, OnDestroy {
@Input() countries: { [code: string]: { name?: string; value: number } };
@Input() format: string;
- @Input() isInPercent = false;
+ @Input() isInPercentage = false;
@Input() locale = getLocale();
public isLoading = true;
@@ -47,7 +47,7 @@ export class GfWorldMapChartComponent implements OnChanges, OnDestroy {
}
private initialize() {
- if (this.isInPercent) {
+ if (this.isInPercentage) {
// Convert value of countries to percentage
let sum = 0;
Object.keys(this.countries).map((country) => {
From 71ffd045cf75497f8324a271d6f05578ff6c3113 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 6 Apr 2026 15:44:31 +0200
Subject: [PATCH 221/224] Task/refactor input in investment chart component
(#6693)
* Refactor input to isInPercentage
---
.../account-detail-dialog.html | 2 +-
.../investment-chart/investment-chart.component.ts | 14 +++++++-------
.../pages/portfolio/analysis/analysis-page.html | 12 +++++++++---
3 files changed, 17 insertions(+), 11 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 e41d3415c..54e786734 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
@@ -24,7 +24,7 @@
class="h-100"
[currency]="user?.settings?.baseCurrency"
[historicalDataItems]="historicalDataItems"
- [isInPercent]="
+ [isInPercentage]="
data.hasImpersonationId || user.settings.isRestrictedView
"
[isLoading]="isLoadingChart"
diff --git a/apps/client/src/app/components/investment-chart/investment-chart.component.ts b/apps/client/src/app/components/investment-chart/investment-chart.component.ts
index 53d4f5693..21a7ac85a 100644
--- a/apps/client/src/app/components/investment-chart/investment-chart.component.ts
+++ b/apps/client/src/app/components/investment-chart/investment-chart.component.ts
@@ -61,7 +61,7 @@ export class GfInvestmentChartComponent implements OnChanges, OnDestroy {
@Input() currency: string;
@Input() groupBy: GroupBy;
@Input() historicalDataItems: LineChartItem[] = [];
- @Input() isInPercent = false;
+ @Input() isInPercentage = false;
@Input() isLoading = false;
@Input() locale = getLocale();
@Input() savingsRate = 0;
@@ -119,7 +119,7 @@ export class GfInvestmentChartComponent implements OnChanges, OnDestroy {
data: this.investments.map(({ date, investment }) => {
return {
x: parseDate(date).getTime(),
- y: this.isInPercent ? investment * 100 : investment
+ y: this.isInPercentage ? investment * 100 : investment
};
}),
label: this.benchmarkDataLabel,
@@ -139,7 +139,7 @@ export class GfInvestmentChartComponent implements OnChanges, OnDestroy {
data: this.values.map(({ date, value }) => {
return {
x: parseDate(date).getTime(),
- y: this.isInPercent ? value * 100 : value
+ y: this.isInPercentage ? value * 100 : value
};
}),
fill: false,
@@ -251,7 +251,7 @@ export class GfInvestmentChartComponent implements OnChanges, OnDestroy {
border: {
display: false
},
- display: !this.isInPercent,
+ display: !this.isInPercentage,
grid: {
color: ({ scale, tick }) => {
if (
@@ -292,10 +292,10 @@ export class GfInvestmentChartComponent implements OnChanges, OnDestroy {
return {
...getTooltipOptions({
colorScheme: this.colorScheme,
- currency: this.isInPercent ? undefined : this.currency,
+ currency: this.isInPercentage ? undefined : this.currency,
groupBy: this.groupBy,
- locale: this.isInPercent ? undefined : this.locale,
- unit: this.isInPercent ? '%' : undefined
+ locale: this.isInPercentage ? undefined : this.locale,
+ unit: this.isInPercentage ? '%' : undefined
}),
mode: 'index',
position: 'top',
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 517ad7101..c4e8f610b 100644
--- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html
+++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html
@@ -417,7 +417,9 @@
[benchmarkDataLabel]="portfolioEvolutionDataLabel"
[currency]="user?.settings?.baseCurrency"
[historicalDataItems]="performanceDataItems"
- [isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
+ [isInPercentage]="
+ hasImpersonationId || user.settings.isRestrictedView
+ "
[isLoading]="isLoadingInvestmentChart"
[locale]="user?.settings?.locale"
/>
@@ -473,7 +475,9 @@
[benchmarkDataLabel]="investmentTimelineDataLabel"
[currency]="user?.settings?.baseCurrency"
[groupBy]="mode"
- [isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
+ [isInPercentage]="
+ hasImpersonationId || user.settings.isRestrictedView
+ "
[isLoading]="isLoadingInvestmentTimelineChart"
[locale]="user?.settings?.locale"
[savingsRate]="savingsRate"
@@ -508,7 +512,9 @@
[benchmarkDataLabel]="dividendTimelineDataLabel"
[currency]="user?.settings?.baseCurrency"
[groupBy]="mode"
- [isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
+ [isInPercentage]="
+ hasImpersonationId || user.settings.isRestrictedView
+ "
[isLoading]="isLoadingDividendTimelineChart"
[locale]="user?.settings?.locale"
/>
From b32f24a45c47f1560e7a7bdbdb0c04a4f312490f Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 6 Apr 2026 15:47:39 +0200
Subject: [PATCH 222/224] Task/refactor input in portfolio proportion chart
component (#6691)
* Refactor input to isInPercentage
---
.../asset-profile-dialog.html | 4 ++--
.../holding-detail-dialog.html | 4 ++--
.../allocations/allocations-page.html | 20 +++++++++----------
.../src/app/pages/public/public-page.html | 8 ++++----
...olio-proportion-chart.component.stories.ts | 2 +-
.../portfolio-proportion-chart.component.ts | 6 +++---
6 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
index 6b3141bfe..7354ca5f8 100644
--- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
+++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
@@ -280,7 +280,7 @@
@@ -290,7 +290,7 @@
diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
index b8cb8dda2..11771dee2 100644
--- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
+++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -286,7 +286,7 @@
[baseCurrency]="data.baseCurrency"
[colorScheme]="data.colorScheme"
[data]="sectors"
- [isInPercent]="true"
+ [isInPercentage]="true"
[keys]="['name']"
[locale]="data.locale"
[maxItems]="10"
@@ -298,7 +298,7 @@
[baseCurrency]="data.baseCurrency"
[colorScheme]="data.colorScheme"
[data]="countries"
- [isInPercent]="true"
+ [isInPercentage]="true"
[keys]="['name']"
[locale]="data.locale"
[maxItems]="10"
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 530b528e6..33431ce5d 100644
--- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html
+++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html
@@ -47,7 +47,7 @@
[baseCurrency]="user?.settings?.baseCurrency"
[colorScheme]="user?.settings?.colorScheme"
[data]="platforms"
- [isInPercent]="showValuesInPercentage()"
+ [isInPercentage]="showValuesInPercentage()"
[keys]="['id']"
[locale]="user?.settings?.locale"
/>
@@ -69,7 +69,7 @@
[baseCurrency]="user?.settings?.baseCurrency"
[colorScheme]="user?.settings?.colorScheme"
[data]="holdings"
- [isInPercent]="showValuesInPercentage()"
+ [isInPercentage]="showValuesInPercentage()"
[keys]="['currency']"
[locale]="user?.settings?.locale"
/>
@@ -91,7 +91,7 @@
[baseCurrency]="user?.settings?.baseCurrency"
[colorScheme]="user?.settings?.colorScheme"
[data]="holdings"
- [isInPercent]="showValuesInPercentage()"
+ [isInPercentage]="showValuesInPercentage()"
[keys]="['assetClassLabel', 'assetSubClassLabel']"
[locale]="user?.settings?.locale"
/>
@@ -112,7 +112,7 @@
[baseCurrency]="user?.settings?.baseCurrency"
[colorScheme]="user?.settings?.colorScheme"
[data]="symbols"
- [isInPercent]="showValuesInPercentage()"
+ [isInPercentage]="showValuesInPercentage()"
[keys]="['symbol']"
[locale]="user?.settings?.locale"
[showLabels]="deviceType !== 'mobile'"
@@ -136,7 +136,7 @@
[baseCurrency]="user?.settings?.baseCurrency"
[colorScheme]="user?.settings?.colorScheme"
[data]="sectors"
- [isInPercent]="showValuesInPercentage()"
+ [isInPercentage]="showValuesInPercentage()"
[keys]="['name']"
[locale]="user?.settings?.locale"
[maxItems]="10"
@@ -159,7 +159,7 @@
[baseCurrency]="user?.settings?.baseCurrency"
[colorScheme]="user?.settings?.colorScheme"
[data]="continents"
- [isInPercent]="showValuesInPercentage()"
+ [isInPercentage]="showValuesInPercentage()"
[keys]="['name']"
[locale]="user?.settings?.locale"
/>
@@ -181,7 +181,7 @@
[baseCurrency]="user?.settings?.baseCurrency"
[colorScheme]="user?.settings?.colorScheme"
[data]="marketsAdvanced"
- [isInPercent]="showValuesInPercentage()"
+ [isInPercentage]="showValuesInPercentage()"
[locale]="user?.settings?.locale"
/>
@@ -268,7 +268,7 @@
[baseCurrency]="user?.settings?.baseCurrency"
[colorScheme]="user?.settings?.colorScheme"
[data]="countries"
- [isInPercent]="showValuesInPercentage()"
+ [isInPercentage]="showValuesInPercentage()"
[keys]="['name']"
[locale]="user?.settings?.locale"
[maxItems]="10"
@@ -287,7 +287,7 @@
[baseCurrency]="user?.settings?.baseCurrency"
[colorScheme]="user?.settings?.colorScheme"
[data]="accounts"
- [isInPercent]="showValuesInPercentage()"
+ [isInPercentage]="showValuesInPercentage()"
[keys]="['id']"
[locale]="user?.settings?.locale"
(proportionChartClicked)="onAccountChartClicked($event)"
@@ -310,7 +310,7 @@
[baseCurrency]="user?.settings?.baseCurrency"
[colorScheme]="user?.settings?.colorScheme"
[data]="holdings"
- [isInPercent]="showValuesInPercentage()"
+ [isInPercentage]="showValuesInPercentage()"
[keys]="['etfProvider']"
[locale]="user?.settings?.locale"
/>
diff --git a/apps/client/src/app/pages/public/public-page.html b/apps/client/src/app/pages/public/public-page.html
index 53132442b..9e5fd3748 100644
--- a/apps/client/src/app/pages/public/public-page.html
+++ b/apps/client/src/app/pages/public/public-page.html
@@ -73,7 +73,7 @@
@@ -98,7 +98,7 @@
@@ -115,7 +115,7 @@
@@ -134,7 +134,7 @@
diff --git a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.stories.ts b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.stories.ts
index b5a3d6819..8ee9a4c7f 100644
--- a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.stories.ts
+++ b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.stories.ts
@@ -77,7 +77,7 @@ export const InPercentage: Story = {
JP: { name: 'Japan', value: 0 },
BE: { name: 'Belgium', value: 0 }
},
- isInPercent: true,
+ isInPercentage: true,
keys: ['name']
}
};
diff --git a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
index 2f5d9e4f7..4021bf97f 100644
--- a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
+++ b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
@@ -74,7 +74,7 @@ export class GfPortfolioProportionChartComponent
value: number;
};
} = {};
- @Input() isInPercent = false;
+ @Input() isInPercentage = false;
@Input() keys: string[] = [];
@Input() locale = getLocale();
@Input() maxItems?: number;
@@ -198,7 +198,7 @@ export class GfPortfolioProportionChartComponent
});
}
- if (this.isInPercent) {
+ if (this.isInPercentage) {
const totalValueInPercentage = getSum(
Object.values(chartData).map(({ value }) => {
return value;
@@ -465,7 +465,7 @@ export class GfPortfolioProportionChartComponent
if ((context.raw as number) === Number.MAX_SAFE_INTEGER) {
return $localize`No data available`;
- } else if (this.isInPercent) {
+ } else if (this.isInPercentage) {
return [`${name ?? symbol}`, `${percentage.toFixed(2)}%`];
} else {
const value = context.raw as number;
From 7c8cbb721f759dda9f4c29caeec5be1b3d01dce2 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Mon, 6 Apr 2026 15:56:37 +0200
Subject: [PATCH 223/224] Release 2.253.0 (#6695)
---
CHANGELOG.md | 2 +-
package-lock.json | 4 ++--
package.json | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index dff59ac5a..6624570cf 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.253.0 - 2026-03-06
### Added
diff --git a/package-lock.json b/package-lock.json
index 824703b65..9afcf7af7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "ghostfolio",
- "version": "2.252.0",
+ "version": "2.253.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ghostfolio",
- "version": "2.252.0",
+ "version": "2.253.0",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {
diff --git a/package.json b/package.json
index 812aa4cfa..686065630 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ghostfolio",
- "version": "2.252.0",
+ "version": "2.253.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",
From a58a3525e9d746054ed903241c14087a418be72d Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Tue, 7 Apr 2026 12:05:39 +0200
Subject: [PATCH 224/224] Task/clean up log in user account access component
(#6697)
Clean up
---
.../user-account-access/user-account-access.component.ts | 2 --
1 file changed, 2 deletions(-)
diff --git a/apps/client/src/app/components/user-account-access/user-account-access.component.ts b/apps/client/src/app/components/user-account-access/user-account-access.component.ts
index 4ca088775..f8620c745 100644
--- a/apps/client/src/app/components/user-account-access/user-account-access.component.ts
+++ b/apps/client/src/app/components/user-account-access/user-account-access.component.ts
@@ -212,8 +212,6 @@ export class GfUserAccountAccessComponent implements OnInit {
});
if (!access) {
- console.log('Could not find access.');
-
return;
}