From ece4ed3edee152887e8829ba2c320769d1c61769 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 16 Jul 2026 20:52:36 +0200 Subject: [PATCH 01/54] Task/migrate activity dialogs to dedicated routes (#7343) * Migrate clone, create and edit activity dialogs to dedicated routes * Update changelog --- CHANGELOG.md | 4 + apps/client/src/app/app.component.ts | 7 +- .../account-detail-dialog.component.ts | 47 +++-- .../account-detail-dialog.html | 2 - .../interfaces/interfaces.ts | 4 + .../holding-detail-dialog.component.ts | 49 +++-- .../holding-detail-dialog.html | 2 - .../interfaces/interfaces.ts | 4 + .../pages/accounts/accounts-page.component.ts | 14 +- .../activities/activities-page.component.ts | 141 +-------------- .../portfolio/activities/activities-page.html | 11 +- .../activities/activities-page.routes.ts | 29 +++ .../activity-dialog-host.component.ts | 169 ++++++++++++++++++ .../types/activity-dialog-mode.type.ts | 1 + .../activities/interfaces/interfaces.ts | 7 - .../allocations/allocations-page.component.ts | 14 +- .../interfaces/internal-route.interface.ts | 2 +- libs/common/src/lib/routes/routes.ts | 21 +++ .../activities-table.component.html | 14 +- .../activities-table.component.stories.ts | 33 +++- .../activities-table.component.ts | 35 ++-- .../src/lib/assistant/assistant.component.ts | 28 ++- libs/ui/src/lib/fab/fab.component.html | 2 +- libs/ui/src/lib/fab/fab.component.ts | 3 +- 24 files changed, 402 insertions(+), 241 deletions(-) create mode 100644 apps/client/src/app/pages/portfolio/activities/activity-dialog-host/activity-dialog-host.component.ts create mode 100644 apps/client/src/app/pages/portfolio/activities/activity-dialog-host/types/activity-dialog-mode.type.ts delete mode 100644 apps/client/src/app/pages/portfolio/activities/interfaces/interfaces.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index b645fb0e7b..f83f4d8cef 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 + +- Migrated the clone, create and edit activity dialogs to dedicated routes + ### Fixed - Fixed the missing validation of the tags when creating or updating an activity diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index 90ff2f1bc4..ff67daf5e6 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -40,6 +40,7 @@ import { filter } from 'rxjs/operators'; import { GfFooterComponent } from './components/footer/footer.component'; import { GfHeaderComponent } from './components/header/header.component'; import { GfHoldingDetailDialogComponent } from './components/holding-detail-dialog/holding-detail-dialog.component'; +import { HoldingDetailDialogResult } from './components/holding-detail-dialog/interfaces/interfaces'; import { GfAppQueryParams } from './interfaces/interfaces'; import { ImpersonationStorageService } from './services/impersonation-storage.service'; import { UserService } from './services/user/user.service'; @@ -319,7 +320,11 @@ export class GfAppComponent implements OnInit { dialogRef .afterClosed() .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(() => { + .subscribe((result: HoldingDetailDialogResult) => { + if (result?.isNavigating) { + return; + } + void this.router.navigate([], { queryParams: { dataSource: null, diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts index 5af8c9d005..62b87cfc09 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts @@ -15,7 +15,6 @@ import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { GfAccountBalancesComponent } from '@ghostfolio/ui/account-balances'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { GfDialogFooterComponent } from '@ghostfolio/ui/dialog-footer'; @@ -41,7 +40,7 @@ import { PageEvent } from '@angular/material/paginator'; import { Sort, SortDirection } from '@angular/material/sort'; import { MatTableDataSource } from '@angular/material/table'; import { MatTabsModule } from '@angular/material/tabs'; -import { Router } from '@angular/router'; +import { NavigationStart, Router } from '@angular/router'; import { IonIcon } from '@ionic/angular/standalone'; import { Big } from 'big.js'; import { format, parseISO } from 'date-fns'; @@ -53,9 +52,12 @@ import { } from 'ionicons/icons'; import { isNumber } from 'lodash'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; -import { forkJoin } from 'rxjs'; +import { filter, forkJoin } from 'rxjs'; -import { AccountDetailDialogParams } from './interfaces/interfaces'; +import { + AccountDetailDialogParams, + AccountDetailDialogResult +} from './interfaces/interfaces'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, @@ -113,11 +115,24 @@ export class GfAccountDetailDialogComponent implements OnInit { private readonly dataService = inject(DataService); private readonly destroyRef = inject(DestroyRef); private readonly dialogRef = - inject>(MatDialogRef); + inject< + MatDialogRef + >(MatDialogRef); private readonly router = inject(Router); private readonly userService = inject(UserService); public constructor() { + this.router.events + .pipe( + filter((event) => { + return event instanceof NavigationStart; + }), + takeUntilDestroyed(this.destroyRef) + ) + .subscribe(() => { + this.dialogRef.close({ isNavigating: true }); + }); + this.userService.stateChanged .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe((state) => { @@ -155,17 +170,6 @@ export class GfAccountDetailDialogComponent implements OnInit { this.fetchActivities(); } - protected onCloneActivity(aActivity: Activity) { - this.router.navigate( - internalRoutes.portfolio.subRoutes.activities.routerLink, - { - queryParams: { activityId: aActivity.id, createDialog: true } - } - ); - - this.dialogRef.close(); - } - protected onClose() { this.dialogRef.close(); } @@ -208,17 +212,6 @@ export class GfAccountDetailDialogComponent implements OnInit { this.fetchActivities(); } - protected onUpdateActivity(aActivity: Activity) { - this.router.navigate( - internalRoutes.portfolio.subRoutes.activities.routerLink, - { - queryParams: { activityId: aActivity.id, editDialog: true } - } - ); - - this.dialogRef.close(); - } - protected showValuesInPercentage() { return ( this.data.hasImpersonationId || this.user?.settings?.isRestrictedView 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 4b652db96c..5c5be6cb7a 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 @@ -132,8 +132,6 @@ [sortColumn]="sortColumn" [sortDirection]="sortDirection" [totalItems]="totalItems" - (activityToClone)="onCloneActivity($event)" - (activityToUpdate)="onUpdateActivity($event)" (export)="onExport()" (pageChanged)="onChangePage($event)" (sortChanged)="onSortChanged($event)" diff --git a/apps/client/src/app/components/account-detail-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/account-detail-dialog/interfaces/interfaces.ts index 01c84e9566..2f80dac363 100644 --- a/apps/client/src/app/components/account-detail-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/components/account-detail-dialog/interfaces/interfaces.ts @@ -4,3 +4,7 @@ export interface AccountDetailDialogParams { hasImpersonationId: boolean; hasPermissionToCreateActivity: boolean; } + +export interface AccountDetailDialogResult { + isNavigating?: boolean; +} diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts index 52e0a14d4e..944b1cb1d3 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts @@ -63,7 +63,7 @@ import { PageEvent } from '@angular/material/paginator'; import { SortDirection } from '@angular/material/sort'; import { MatTableDataSource } from '@angular/material/table'; import { MatTabsModule } from '@angular/material/tabs'; -import { Router, RouterModule } from '@angular/router'; +import { NavigationStart, Router, RouterModule } from '@angular/router'; import { IonIcon } from '@ionic/angular/standalone'; import { Account, MarketData, Tag } from '@prisma/client'; import { isUUID } from 'class-validator'; @@ -80,9 +80,12 @@ import { } from 'ionicons/icons'; import { isNumber, round, uniqBy } from 'lodash'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; -import { switchMap } from 'rxjs/operators'; +import { filter, switchMap } from 'rxjs/operators'; -import { HoldingDetailDialogParams } from './interfaces/interfaces'; +import { + HoldingDetailDialogParams, + HoldingDetailDialogResult +} from './interfaces/interfaces'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, @@ -186,9 +189,10 @@ export class GfHoldingDetailDialogComponent implements OnInit { protected value: number; protected readonly data = inject(MAT_DIALOG_DATA); - protected readonly dialogRef = inject( - MatDialogRef - ); + protected readonly dialogRef = + inject< + MatDialogRef + >(MatDialogRef); private tags: Tag[]; @@ -200,6 +204,17 @@ export class GfHoldingDetailDialogComponent implements OnInit { private readonly userService = inject(UserService); public constructor() { + this.router.events + .pipe( + filter((event) => { + return event instanceof NavigationStart; + }), + takeUntilDestroyed(this.destroyRef) + ) + .subscribe(() => { + this.dialogRef.close({ isNavigating: true }); + }); + addIcons({ arrowDownCircleOutline, createOutline, @@ -589,17 +604,6 @@ export class GfHoldingDetailDialogComponent implements OnInit { this.fetchActivities(); } - protected onCloneActivity(aActivity: Activity) { - this.router.navigate( - internalRoutes.portfolio.subRoutes.activities.routerLink, - { - queryParams: { activityId: aActivity.id, createDialog: true } - } - ); - - this.dialogRef.close(); - } - protected onClose() { this.dialogRef.close(); } @@ -661,17 +665,6 @@ export class GfHoldingDetailDialogComponent implements OnInit { } } - protected onUpdateActivity(aActivity: Activity) { - this.router.navigate( - internalRoutes.portfolio.subRoutes.activities.routerLink, - { - queryParams: { activityId: aActivity.id, editDialog: true } - } - ); - - this.dialogRef.close(); - } - private fetchActivities(filters: Filter[] = this.getActivityFilters()) { this.dataService .fetchActivities({ 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 f233df8b63..0a8ee6dcea 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 @@ -374,8 +374,6 @@ [sortDirection]="sortDirection" [sortDisabled]="true" [totalItems]="activitiesCount" - (activityToClone)="onCloneActivity($event)" - (activityToUpdate)="onUpdateActivity($event)" (export)="onExport()" (pageChanged)="onChangePage($event)" /> diff --git a/apps/client/src/app/components/holding-detail-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/holding-detail-dialog/interfaces/interfaces.ts index 527b13636f..40c94ca60e 100644 --- a/apps/client/src/app/components/holding-detail-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/components/holding-detail-dialog/interfaces/interfaces.ts @@ -15,3 +15,7 @@ export interface HoldingDetailDialogParams { locale: string; symbol: string; } + +export interface HoldingDetailDialogResult { + isNavigating?: boolean; +} diff --git a/apps/client/src/app/pages/accounts/accounts-page.component.ts b/apps/client/src/app/pages/accounts/accounts-page.component.ts index 7d5e2fff7b..1cf0e44a78 100644 --- a/apps/client/src/app/pages/accounts/accounts-page.component.ts +++ b/apps/client/src/app/pages/accounts/accounts-page.component.ts @@ -1,5 +1,8 @@ import { GfAccountDetailDialogComponent } from '@ghostfolio/client/components/account-detail-dialog/account-detail-dialog.component'; -import { AccountDetailDialogParams } from '@ghostfolio/client/components/account-detail-dialog/interfaces/interfaces'; +import { + AccountDetailDialogParams, + AccountDetailDialogResult +} from '@ghostfolio/client/components/account-detail-dialog/interfaces/interfaces'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { @@ -243,7 +246,8 @@ export class GfAccountsPageComponent implements OnInit { private openAccountDetailDialog(aAccountId: string) { const dialogRef = this.dialog.open< GfAccountDetailDialogComponent, - AccountDetailDialogParams + AccountDetailDialogParams, + AccountDetailDialogResult >(GfAccountDetailDialogComponent, { autoFocus: false, data: { @@ -262,7 +266,11 @@ export class GfAccountsPageComponent implements OnInit { dialogRef .afterClosed() .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(() => { + .subscribe((result) => { + if (result?.isNavigating) { + return; + } + this.fetchAccounts(); this.router.navigate(['.'], { relativeTo: this.route }); 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 45653ff80b..3362dc5d5d 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 @@ -2,7 +2,6 @@ import { IcsService } from '@ghostfolio/client/services/ics/ics.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; -import { CreateOrderDto, UpdateOrderDto } from '@ghostfolio/common/dtos'; import { downloadAsFile } from '@ghostfolio/common/helper'; import { Activity, @@ -10,6 +9,7 @@ import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { DateRange } from '@ghostfolio/common/types'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { GfFabComponent } from '@ghostfolio/ui/fab'; @@ -29,17 +29,12 @@ import { PageEvent } from '@angular/material/paginator'; import { MatSnackBarModule } from '@angular/material/snack-bar'; import { Sort, SortDirection } from '@angular/material/sort'; import { MatTableDataSource } from '@angular/material/table'; -import { ActivatedRoute, Router, RouterModule } from '@angular/router'; +import { Router, RouterModule } from '@angular/router'; import { format, parseISO } from 'date-fns'; import { DeviceDetectorService } from 'ngx-device-detector'; -import { of } from 'rxjs'; -import { map, switchMap } from 'rxjs/operators'; -import { GfCreateOrUpdateActivityDialogComponent } from './create-or-update-activity-dialog/create-or-update-activity-dialog.component'; -import { CreateOrUpdateActivityDialogParams } from './create-or-update-activity-dialog/interfaces/interfaces'; import { GfImportActivitiesDialogComponent } from './import-activities-dialog/import-activities-dialog.component'; import { ImportActivitiesDialogParams } from './import-activities-dialog/interfaces/interfaces'; -import { ActivitiesPageParams } from './interfaces/interfaces'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, @@ -59,6 +54,7 @@ export class GfActivitiesPageComponent implements OnInit { protected hasImpersonationId: boolean; protected hasPermissionToCreateActivity: boolean; protected hasPermissionToDeleteActivity: boolean; + protected readonly internalRoutes = internalRoutes; protected pageIndex = 0; protected readonly pageSize = DEFAULT_PAGE_SIZE; protected sortColumn = 'date'; @@ -77,37 +73,9 @@ export class GfActivitiesPageComponent implements OnInit { private readonly impersonationStorageService = inject( ImpersonationStorageService ); - private readonly route = inject(ActivatedRoute); private readonly router = inject(Router); private readonly userService = inject(UserService); - public constructor() { - this.route.queryParams - .pipe( - takeUntilDestroyed(this.destroyRef), - switchMap((params: ActivitiesPageParams) => { - if (params.activityId && (params.createDialog || params.editDialog)) { - return this.dataService - .fetchActivity(params.activityId) - .pipe(map((activity) => ({ activity, params }))); - } - - return of({ params, activity: undefined }); - }) - ) - .subscribe(({ activity, params }) => { - if (params.createDialog) { - this.openCreateActivityDialog(activity); - } else if (params.editDialog) { - if (activity) { - this.openUpdateActivityDialog(activity); - } else { - this.router.navigate(['.'], { relativeTo: this.route }); - } - } - }); - } - public ngOnInit() { this.deviceType = this.deviceDetectorService.getDeviceInfo().deviceType; @@ -149,10 +117,6 @@ export class GfActivitiesPageComponent implements OnInit { }); } - protected onCloneActivity(aActivity: Activity) { - this.openCreateActivityDialog(aActivity); - } - protected onDeleteActivities() { this.dataService .deleteActivities({ @@ -308,12 +272,6 @@ export class GfActivitiesPageComponent implements OnInit { this.fetchActivities(); } - protected onUpdateActivity(aActivity: Activity) { - this.router.navigate([], { - queryParams: { activityId: aActivity.id, editDialog: true } - }); - } - private fetchActivities() { // Reset dataSource and totalItems to show loading state this.dataSource = undefined; @@ -343,48 +301,16 @@ export class GfActivitiesPageComponent implements OnInit { this.hasPermissionToCreateActivity && this.user?.activitiesCount === 0 ) { - this.router.navigate([], { queryParams: { createDialog: true } }); + void this.router.navigate( + internalRoutes.portfolio.subRoutes.activities.subRoutes.create + .routerLink + ); } this.changeDetectorRef.markForCheck(); }); } - private openUpdateActivityDialog(aActivity: Activity) { - const dialogRef = this.dialog.open< - GfCreateOrUpdateActivityDialogComponent, - CreateOrUpdateActivityDialogParams - >(GfCreateOrUpdateActivityDialogComponent, { - data: { - activity: aActivity, - accounts: this.user?.accounts, - user: this.user - }, - height: this.deviceType === 'mobile' ? '98vh' : '80vh', - width: this.deviceType === 'mobile' ? '100vw' : '50rem' - }); - - dialogRef - .afterClosed() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((activity: UpdateOrderDto) => { - if (activity) { - this.dataService - .putActivity(activity) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe({ - next: () => { - this.fetchActivities(); - - this.changeDetectorRef.markForCheck(); - } - }); - } - - this.router.navigate(['.'], { relativeTo: this.route }); - }); - } - private isCalendarYear(dateRange?: DateRange) { if (!dateRange) { return false; @@ -393,59 +319,6 @@ export class GfActivitiesPageComponent implements OnInit { return /^\d{4}$/.test(dateRange); } - private openCreateActivityDialog(aActivity?: Activity) { - this.userService - .get() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((user) => { - this.updateUser(user); - - const dialogRef = this.dialog.open< - GfCreateOrUpdateActivityDialogComponent, - CreateOrUpdateActivityDialogParams - >(GfCreateOrUpdateActivityDialogComponent, { - data: { - accounts: this.user?.accounts, - activity: { - ...aActivity, - accountId: aActivity?.accountId, - assetProfile: aActivity?.assetProfile ?? null, - date: new Date(), - id: null, - fee: 0, - type: aActivity?.type ?? 'BUY', - unitPrice: null - }, - user: this.user - } satisfies CreateOrUpdateActivityDialogParams, - height: this.deviceType === 'mobile' ? '98vh' : '80vh', - width: this.deviceType === 'mobile' ? '100vw' : '50rem' - }); - - dialogRef - .afterClosed() - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((transaction: CreateOrderDto | null) => { - if (transaction) { - this.dataService.postActivity(transaction).subscribe({ - next: () => { - this.userService - .get(true) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(); - - this.fetchActivities(); - - this.changeDetectorRef.markForCheck(); - } - }); - } - - this.router.navigate(['.'], { relativeTo: this.route }); - }); - }); - } - private updateUser(aUser: User) { this.user = aUser; diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page.html b/apps/client/src/app/pages/portfolio/activities/activities-page.html index 23e0cef022..c69437742e 100644 --- a/apps/client/src/app/pages/portfolio/activities/activities-page.html +++ b/apps/client/src/app/pages/portfolio/activities/activities-page.html @@ -25,8 +25,6 @@ (activitiesDeleted)="onDeleteActivities()" (activityClicked)="onClickActivity($event)" (activityDeleted)="onDeleteActivity($event)" - (activityToClone)="onCloneActivity($event)" - (activityToUpdate)="onUpdateActivity($event)" (export)="onExport()" (exportDrafts)="onExportDrafts($event)" (import)="onImport()" @@ -43,6 +41,13 @@ hasPermissionToCreateActivity && !user.settings.isRestrictedView ) { - + } + + 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 c96c8a5588..f21f23ba46 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 @@ -4,10 +4,39 @@ import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { Routes } from '@angular/router'; import { GfActivitiesPageComponent } from './activities-page.component'; +import { GfActivityDialogHostComponent } from './activity-dialog-host/activity-dialog-host.component'; + +const { clone, create, update } = + internalRoutes.portfolio.subRoutes.activities.subRoutes; export const routes: Routes = [ { canActivate: [AuthGuard], + children: [ + { + component: GfActivityDialogHostComponent, + data: { mode: 'create' }, + path: create.path, + title: create.title + }, + { + children: [ + { + component: GfActivityDialogHostComponent, + data: { mode: 'clone' }, + path: clone.path, + title: clone.title + }, + { + component: GfActivityDialogHostComponent, + data: { mode: 'update' }, + path: update.path, + title: update.title + } + ], + path: ':activityId' + } + ], component: GfActivitiesPageComponent, path: '', title: internalRoutes.portfolio.subRoutes.activities.title diff --git a/apps/client/src/app/pages/portfolio/activities/activity-dialog-host/activity-dialog-host.component.ts b/apps/client/src/app/pages/portfolio/activities/activity-dialog-host/activity-dialog-host.component.ts new file mode 100644 index 0000000000..e0e3fc9509 --- /dev/null +++ b/apps/client/src/app/pages/portfolio/activities/activity-dialog-host/activity-dialog-host.component.ts @@ -0,0 +1,169 @@ +import { UserService } from '@ghostfolio/client/services/user/user.service'; +import { CreateOrderDto, UpdateOrderDto } from '@ghostfolio/common/dtos'; +import { Activity, User } from '@ghostfolio/common/interfaces'; +import { internalRoutes } from '@ghostfolio/common/routes/routes'; +import { DataService } from '@ghostfolio/ui/services'; + +import { + ChangeDetectionStrategy, + Component, + DestroyRef, + OnDestroy, + OnInit, + inject +} from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { MatDialog, MatDialogRef } from '@angular/material/dialog'; +import { ActivatedRoute, Router } from '@angular/router'; +import { DeviceDetectorService } from 'ngx-device-detector'; +import { Observable, of } from 'rxjs'; +import { map, switchMap } from 'rxjs/operators'; + +import { GfCreateOrUpdateActivityDialogComponent } from '../create-or-update-activity-dialog/create-or-update-activity-dialog.component'; +import { CreateOrUpdateActivityDialogParams } from '../create-or-update-activity-dialog/interfaces/interfaces'; +import { ActivityDialogMode } from './types/activity-dialog-mode.type'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 'gf-activity-dialog-host', + template: '' +}) +export class GfActivityDialogHostComponent implements OnDestroy, OnInit { + private dialogRef: MatDialogRef; + + private readonly dataService = inject(DataService); + private readonly destroyRef = inject(DestroyRef); + private readonly deviceDetectorService = inject(DeviceDetectorService); + private readonly dialog = inject(MatDialog); + private readonly route = inject(ActivatedRoute); + private readonly router = inject(Router); + private readonly userService = inject(UserService); + + public ngOnInit() { + const mode = this.route.snapshot.data.mode as ActivityDialogMode; + const activityId = this.route.snapshot.paramMap.get('activityId'); + + const activity$: Observable = activityId + ? this.dataService.fetchActivity(activityId) + : of(undefined); + + this.userService + .get() + .pipe( + switchMap((user) => { + return activity$.pipe( + map((activity) => { + return { activity, user }; + }) + ); + }), + takeUntilDestroyed(this.destroyRef) + ) + .subscribe({ + error: () => { + this.navigateBack(); + }, + next: ({ activity, user }) => { + if (mode === 'update') { + if (!activity) { + this.navigateBack(); + + return; + } + + this.openDialog({ activity, user, isUpdate: true }); + + return; + } + + if (mode === 'clone' && !activity) { + this.navigateBack(); + + return; + } + + this.openDialog({ + user, + activity: { + ...activity, + accountId: activity?.accountId, + assetProfile: activity?.assetProfile ?? null, + date: new Date(), + fee: 0, + id: null, + type: activity?.type ?? 'BUY', + unitPrice: null + }, + isUpdate: false + }); + } + }); + } + + public ngOnDestroy() { + // The dialog lives in an overlay outside of this component, so it needs to + // be closed explicitly when leaving the route (for example via the browser + // navigation) + this.dialogRef?.close(); + } + + private navigateBack() { + void this.router.navigate( + internalRoutes.portfolio.subRoutes.activities.routerLink + ); + } + + private openDialog({ + activity, + isUpdate, + user + }: { + activity: CreateOrUpdateActivityDialogParams['activity']; + isUpdate: boolean; + user: User; + }) { + const deviceType = this.deviceDetectorService.getDeviceInfo().deviceType; + + this.dialogRef = this.dialog.open< + GfCreateOrUpdateActivityDialogComponent, + CreateOrUpdateActivityDialogParams + >(GfCreateOrUpdateActivityDialogComponent, { + data: { + activity, + user, + accounts: user?.accounts + }, + height: deviceType === 'mobile' ? '98vh' : '80vh', + width: deviceType === 'mobile' ? '100vw' : '50rem' + }); + + this.dialogRef + .afterClosed() + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe((result: CreateOrderDto | UpdateOrderDto | null) => { + if (!result) { + this.navigateBack(); + + return; + } + + const request$: Observable = isUpdate + ? this.dataService.putActivity(result as UpdateOrderDto) + : this.dataService.postActivity(result as CreateOrderDto); + + request$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe({ + error: () => { + this.navigateBack(); + }, + next: () => { + // Deliberately not bound to the destroy reference: navigating back + // destroys this component and the refreshed user is what makes the + // activities page reload its data + this.userService.get(true).subscribe(); + + this.navigateBack(); + } + }); + }); + } +} diff --git a/apps/client/src/app/pages/portfolio/activities/activity-dialog-host/types/activity-dialog-mode.type.ts b/apps/client/src/app/pages/portfolio/activities/activity-dialog-host/types/activity-dialog-mode.type.ts new file mode 100644 index 0000000000..03d6305a57 --- /dev/null +++ b/apps/client/src/app/pages/portfolio/activities/activity-dialog-host/types/activity-dialog-mode.type.ts @@ -0,0 +1 @@ +export type ActivityDialogMode = 'clone' | 'create' | 'update'; diff --git a/apps/client/src/app/pages/portfolio/activities/interfaces/interfaces.ts b/apps/client/src/app/pages/portfolio/activities/interfaces/interfaces.ts deleted file mode 100644 index 51f240cb58..0000000000 --- a/apps/client/src/app/pages/portfolio/activities/interfaces/interfaces.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Params } from '@angular/router'; - -export interface ActivitiesPageParams extends Params { - activityId?: string; - createDialog?: string; - editDialog?: string; -} 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 f1dfed942a..52f051e779 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 @@ -1,5 +1,8 @@ import { GfAccountDetailDialogComponent } from '@ghostfolio/client/components/account-detail-dialog/account-detail-dialog.component'; -import { AccountDetailDialogParams } from '@ghostfolio/client/components/account-detail-dialog/interfaces/interfaces'; +import { + AccountDetailDialogParams, + AccountDetailDialogResult +} from '@ghostfolio/client/components/account-detail-dialog/interfaces/interfaces'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { MAX_TOP_HOLDINGS, UNKNOWN_KEY } from '@ghostfolio/common/config'; @@ -604,7 +607,8 @@ export class GfAllocationsPageComponent implements OnInit { private openAccountDetailDialog(aAccountId: string) { const dialogRef = this.dialog.open< GfAccountDetailDialogComponent, - AccountDetailDialogParams + AccountDetailDialogParams, + AccountDetailDialogResult >(GfAccountDetailDialogComponent, { autoFocus: false, data: { @@ -623,7 +627,11 @@ export class GfAllocationsPageComponent implements OnInit { dialogRef .afterClosed() .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(() => { + .subscribe((result) => { + if (result?.isNavigating) { + return; + } + void this.router.navigate(['.'], { relativeTo: this.route }); }); } diff --git a/libs/common/src/lib/routes/interfaces/internal-route.interface.ts b/libs/common/src/lib/routes/interfaces/internal-route.interface.ts index 8240db46ae..14538bb8eb 100644 --- a/libs/common/src/lib/routes/interfaces/internal-route.interface.ts +++ b/libs/common/src/lib/routes/interfaces/internal-route.interface.ts @@ -3,7 +3,7 @@ import { User } from '@ghostfolio/common/interfaces'; export interface InternalRoute { excludeFromAssistant?: boolean | ((aUser: User) => boolean); path?: string; - routerLink: string[]; + routerLink: string[] | ((...aParams: string[]) => string[]); subRoutes?: Record; title?: string; } diff --git a/libs/common/src/lib/routes/routes.ts b/libs/common/src/lib/routes/routes.ts index 8132520fc0..86cb2480b8 100644 --- a/libs/common/src/lib/routes/routes.ts +++ b/libs/common/src/lib/routes/routes.ts @@ -125,6 +125,27 @@ export const internalRoutes = { activities: { path: 'activities', routerLink: ['/portfolio', 'activities'], + subRoutes: { + clone: { + path: 'clone', + routerLink: (aActivityId: string) => { + return ['/portfolio', 'activities', aActivityId, 'clone']; + }, + title: $localize`Clone Activity` + }, + create: { + path: 'create', + routerLink: ['/portfolio', 'activities', 'create'], + title: $localize`Add Activity` + }, + update: { + path: 'update', + routerLink: (aActivityId: string) => { + return ['/portfolio', 'activities', aActivityId, 'update']; + }, + title: $localize`Update Activity` + } + }, title: $localize`Activities` }, allocations: { 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 172059d1c2..2266e758b3 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.html +++ b/libs/ui/src/lib/activities-table/activities-table.component.html @@ -476,18 +476,24 @@ } - - + } diff --git a/libs/ui/src/lib/value/value.component.ts b/libs/ui/src/lib/value/value.component.ts index dffcb89e7e..494f7a347c 100644 --- a/libs/ui/src/lib/value/value.component.ts +++ b/libs/ui/src/lib/value/value.component.ts @@ -13,13 +13,14 @@ import { input, Input, OnChanges, + OnDestroy, ViewChild } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MatSnackBar } from '@angular/material/snack-bar'; import { IonIcon } from '@ionic/angular/standalone'; import { addIcons } from 'ionicons'; -import { copyOutline } from 'ionicons/icons'; +import { checkmarkOutline, copyOutline } from 'ionicons/icons'; import { isNumber } from 'lodash'; import ms from 'ms'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; @@ -32,7 +33,7 @@ import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; styleUrls: ['./value.component.scss'], templateUrl: './value.component.html' }) -export class GfValueComponent implements AfterViewInit, OnChanges { +export class GfValueComponent implements AfterViewInit, OnChanges, OnDestroy { @Input() colorizeSign = false; @Input() deviceType: string; @Input() enableCopyToClipboardButton = false; @@ -54,22 +55,29 @@ export class GfValueComponent implements AfterViewInit, OnChanges { public absoluteValue = 0; public formattedValue = ''; public hasLabel = false; + public isCopied = false; public isNumber = false; public isString = false; public useAbsoluteValue = false; + public readonly copiedTitle = $localize`The value has been copied to the clipboard`; + public readonly copyToClipboardTitle = $localize`Copy to clipboard`; + public constructor( private changeDetectorRef: ChangeDetectorRef, private clipboard: Clipboard, private snackBar: MatSnackBar ) { addIcons({ + checkmarkOutline, copyOutline }); } public readonly precision = input(); + private copyToClipboardTimeout: ReturnType; + private readonly formatOptions = computed(() => { const digits = this.hasPrecision ? this.precision() : 2; @@ -178,6 +186,18 @@ export class GfValueComponent implements AfterViewInit, OnChanges { public onCopyValueToClipboard() { this.clipboard.copy(String(this.value)); + this.isCopied = true; + + if (this.copyToClipboardTimeout) { + clearTimeout(this.copyToClipboardTimeout); + } + + this.copyToClipboardTimeout = setTimeout(() => { + this.isCopied = false; + + this.changeDetectorRef.markForCheck(); + }, ms('3 seconds')); + this.snackBar.open( '✅ ' + $localize`${this.value} has been copied to the clipboard`, undefined, @@ -187,12 +207,23 @@ export class GfValueComponent implements AfterViewInit, OnChanges { ); } + public ngOnDestroy() { + if (this.copyToClipboardTimeout) { + clearTimeout(this.copyToClipboardTimeout); + } + } + private initializeVariables() { this.absoluteValue = 0; this.formattedValue = ''; + this.isCopied = false; this.isNumber = false; this.isString = false; this.locale = this.locale || getLocale(); this.useAbsoluteValue = false; + + if (this.copyToClipboardTimeout) { + clearTimeout(this.copyToClipboardTimeout); + } } } From b888134056d7a17d0de1fb7987c37b62904cca3a Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Sat, 18 Jul 2026 14:59:45 +0700 Subject: [PATCH 15/54] Task/improve type safety in statistics gathering and tag services (#7328) * feat(api): create interface for BetterStack update SLA response * fix(api): resolve type errors * fix(api): resolve type errors in tag service --- .../interfaces/interfaces.ts | 7 +++ .../statistics-gathering.processor.ts | 46 ++++++++----------- apps/api/src/services/tag/tag.service.ts | 2 +- 3 files changed, 27 insertions(+), 28 deletions(-) create mode 100644 apps/api/src/services/queues/statistics-gathering/interfaces/interfaces.ts diff --git a/apps/api/src/services/queues/statistics-gathering/interfaces/interfaces.ts b/apps/api/src/services/queues/statistics-gathering/interfaces/interfaces.ts new file mode 100644 index 0000000000..3c316720f3 --- /dev/null +++ b/apps/api/src/services/queues/statistics-gathering/interfaces/interfaces.ts @@ -0,0 +1,7 @@ +export interface BetterStackUptimeSlaResponse { + data: { + attributes: { + availability: number; + }; + }; +} diff --git a/apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts b/apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts index 82f362d258..21d009805d 100644 --- a/apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts +++ b/apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts @@ -25,6 +25,14 @@ import { Injectable, Logger } from '@nestjs/common'; import * as cheerio from 'cheerio'; import { format, subDays } from 'date-fns'; +import { BetterStackUptimeSlaResponse } from './interfaces/interfaces'; + +const GATHER_STATISTICS_CONCURRENCY = parseInt( + process.env.PROCESSOR_GATHER_STATISTICS_CONCURRENCY ?? + DEFAULT_PROCESSOR_GATHER_STATISTICS_CONCURRENCY.toString(), + 10 +); + @Injectable() @Processor(STATISTICS_GATHERING_QUEUE) export class StatisticsGatheringProcessor { @@ -37,11 +45,7 @@ export class StatisticsGatheringProcessor { ) {} @Process({ - concurrency: parseInt( - process.env.PROCESSOR_GATHER_STATISTICS_CONCURRENCY ?? - DEFAULT_PROCESSOR_GATHER_STATISTICS_CONCURRENCY.toString(), - 10 - ), + concurrency: GATHER_STATISTICS_CONCURRENCY, name: GATHER_STATISTICS_DOCKER_HUB_PULLS_PROCESS_JOB_NAME }) public async gatherDockerHubPullsStatistics() { @@ -58,11 +62,7 @@ export class StatisticsGatheringProcessor { } @Process({ - concurrency: parseInt( - process.env.PROCESSOR_GATHER_STATISTICS_CONCURRENCY ?? - DEFAULT_PROCESSOR_GATHER_STATISTICS_CONCURRENCY.toString(), - 10 - ), + concurrency: GATHER_STATISTICS_CONCURRENCY, name: GATHER_STATISTICS_GITHUB_CONTRIBUTORS_PROCESS_JOB_NAME }) public async gatherGitHubContributorsStatistics() { @@ -83,11 +83,7 @@ export class StatisticsGatheringProcessor { } @Process({ - concurrency: parseInt( - process.env.PROCESSOR_GATHER_STATISTICS_CONCURRENCY ?? - DEFAULT_PROCESSOR_GATHER_STATISTICS_CONCURRENCY.toString(), - 10 - ), + concurrency: GATHER_STATISTICS_CONCURRENCY, name: GATHER_STATISTICS_GITHUB_STARGAZERS_PROCESS_JOB_NAME }) public async gatherGitHubStargazersStatistics() { @@ -106,11 +102,7 @@ export class StatisticsGatheringProcessor { } @Process({ - concurrency: parseInt( - process.env.PROCESSOR_GATHER_STATISTICS_CONCURRENCY ?? - DEFAULT_PROCESSOR_GATHER_STATISTICS_CONCURRENCY.toString(), - 10 - ), + concurrency: GATHER_STATISTICS_CONCURRENCY, name: GATHER_STATISTICS_UPTIME_PROCESS_JOB_NAME }) public async gatherUptimeStatistics() { @@ -140,14 +132,14 @@ export class StatisticsGatheringProcessor { private async countDockerHubPulls(): Promise { try { - const { pull_count } = (await this.fetchService + const { pull_count } = await this.fetchService .fetch('https://hub.docker.com/v2/repositories/ghostfolio/ghostfolio', { headers: { 'User-Agent': 'request' }, signal: AbortSignal.timeout( this.configurationService.get('REQUEST_TIMEOUT') ) }) - .then((res) => res.json())) as { pull_count: number }; + .then<{ pull_count: number }>((res) => res.json()); return pull_count; } catch (error) { @@ -157,7 +149,7 @@ export class StatisticsGatheringProcessor { } } - private async countGitHubContributors(): Promise { + private async countGitHubContributors(): Promise { try { const body = await this.fetchService .fetch('https://github.com/ghostfolio/ghostfolio', { @@ -189,14 +181,14 @@ export class StatisticsGatheringProcessor { private async countGitHubStargazers(): Promise { try { - const { stargazers_count } = (await this.fetchService + const { stargazers_count } = await this.fetchService .fetch('https://api.github.com/repos/ghostfolio/ghostfolio', { headers: { 'User-Agent': 'request' }, signal: AbortSignal.timeout( this.configurationService.get('REQUEST_TIMEOUT') ) }) - .then((res) => res.json())) as { stargazers_count: number }; + .then<{ stargazers_count: number }>((res) => res.json()); return stargazers_count; } catch (error) { @@ -213,7 +205,7 @@ export class StatisticsGatheringProcessor { `https://uptime.betterstack.com/api/v2/monitors/${monitorId}/sla?from=${format( subDays(new Date(), 90), DATE_FORMAT - )}&to${format(new Date(), DATE_FORMAT)}`, + )}&to=${format(new Date(), DATE_FORMAT)}`, { headers: { [HEADER_KEY_TOKEN]: `Bearer ${this.configurationService.get( @@ -225,7 +217,7 @@ export class StatisticsGatheringProcessor { ) } ) - .then((res) => res.json()); + .then((res) => res.json()); return data.attributes.availability / 100; } catch (error) { diff --git a/apps/api/src/services/tag/tag.service.ts b/apps/api/src/services/tag/tag.service.ts index 38fb90a696..de052f9a1f 100644 --- a/apps/api/src/services/tag/tag.service.ts +++ b/apps/api/src/services/tag/tag.service.ts @@ -20,7 +20,7 @@ export class TagService { public async getTag( tagWhereUniqueInput: Prisma.TagWhereUniqueInput - ): Promise { + ): Promise { return this.prismaService.tag.findUnique({ where: tagWhereUniqueInput }); From 3276cb82c090f90c6439e311fd91dd6126558400 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 18 Jul 2026 10:02:38 +0200 Subject: [PATCH 16/54] Task/update locales (#7366) Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.ca.xlf | 10 +++++++--- apps/client/src/locales/messages.de.xlf | 10 +++++++--- apps/client/src/locales/messages.es.xlf | 10 +++++++--- apps/client/src/locales/messages.fr.xlf | 10 +++++++--- apps/client/src/locales/messages.it.xlf | 10 +++++++--- apps/client/src/locales/messages.ja.xlf | 10 +++++++--- apps/client/src/locales/messages.ko.xlf | 10 +++++++--- apps/client/src/locales/messages.nl.xlf | 10 +++++++--- apps/client/src/locales/messages.pl.xlf | 10 +++++++--- apps/client/src/locales/messages.pt.xlf | 10 +++++++--- apps/client/src/locales/messages.tr.xlf | 10 +++++++--- apps/client/src/locales/messages.uk.xlf | 10 +++++++--- apps/client/src/locales/messages.xlf | 10 +++++++--- apps/client/src/locales/messages.zh.xlf | 10 +++++++--- 14 files changed, 98 insertions(+), 42 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index bed80cfe5f..aa1734e324 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -2545,6 +2545,10 @@ libs/ui/src/lib/notifications/alert-dialog/alert-dialog.component.ts 46 + + libs/ui/src/lib/value/value.component.ts + 63 + Grant access @@ -5263,8 +5267,8 @@ 88 - libs/ui/src/lib/value/value.component.html - 18 + libs/ui/src/lib/value/value.component.ts + 64 @@ -7201,7 +7205,7 @@ libs/ui/src/lib/value/value.component.ts - 182 + 202 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index a442126694..1aa95c70f7 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -1432,6 +1432,10 @@ libs/ui/src/lib/notifications/alert-dialog/alert-dialog.component.ts 46 + + libs/ui/src/lib/value/value.component.ts + 63 + Grant access @@ -2353,8 +2357,8 @@ 88 - libs/ui/src/lib/value/value.component.html - 18 + libs/ui/src/lib/value/value.component.ts + 64 @@ -7225,7 +7229,7 @@ libs/ui/src/lib/value/value.component.ts - 182 + 202 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index e05655a981..81f5ce42e6 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -1417,6 +1417,10 @@ libs/ui/src/lib/notifications/alert-dialog/alert-dialog.component.ts 46 + + libs/ui/src/lib/value/value.component.ts + 63 + Grant access @@ -2338,8 +2342,8 @@ 88 - libs/ui/src/lib/value/value.component.html - 18 + libs/ui/src/lib/value/value.component.ts + 64 @@ -7202,7 +7206,7 @@ libs/ui/src/lib/value/value.component.ts - 182 + 202 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 565f18227b..3637a997f4 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -1800,6 +1800,10 @@ libs/ui/src/lib/notifications/alert-dialog/alert-dialog.component.ts 46 + + libs/ui/src/lib/value/value.component.ts + 63 + Grant access @@ -2857,8 +2861,8 @@ 88 - libs/ui/src/lib/value/value.component.html - 18 + libs/ui/src/lib/value/value.component.ts + 64 @@ -7201,7 +7205,7 @@ libs/ui/src/lib/value/value.component.ts - 182 + 202 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 2735f2d574..26f5752c84 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -1417,6 +1417,10 @@ libs/ui/src/lib/notifications/alert-dialog/alert-dialog.component.ts 46 + + libs/ui/src/lib/value/value.component.ts + 63 + Grant access @@ -2338,8 +2342,8 @@ 88 - libs/ui/src/lib/value/value.component.html - 18 + libs/ui/src/lib/value/value.component.ts + 64 @@ -7202,7 +7206,7 @@ libs/ui/src/lib/value/value.component.ts - 182 + 202 diff --git a/apps/client/src/locales/messages.ja.xlf b/apps/client/src/locales/messages.ja.xlf index 538c9f7902..f584352a48 100644 --- a/apps/client/src/locales/messages.ja.xlf +++ b/apps/client/src/locales/messages.ja.xlf @@ -2342,6 +2342,10 @@ libs/ui/src/lib/notifications/alert-dialog/alert-dialog.component.ts 46 + + libs/ui/src/lib/value/value.component.ts + 63 + Grant access @@ -4863,8 +4867,8 @@ 88 - libs/ui/src/lib/value/value.component.html - 18 + libs/ui/src/lib/value/value.component.ts + 64 @@ -7242,7 +7246,7 @@ libs/ui/src/lib/value/value.component.ts - 182 + 202 diff --git a/apps/client/src/locales/messages.ko.xlf b/apps/client/src/locales/messages.ko.xlf index 6ef1b7fd5b..6793e720ea 100644 --- a/apps/client/src/locales/messages.ko.xlf +++ b/apps/client/src/locales/messages.ko.xlf @@ -2342,6 +2342,10 @@ libs/ui/src/lib/notifications/alert-dialog/alert-dialog.component.ts 46 + + libs/ui/src/lib/value/value.component.ts + 63 + Grant access @@ -4855,8 +4859,8 @@ 88 - libs/ui/src/lib/value/value.component.html - 18 + libs/ui/src/lib/value/value.component.ts + 64 @@ -7242,7 +7246,7 @@ libs/ui/src/lib/value/value.component.ts - 182 + 202 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 98fa880799..1f70d55182 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -1416,6 +1416,10 @@ libs/ui/src/lib/notifications/alert-dialog/alert-dialog.component.ts 46 + + libs/ui/src/lib/value/value.component.ts + 63 + Grant access @@ -2337,8 +2341,8 @@ 88 - libs/ui/src/lib/value/value.component.html - 18 + libs/ui/src/lib/value/value.component.ts + 64 @@ -7201,7 +7205,7 @@ libs/ui/src/lib/value/value.component.ts - 182 + 202 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 026d669747..5d18539aa3 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -2309,6 +2309,10 @@ libs/ui/src/lib/notifications/alert-dialog/alert-dialog.component.ts 46 + + libs/ui/src/lib/value/value.component.ts + 63 + Grant access @@ -4822,8 +4826,8 @@ 88 - libs/ui/src/lib/value/value.component.html - 18 + libs/ui/src/lib/value/value.component.ts + 64 @@ -7201,7 +7205,7 @@ libs/ui/src/lib/value/value.component.ts - 182 + 202 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index c68fd5da44..80f351a930 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -1800,6 +1800,10 @@ libs/ui/src/lib/notifications/alert-dialog/alert-dialog.component.ts 46 + + libs/ui/src/lib/value/value.component.ts + 63 + Grant access @@ -2785,8 +2789,8 @@ 88 - libs/ui/src/lib/value/value.component.html - 18 + libs/ui/src/lib/value/value.component.ts + 64 @@ -7201,7 +7205,7 @@ libs/ui/src/lib/value/value.component.ts - 182 + 202 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index b2a1fd72a2..85a1ce506d 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -4246,8 +4246,8 @@ 88 - libs/ui/src/lib/value/value.component.html - 18 + libs/ui/src/lib/value/value.component.ts + 64 @@ -4574,6 +4574,10 @@ libs/ui/src/lib/notifications/alert-dialog/alert-dialog.component.ts 46 + + libs/ui/src/lib/value/value.component.ts + 63 + Grant access @@ -7201,7 +7205,7 @@ libs/ui/src/lib/value/value.component.ts - 182 + 202 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 6e07590bb8..953b05b35c 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -2773,6 +2773,10 @@ libs/ui/src/lib/notifications/alert-dialog/alert-dialog.component.ts 46 + + libs/ui/src/lib/value/value.component.ts + 63 + Grant access @@ -5600,7 +5604,7 @@ libs/ui/src/lib/value/value.component.ts - 182 + 202 @@ -5679,8 +5683,8 @@ 88 - libs/ui/src/lib/value/value.component.html - 18 + libs/ui/src/lib/value/value.component.ts + 64 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index c1603bca8f..5e26a30cb0 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -2146,6 +2146,10 @@ libs/ui/src/lib/notifications/alert-dialog/alert-dialog.component.ts 46 + + libs/ui/src/lib/value/value.component.ts + 63 + Grant access @@ -4429,8 +4433,8 @@ 88 - libs/ui/src/lib/value/value.component.html - 18 + libs/ui/src/lib/value/value.component.ts + 64 @@ -6577,7 +6581,7 @@ libs/ui/src/lib/value/value.component.ts - 182 + 202 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 7cc82c8d31..be338019d9 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -2318,6 +2318,10 @@ libs/ui/src/lib/notifications/alert-dialog/alert-dialog.component.ts 46 + + libs/ui/src/lib/value/value.component.ts + 63 + Grant access @@ -4839,8 +4843,8 @@ 88 - libs/ui/src/lib/value/value.component.html - 18 + libs/ui/src/lib/value/value.component.ts + 64 @@ -7202,7 +7206,7 @@ libs/ui/src/lib/value/value.component.ts - 182 + 202 From 16394bb4f99d64ec1febf061ed32522331ad7a15 Mon Sep 17 00:00:00 2001 From: KDxGautam Date: Sat, 18 Jul 2026 13:35:19 +0530 Subject: [PATCH 17/54] Bugfix/hover styling of tags selector (#7359) * Fix hover styling of tags selector * Update changelog --- CHANGELOG.md | 4 ++++ .../src/lib/tags-selector/tags-selector.component.html | 10 ++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc7ba56262..90f1110d44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the language localization for German (`de`) - Upgraded `stripe` from version `22.2.3` to `22.3.2` +### Fixed + +- Fixed an issue with the delete button in the tags selector component + ## 3.28.0 - 2026-07-17 ### Changed diff --git a/libs/ui/src/lib/tags-selector/tags-selector.component.html b/libs/ui/src/lib/tags-selector/tags-selector.component.html index 92ea2b2106..4f9d82ae98 100644 --- a/libs/ui/src/lib/tags-selector/tags-selector.component.html +++ b/libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -32,13 +32,11 @@ } } @for (tag of tagsSelected(); track tag.id) { - + {{ tag.name }} - + } Date: Sat, 18 Jul 2026 10:07:57 +0200 Subject: [PATCH 18/54] Release 3.29.0 (#7368) --- 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 90f1110d44..f1d8ca3b6e 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 +## 3.29.0 - 2026-07-18 ### Added diff --git a/package-lock.json b/package-lock.json index adb5f9f9d0..ccd0388142 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "3.28.0", + "version": "3.29.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "3.28.0", + "version": "3.29.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 521d73d996..14d4f5f112 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "3.28.0", + "version": "3.29.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 37bd17d3c14fdc85abda987f3b18ee3ad77c51d1 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 18 Jul 2026 14:30:09 +0200 Subject: [PATCH 19/54] Task/simplify getHistorical() function response in data provider interface (#7369) * Simplify getHistorical() function response * Update changelog --- CHANGELOG.md | 6 ++++ .../ghostfolio/ghostfolio.service.ts | 4 +-- .../alpha-vantage/alpha-vantage.service.ts | 8 ++--- .../coingecko/coingecko.service.ts | 10 +++---- .../data-provider/data-provider.service.ts | 2 +- .../eod-historical-data.service.ts | 29 +++++++++---------- .../financial-modeling-prep.service.ts | 10 +++---- .../ghostfolio/ghostfolio.service.ts | 6 ++-- .../google-sheets/google-sheets.service.ts | 6 ++-- .../interfaces/data-provider.interface.ts | 4 +-- .../data-provider/manual/manual.service.ts | 17 +++++------ .../rapid-api/rapid-api.service.ts | 8 ++--- .../yahoo-finance/yahoo-finance.service.ts | 8 ++--- 13 files changed, 52 insertions(+), 66 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1d8ca3b6e..4e699e6cbb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Changed + +- Simplified the `getHistorical()` function response in the data provider interface + ## 3.29.0 - 2026-07-18 ### Added diff --git a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts index abbb5cbf67..2c22f0c10f 100644 --- a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts +++ b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts @@ -171,7 +171,7 @@ export class GhostfolioService { try { const promises: Promise<{ - [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; + [date: string]: DataProviderHistoricalResponse; }>[] = []; for (const dataProviderService of this.getDataProviderServices()) { @@ -185,7 +185,7 @@ export class GhostfolioService { to }) .then((historicalData) => { - result.historicalData = historicalData[symbol]; + result.historicalData = historicalData; return historicalData; }) diff --git a/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts b/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts index 40b45a115b..799f1280b6 100644 --- a/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts +++ b/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts @@ -70,7 +70,7 @@ export class AlphaVantageService symbol, to }: GetHistoricalParams): Promise<{ - [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; + [date: string]: DataProviderHistoricalResponse; }> { try { const historicalData: { @@ -83,11 +83,9 @@ export class AlphaVantageService ); const response: { - [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; + [date: string]: DataProviderHistoricalResponse; } = {}; - response[symbol] = {}; - for (const [key, timeSeries] of Object.entries( historicalData['Time Series (Digital Currency Daily)'] ).sort()) { @@ -95,7 +93,7 @@ export class AlphaVantageService isAfter(from, parse(key, DATE_FORMAT, new Date())) && isBefore(to, parse(key, DATE_FORMAT, new Date())) ) { - response[symbol][key] = { + response[key] = { marketPrice: parseFloat(timeSeries['4a. close (USD)']) }; } diff --git a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts index 5d6ed79aac..96bc00561a 100644 --- a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts +++ b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts @@ -115,7 +115,7 @@ export class CoinGeckoService implements DataProviderInterface, OnModuleInit { symbol, to }: GetHistoricalParams): Promise<{ - [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; + [date: string]: DataProviderHistoricalResponse; }> { try { const queryParams = new URLSearchParams({ @@ -143,13 +143,11 @@ export class CoinGeckoService implements DataProviderInterface, OnModuleInit { } const result: { - [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; - } = { - [symbol]: {} - }; + [date: string]: DataProviderHistoricalResponse; + } = {}; for (const [timestamp, marketPrice] of prices) { - result[symbol][format(fromUnixTime(timestamp / 1000), DATE_FORMAT)] = { + result[format(fromUnixTime(timestamp / 1000), DATE_FORMAT)] = { marketPrice }; } 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 35dc97d2fd..49f5f68f44 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -508,7 +508,7 @@ export class DataProviderService implements OnModuleInit { requestTimeout: ms('30 seconds') }) .then((data) => { - return { dataSource, symbol, data: data?.[symbol] }; + return { data, dataSource, symbol }; }) ); } diff --git a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts index ebb6cd743c..6bc003fc23 100644 --- a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts +++ b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts @@ -147,7 +147,7 @@ export class EodHistoricalDataService symbol, to }: GetHistoricalParams): Promise<{ - [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; + [date: string]: DataProviderHistoricalResponse; }> { symbol = this.convertToEodSymbol(symbol); @@ -166,22 +166,19 @@ export class EodHistoricalDataService }) .then((res) => res.json()); - return response.reduce( - (result, { adjusted_close, date }) => { - if (isNumber(adjusted_close)) { - result[this.convertFromEodSymbol(symbol)][date] = { - marketPrice: adjusted_close - }; - } else { - this.logger.error( - `Could not get historical market data for ${symbol} (${this.getName()}) at ${date}` - ); - } + return response.reduce((result, { adjusted_close, date }) => { + if (isNumber(adjusted_close)) { + result[date] = { + marketPrice: adjusted_close + }; + } else { + this.logger.error( + `Could not get historical market data for ${symbol} (${this.getName()}) at ${date}` + ); + } - return result; - }, - { [this.convertFromEodSymbol(symbol)]: {} } - ); + return result; + }, {}); } catch (error) { throw new Error( `Could not get historical market data for ${symbol} (${this.getName()}) from ${format( diff --git a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts index 4e3502033b..83e7fb6c2c 100644 --- a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts +++ b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts @@ -336,14 +336,12 @@ export class FinancialModelingPrepService symbol, to }: GetHistoricalParams): Promise<{ - [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; + [date: string]: DataProviderHistoricalResponse; }> { const MAX_YEARS_PER_REQUEST = 5; const result: { - [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; - } = { - [symbol]: {} - }; + [date: string]: DataProviderHistoricalResponse; + } = {}; let currentFrom = from; @@ -378,7 +376,7 @@ export class FinancialModelingPrepService isAfter(parseDate(date), currentFrom)) && isBefore(parseDate(date), currentTo) ) { - result[symbol][date] = { + result[date] = { marketPrice: close }; } diff --git a/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts b/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts index 81b997037b..5b59e9a006 100644 --- a/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts +++ b/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts @@ -172,7 +172,7 @@ export class GhostfolioService implements DataProviderInterface { symbol, to }: GetHistoricalParams): Promise<{ - [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; + [date: string]: DataProviderHistoricalResponse; }> { try { const queryParams = new URLSearchParams({ @@ -198,9 +198,7 @@ export class GhostfolioService implements DataProviderInterface { const { historicalData } = (await response.json()) as HistoricalResponse; - return { - [symbol]: historicalData - }; + return historicalData; } catch (error) { if (error?.status === StatusCodes.TOO_MANY_REQUESTS) { error.name = 'RequestError'; diff --git a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts index 13f671bd43..75fae673e9 100644 --- a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts +++ b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts @@ -60,7 +60,7 @@ export class GoogleSheetsService implements DataProviderInterface { symbol, to }: GetHistoricalParams): Promise<{ - [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; + [date: string]: DataProviderHistoricalResponse; }> { try { const sheet = await this.getSheet({ @@ -85,9 +85,7 @@ export class GoogleSheetsService implements DataProviderInterface { historicalData[format(date, DATE_FORMAT)] = { marketPrice: close }; }); - return { - [symbol]: historicalData - }; + return historicalData; } catch (error) { throw new Error( `Could not get historical market data for ${symbol} (${this.getName()}) from ${format( diff --git a/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts b/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts index 8c2fb64d8b..1e6d2496b0 100644 --- a/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts +++ b/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts @@ -35,8 +35,8 @@ export interface DataProviderInterface { symbol, to }: GetHistoricalParams): Promise<{ - [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; - }>; // TODO: Return only one symbol + [date: string]: DataProviderHistoricalResponse; + }>; getMarketDataOfMarkets?({ includeHistoricalData, diff --git a/apps/api/src/services/data-provider/manual/manual.service.ts b/apps/api/src/services/data-provider/manual/manual.service.ts index 66571c2397..a8cfa8b0b5 100644 --- a/apps/api/src/services/data-provider/manual/manual.service.ts +++ b/apps/api/src/services/data-provider/manual/manual.service.ts @@ -79,7 +79,7 @@ export class ManualService implements DataProviderInterface { symbol, to }: GetHistoricalParams): Promise<{ - [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; + [date: string]: DataProviderHistoricalResponse; }> { try { const [symbolProfile] = await this.symbolProfileService.getSymbolProfiles( @@ -90,14 +90,13 @@ export class ManualService implements DataProviderInterface { if (defaultMarketPrice) { const historical: { - [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; - } = { - [symbol]: {} - }; + [date: string]: DataProviderHistoricalResponse; + } = {}; + let date = from; while (isBefore(date, to)) { - historical[symbol][format(date, DATE_FORMAT)] = { + historical[format(date, DATE_FORMAT)] = { marketPrice: defaultMarketPrice }; @@ -115,10 +114,8 @@ export class ManualService implements DataProviderInterface { }); return { - [symbol]: { - [format(getYesterday(), DATE_FORMAT)]: { - marketPrice: value - } + [format(getYesterday(), DATE_FORMAT)]: { + marketPrice: value } }; } catch (error) { diff --git a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts index e704f28618..9af22b79a9 100644 --- a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts +++ b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts @@ -58,7 +58,7 @@ export class RapidApiService implements DataProviderInterface { symbol, to }: GetHistoricalParams): Promise<{ - [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; + [date: string]: DataProviderHistoricalResponse; }> { try { if (symbol === ghostfolioFearAndGreedIndexSymbolStocks) { @@ -66,10 +66,8 @@ export class RapidApiService implements DataProviderInterface { if (fgi) { return { - [symbol]: { - [format(getYesterday(), DATE_FORMAT)]: { - marketPrice: fgi.previousClose.value - } + [format(getYesterday(), DATE_FORMAT)]: { + marketPrice: fgi.previousClose.value } }; } diff --git a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts index 93949ebc05..52fb5d5a81 100644 --- a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts +++ b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts @@ -123,7 +123,7 @@ export class YahooFinanceService implements DataProviderInterface { symbol, to }: GetHistoricalParams): Promise<{ - [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; + [date: string]: DataProviderHistoricalResponse; }> { if (isSameDay(from, to)) { to = addDays(to, 1); @@ -144,13 +144,11 @@ export class YahooFinanceService implements DataProviderInterface { ); const response: { - [symbol: string]: { [date: string]: DataProviderHistoricalResponse }; + [date: string]: DataProviderHistoricalResponse; } = {}; - response[symbol] = {}; - for (const historicalItem of historicalResult) { - response[symbol][format(historicalItem.date, DATE_FORMAT)] = { + response[format(historicalItem.date, DATE_FORMAT)] = { marketPrice: historicalItem.close }; } From 11db199b9460e4fccd3954872d997bf18d52a3a5 Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Sat, 18 Jul 2026 21:28:56 +0700 Subject: [PATCH 20/54] Task/enforce noImplicitOverride TypeScript rule (#7355) * feat(ts): enable no implicit override * fix(api): resolve type errors * fix(client): resolve type errors * fix(ui): resolve type errors * fix(common): resolve type errors --- apps/api/src/guards/custom-throttler.guard.ts | 4 +++- .../rules/account-cluster-risk/current-investment.ts | 2 +- .../rules/account-cluster-risk/single-account.ts | 2 +- .../models/rules/asset-class-cluster-risk/equity.ts | 2 +- .../rules/asset-class-cluster-risk/fixed-income.ts | 2 +- .../base-currency-current-investment.ts | 2 +- .../currency-cluster-risk/current-investment.ts | 2 +- .../developed-markets.ts | 2 +- .../economic-market-cluster-risk/emerging-markets.ts | 2 +- .../rules/emergency-fund/emergency-fund-setup.ts | 2 +- .../rules/fees/fee-ratio-total-investment-volume.ts | 2 +- apps/api/src/models/rules/liquidity/buying-power.ts | 2 +- .../regional-market-cluster-risk/asia-pacific.ts | 2 +- .../regional-market-cluster-risk/emerging-markets.ts | 2 +- .../rules/regional-market-cluster-risk/europe.ts | 2 +- .../rules/regional-market-cluster-risk/japan.ts | 2 +- .../regional-market-cluster-risk/north-america.ts | 2 +- apps/client/src/app/adapter/custom-date-adapter.ts | 8 ++++---- .../create-asset-profile-with-market-data.dto.ts | 2 +- .../currency-selector/currency-selector.component.ts | 12 ++++++------ .../symbol-autocomplete.component.ts | 12 ++++++------ tsconfig.base.json | 2 +- 22 files changed, 37 insertions(+), 35 deletions(-) diff --git a/apps/api/src/guards/custom-throttler.guard.ts b/apps/api/src/guards/custom-throttler.guard.ts index c4f0e806d5..00a2ba087f 100644 --- a/apps/api/src/guards/custom-throttler.guard.ts +++ b/apps/api/src/guards/custom-throttler.guard.ts @@ -5,7 +5,9 @@ import { ThrottlerException, ThrottlerGuard } from '@nestjs/throttler'; export class CustomThrottlerGuard extends ThrottlerGuard { private readonly logger = new Logger(CustomThrottlerGuard.name); - public async canActivate(context: ExecutionContext): Promise { + public override async canActivate( + context: ExecutionContext + ): Promise { try { return await super.canActivate(context); } catch (error) { 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 400a2506f6..11727e118d 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 @@ -13,7 +13,7 @@ export class AccountClusterRiskCurrentInvestment extends Rule { private accounts: PortfolioDetails['accounts']; public constructor( - protected exchangeRateDataService: ExchangeRateDataService, + exchangeRateDataService: ExchangeRateDataService, private i18nService: I18nService, languageCode: string, accounts: PortfolioDetails['accounts'] 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 e4ee990648..75f0503163 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 @@ -11,7 +11,7 @@ export class AccountClusterRiskSingleAccount extends Rule { private accounts: PortfolioDetails['accounts']; public constructor( - protected exchangeRateDataService: ExchangeRateDataService, + exchangeRateDataService: ExchangeRateDataService, private i18nService: I18nService, languageCode: string, accounts: PortfolioDetails['accounts'] 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 12303fd927..ad5c820479 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 @@ -11,7 +11,7 @@ export class AssetClassClusterRiskEquity extends Rule { private holdings: PortfolioPosition[]; public constructor( - protected exchangeRateDataService: ExchangeRateDataService, + exchangeRateDataService: ExchangeRateDataService, private i18nService: I18nService, languageCode: string, holdings: PortfolioPosition[] 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 fd7c00f11b..3bc8984db3 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 @@ -11,7 +11,7 @@ export class AssetClassClusterRiskFixedIncome extends Rule { private holdings: PortfolioPosition[]; public constructor( - protected exchangeRateDataService: ExchangeRateDataService, + exchangeRateDataService: ExchangeRateDataService, private i18nService: I18nService, languageCode: string, holdings: PortfolioPosition[] 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 6890fecd60..96819e4d51 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 @@ -11,7 +11,7 @@ export class CurrencyClusterRiskBaseCurrencyCurrentInvestment extends Rule { private holdings: PortfolioPosition[]; public constructor( - protected exchangeRateDataService: ExchangeRateDataService, + exchangeRateDataService: ExchangeRateDataService, private i18nService: I18nService, holdings: PortfolioPosition[], languageCode: string 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 70f09f58cd..ffab8c4c65 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 @@ -8,7 +8,7 @@ export class EconomicMarketClusterRiskDevelopedMarkets extends Rule { private developedMarketsValueInBaseCurrency: number; public constructor( - protected exchangeRateDataService: ExchangeRateDataService, + exchangeRateDataService: ExchangeRateDataService, private i18nService: I18nService, currentValueInBaseCurrency: number, developedMarketsValueInBaseCurrency: number, 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 120c3f6a2c..6b834b52ae 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 @@ -8,7 +8,7 @@ export class EconomicMarketClusterRiskEmergingMarkets extends Rule { private emergingMarketsValueInBaseCurrency: number; public constructor( - protected exchangeRateDataService: ExchangeRateDataService, + exchangeRateDataService: ExchangeRateDataService, private i18nService: I18nService, currentValueInBaseCurrency: number, emergingMarketsValueInBaseCurrency: number, 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 fcbd99d54f..fc1d8b0c00 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 @@ -7,7 +7,7 @@ export class EmergencyFundSetup extends Rule { private emergencyFund: number; public constructor( - protected exchangeRateDataService: ExchangeRateDataService, + exchangeRateDataService: ExchangeRateDataService, private i18nService: I18nService, languageCode: string, emergencyFund: number 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 23f9076e85..8be31e6d4e 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 @@ -8,7 +8,7 @@ export class FeeRatioTotalInvestmentVolume extends Rule { private totalInvestmentVolumeInBaseCurrency: number; public constructor( - protected exchangeRateDataService: ExchangeRateDataService, + exchangeRateDataService: ExchangeRateDataService, private i18nService: I18nService, languageCode: string, totalInvestmentVolumeInBaseCurrency: number, diff --git a/apps/api/src/models/rules/liquidity/buying-power.ts b/apps/api/src/models/rules/liquidity/buying-power.ts index 7e8b96143e..83493aabf9 100644 --- a/apps/api/src/models/rules/liquidity/buying-power.ts +++ b/apps/api/src/models/rules/liquidity/buying-power.ts @@ -7,7 +7,7 @@ export class BuyingPower extends Rule { private buyingPower: number; public constructor( - protected exchangeRateDataService: ExchangeRateDataService, + exchangeRateDataService: ExchangeRateDataService, private i18nService: I18nService, buyingPower: number, languageCode: string 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 4723389b02..bf19fc7343 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 @@ -10,7 +10,7 @@ export class RegionalMarketClusterRiskAsiaPacific extends Rule { private currentValueInBaseCurrency: number; public constructor( - protected exchangeRateDataService: ExchangeRateDataService, + exchangeRateDataService: ExchangeRateDataService, private i18nService: I18nService, languageCode: string, currentValueInBaseCurrency: number, 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 d4695406ae..7f37abecd2 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 @@ -10,7 +10,7 @@ export class RegionalMarketClusterRiskEmergingMarkets extends Rule { private emergingMarketsValueInBaseCurrency: number; public constructor( - protected exchangeRateDataService: ExchangeRateDataService, + exchangeRateDataService: ExchangeRateDataService, private i18nService: I18nService, languageCode: string, currentValueInBaseCurrency: number, 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 c5cb4d134d..1e10c29bfb 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 @@ -10,7 +10,7 @@ export class RegionalMarketClusterRiskEurope extends Rule { private europeValueInBaseCurrency: number; public constructor( - protected exchangeRateDataService: ExchangeRateDataService, + exchangeRateDataService: ExchangeRateDataService, private i18nService: I18nService, languageCode: string, currentValueInBaseCurrency: number, 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 fc9ab92eec..22d6164450 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 @@ -10,7 +10,7 @@ export class RegionalMarketClusterRiskJapan extends Rule { private japanValueInBaseCurrency: number; public constructor( - protected exchangeRateDataService: ExchangeRateDataService, + exchangeRateDataService: ExchangeRateDataService, private i18nService: I18nService, languageCode: string, currentValueInBaseCurrency: number, 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 8bd3fb0cf1..aa88dac7b1 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 @@ -10,7 +10,7 @@ export class RegionalMarketClusterRiskNorthAmerica extends Rule { private northAmericaValueInBaseCurrency: number; public constructor( - protected exchangeRateDataService: ExchangeRateDataService, + exchangeRateDataService: ExchangeRateDataService, private i18nService: I18nService, languageCode: string, currentValueInBaseCurrency: number, diff --git a/apps/client/src/app/adapter/custom-date-adapter.ts b/apps/client/src/app/adapter/custom-date-adapter.ts index a1326b8238..5a7790b929 100644 --- a/apps/client/src/app/adapter/custom-date-adapter.ts +++ b/apps/client/src/app/adapter/custom-date-adapter.ts @@ -6,7 +6,7 @@ import { addYears, format, getYear, parse } from 'date-fns'; export class CustomDateAdapter extends NativeDateAdapter { public constructor( - @Inject(MAT_DATE_LOCALE) public locale: string, + @Inject(MAT_DATE_LOCALE) public override locale: string, @Inject(forwardRef(() => MAT_DATE_LOCALE)) matDateLocale: string ) { super(matDateLocale); @@ -15,21 +15,21 @@ export class CustomDateAdapter extends NativeDateAdapter { /** * Formats a date as a string */ - public format(aDate: Date): string { + public override format(aDate: Date): string { return format(aDate, getDateFormatString(this.locale)); } /** * Sets the first day of the week to Monday */ - public getFirstDayOfWeek(): number { + public override getFirstDayOfWeek(): number { return 1; } /** * Parses a date from a provided value */ - public parse(aValue: string): Date { + public override parse(aValue: string): Date { let date = parse(aValue, getDateFormatString(this.locale), new Date()); if (getYear(date) < 1900) { diff --git a/libs/common/src/lib/dtos/create-asset-profile-with-market-data.dto.ts b/libs/common/src/lib/dtos/create-asset-profile-with-market-data.dto.ts index 51ee716d3a..60afcb558b 100644 --- a/libs/common/src/lib/dtos/create-asset-profile-with-market-data.dto.ts +++ b/libs/common/src/lib/dtos/create-asset-profile-with-market-data.dto.ts @@ -9,7 +9,7 @@ export class CreateAssetProfileWithMarketDataDto extends CreateAssetProfileDto { @IsIn([DataSource.MANUAL], { message: `dataSource must be '${DataSource.MANUAL}'` }) - dataSource: DataSource; + override dataSource: DataSource; @IsArray() @IsOptional() 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 7b6236fbbc..724e867128 100644 --- a/libs/ui/src/lib/currency-selector/currency-selector.component.ts +++ b/libs/ui/src/lib/currency-selector/currency-selector.component.ts @@ -75,22 +75,22 @@ export class GfCurrencySelectorComponent private readonly input = viewChild.required(MatInput); public constructor( - public readonly _elementRef: ElementRef, - public readonly _focusMonitor: FocusMonitor, + public override readonly _elementRef: ElementRef, + public override readonly _focusMonitor: FocusMonitor, public readonly changeDetectorRef: ChangeDetectorRef, private readonly formGroupDirective: FormGroupDirective, - public readonly ngControl: NgControl + public override readonly ngControl: NgControl ) { super(_elementRef, _focusMonitor, ngControl); this.controlType = 'currency-selector'; } - public get empty() { + public override get empty() { return this.input().empty; } - public set value(value: string | null) { + public override set value(value: string | null) { this.control.setValue(value); super.value = value; } @@ -138,7 +138,7 @@ export class GfCurrencySelectorComponent }); } - public ngDoCheck() { + public override ngDoCheck() { if (this.ngControl) { this.validateRequired(); this.errorState = !!(this.ngControl.invalid && this.ngControl.touched); diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts index 4b1898b8ac..87d43d764c 100644 --- a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts @@ -95,22 +95,22 @@ export class GfSymbolAutocompleteComponent private readonly input = viewChild.required(MatInput); public constructor( - public readonly _elementRef: ElementRef, - public readonly _focusMonitor: FocusMonitor, + public override readonly _elementRef: ElementRef, + public override readonly _focusMonitor: FocusMonitor, public readonly changeDetectorRef: ChangeDetectorRef, public readonly dataService: DataService, - public readonly ngControl: NgControl + public override readonly ngControl: NgControl ) { super(_elementRef, _focusMonitor, ngControl); this.controlType = 'symbol-autocomplete'; } - public get empty() { + public override get empty() { return this.input().empty; } - public set value(value: LookupItem) { + public override set value(value: LookupItem) { this.control.setValue(value); super.value = value; } @@ -188,7 +188,7 @@ export class GfSymbolAutocompleteComponent }); } - public ngDoCheck() { + public override ngDoCheck() { if (this.ngControl) { this.validateRequired(); this.errorState = !!(this.ngControl.invalid && this.ngControl.touched); diff --git a/tsconfig.base.json b/tsconfig.base.json index 1c1cca5cef..f831040a02 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -30,7 +30,7 @@ "noImplicitReturns": false, "noImplicitAny": false, "noImplicitThis": true, - "noImplicitOverride": false, + "noImplicitOverride": true, "noPropertyAccessFromIndexSignature": false, "noUnusedLocals": true, "noUnusedParameters": true, From 82faa08412b8402726348be7663255d57cedf835 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 18 Jul 2026 17:40:05 +0200 Subject: [PATCH 21/54] Task/remove deprecated auth endpoint (#7373) * Remove deprecated auth endpoint * Update changelog --- CHANGELOG.md | 1 + README.md | 2 -- apps/api/src/app/auth/auth.controller.ts | 21 --------------------- 3 files changed, 1 insertion(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e699e6cbb..217aba06a8 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 +- Removed the deprecated `auth` endpoint of the login with _Security Token_ (`GET`) - Simplified the `getHistorical()` function response in the data provider interface ## 3.29.0 - 2026-07-18 diff --git a/README.md b/README.md index 473d5c3679..69192124f4 100644 --- a/README.md +++ b/README.md @@ -190,8 +190,6 @@ Set the header for each request as follows: You can get the _Bearer Token_ via `POST http://localhost:3333/api/v1/auth/anonymous` (Body: `{ "accessToken": "" }`) -Deprecated: `GET http://localhost:3333/api/v1/auth/anonymous/` or `curl -s http://localhost:3333/api/v1/auth/anonymous/`. - ### Health Check (experimental) #### Request diff --git a/apps/api/src/app/auth/auth.controller.ts b/apps/api/src/app/auth/auth.controller.ts index ac50f4b8a1..e3886e39c3 100644 --- a/apps/api/src/app/auth/auth.controller.ts +++ b/apps/api/src/app/auth/auth.controller.ts @@ -14,7 +14,6 @@ import { Controller, Get, HttpException, - Param, Post, Req, Res, @@ -36,26 +35,6 @@ export class AuthController { private readonly webAuthService: WebAuthService ) {} - /** - * @deprecated - */ - @Get('anonymous/:accessToken') - @UseGuards(CustomThrottlerGuard) - public async accessTokenLoginGet( - @Param('accessToken') accessToken: string - ): Promise { - try { - const authToken = - await this.authService.validateAnonymousLogin(accessToken); - return { authToken }; - } catch { - throw new HttpException( - getReasonPhrase(StatusCodes.FORBIDDEN), - StatusCodes.FORBIDDEN - ); - } - } - @Post('anonymous') @UseGuards(CustomThrottlerGuard) public async accessTokenLogin( From fbd4859d89fd196255754f3dc1491f9630a879db Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 18 Jul 2026 19:37:38 +0200 Subject: [PATCH 22/54] Task/harmonize styling in top holdings component (#7374) Harmonize styling --- .../src/lib/top-holdings/top-holdings.component.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libs/ui/src/lib/top-holdings/top-holdings.component.html b/libs/ui/src/lib/top-holdings/top-holdings.component.html index bb3850b8c3..e07e5fe4d9 100644 --- a/libs/ui/src/lib/top-holdings/top-holdings.component.html +++ b/libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -72,12 +72,12 @@ - -
-
{{ parentHolding?.name }}
-
+ +
{{ parentHolding?.name }}
{{ parentHolding?.symbol | gfSymbol From 20afbdc20251ab61eece0b23737db9a3bce95e9b Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 18 Jul 2026 19:41:03 +0200 Subject: [PATCH 23/54] Task/restrict get symbol data endpoint to authenticated users (#7372) * Restrict symbol data endpoint to authenticated users * Update changelog --- CHANGELOG.md | 1 + apps/api/src/app/info/info.module.ts | 2 + apps/api/src/app/info/info.service.ts | 28 ++++++----- apps/api/src/app/symbol/symbol.controller.ts | 1 + .../home-market/home-market.component.ts | 47 +++---------------- .../components/home-market/home-market.html | 21 +-------- .../components/home-market/home-market.scss | 4 -- .../src/lib/interfaces/info-item.interface.ts | 2 +- 8 files changed, 30 insertions(+), 76 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 217aba06a8..7a4a3bc176 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 +- Restricted the symbol data endpoint (`GET /api/v1/symbol/:dataSource/:symbol`) to authenticated users - Removed the deprecated `auth` endpoint of the login with _Security Token_ (`GET`) - Simplified the `getHistorical()` function response in the data provider interface diff --git a/apps/api/src/app/info/info.module.ts b/apps/api/src/app/info/info.module.ts index e33c5e0c2e..06b7249095 100644 --- a/apps/api/src/app/info/info.module.ts +++ b/apps/api/src/app/info/info.module.ts @@ -7,6 +7,7 @@ import { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.mo import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; +import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { DataGatheringQueueModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; @@ -29,6 +30,7 @@ import { InfoService } from './info.service'; secret: process.env.JWT_SECRET_KEY, signOptions: { expiresIn: '30 days' } }), + MarketDataModule, PlatformModule, PropertyModule, RedisCacheModule, diff --git a/apps/api/src/app/info/info.service.ts b/apps/api/src/app/info/info.service.ts index 10836f7b8f..cb7d24bcba 100644 --- a/apps/api/src/app/info/info.service.ts +++ b/apps/api/src/app/info/info.service.ts @@ -1,14 +1,15 @@ import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { SubscriptionService } from '@ghostfolio/api/app/subscription/subscription.service'; import { UserService } from '@ghostfolio/api/app/user/user.service'; -import { encodeDataSource } from '@ghostfolio/api/helper/data-source.helper'; import { BenchmarkService } from '@ghostfolio/api/services/benchmark/benchmark.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { DEFAULT_CURRENCY, + ghostfolioFearAndGreedIndexSymbolStocks, PROPERTY_COUNTRIES_OF_SUBSCRIBERS, PROPERTY_DEMO_USER_ID, PROPERTY_DOCKER_HUB_PULLS, @@ -23,6 +24,7 @@ import { permissions } from '@ghostfolio/common/permissions'; import { Injectable } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; +import { MarketData } from '@prisma/client'; import { subDays } from 'date-fns'; import { isNil } from 'lodash'; @@ -36,6 +38,7 @@ export class InfoService { private readonly dataProviderService: DataProviderService, private readonly exchangeRateDataService: ExchangeRateDataService, private readonly jwtService: JwtService, + private readonly marketDataService: MarketDataService, private readonly propertyService: PropertyService, private readonly redisCacheService: RedisCacheService, private readonly subscriptionService: SubscriptionService, @@ -45,6 +48,7 @@ export class InfoService { public async get(): Promise { const info: Partial = {}; let isReadOnlyMode: boolean; + let latestFearAndGreedStocksMarketDataPromise: Promise; const globalPermissions: string[] = []; @@ -61,16 +65,12 @@ export class InfoService { } if (this.configurationService.get('ENABLE_FEATURE_FEAR_AND_GREED_INDEX')) { - const fearAndGreedIndexDataSource = - this.dataProviderService.getDataSourceForFearAndGreedIndexStocks(); - - if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { - info.fearAndGreedDataSource = encodeDataSource( - fearAndGreedIndexDataSource - ); - } else { - info.fearAndGreedDataSource = fearAndGreedIndexDataSource; - } + latestFearAndGreedStocksMarketDataPromise = + this.marketDataService.getLatest({ + dataSource: + this.dataProviderService.getDataSourceForFearAndGreedIndexStocks(), + symbol: ghostfolioFearAndGreedIndexSymbolStocks + }); globalPermissions.push(permissions.enableFearAndGreedIndex); } @@ -102,12 +102,14 @@ export class InfoService { benchmarks, demoAuthToken, isUserSignupEnabled, + latestFearAndGreedStocksMarketData, statistics, subscriptionOffer ] = await Promise.all([ this.benchmarkService.getBenchmarkAssetProfiles(), this.getDemoAuthToken(), this.propertyService.isUserSignupEnabled(), + latestFearAndGreedStocksMarketDataPromise, this.getStatistics(), this.subscriptionService.getSubscriptionOffer({ key: 'default' }) ]); @@ -125,7 +127,9 @@ export class InfoService { statistics, subscriptionOffer, baseCurrency: DEFAULT_CURRENCY, - currencies: this.exchangeRateDataService.getCurrencies() + currencies: this.exchangeRateDataService.getCurrencies(), + fearAndGreedStocksMarketPrice: + latestFearAndGreedStocksMarketData?.marketPrice }; } diff --git a/apps/api/src/app/symbol/symbol.controller.ts b/apps/api/src/app/symbol/symbol.controller.ts index d94ffb4dcf..a1351dbed2 100644 --- a/apps/api/src/app/symbol/symbol.controller.ts +++ b/apps/api/src/app/symbol/symbol.controller.ts @@ -65,6 +65,7 @@ export class SymbolController { * Must be after /lookup */ @Get(':dataSource/:symbol') + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(TransformDataSourceInRequestInterceptor) @UseInterceptors(TransformDataSourceInResponseInterceptor) public async getSymbolData( diff --git a/apps/client/src/app/components/home-market/home-market.component.ts b/apps/client/src/app/components/home-market/home-market.component.ts index 6bf99b31d1..0eec3f2d9e 100644 --- a/apps/client/src/app/components/home-market/home-market.component.ts +++ b/apps/client/src/app/components/home-market/home-market.component.ts @@ -1,16 +1,8 @@ import { GfFearAndGreedIndexComponent } from '@ghostfolio/client/components/fear-and-greed-index/fear-and-greed-index.component'; import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { ghostfolioFearAndGreedIndexSymbolStocks } from '@ghostfolio/common/config'; -import { resetHours } from '@ghostfolio/common/helper'; -import { - Benchmark, - HistoricalDataItem, - InfoItem, - User -} from '@ghostfolio/common/interfaces'; +import { Benchmark, InfoItem, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { GfBenchmarkComponent } from '@ghostfolio/ui/benchmark'; -import { GfLineChartComponent } from '@ghostfolio/ui/line-chart'; import { DataService } from '@ghostfolio/ui/services'; import { @@ -29,11 +21,7 @@ import { DeviceDetectorService } from 'ngx-device-detector'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, - imports: [ - GfBenchmarkComponent, - GfFearAndGreedIndexComponent, - GfLineChartComponent - ], + imports: [GfBenchmarkComponent, GfFearAndGreedIndexComponent], schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-home-market', styleUrls: ['./home-market.scss'], @@ -41,15 +29,13 @@ import { DeviceDetectorService } from 'ngx-device-detector'; }) export class GfHomeMarketComponent implements OnInit { protected readonly benchmarks = signal([]); + protected readonly deviceType = computed( () => this.deviceDetectorService.deviceInfo().deviceType ); - protected readonly fearAndGreedIndex = signal(undefined); - protected readonly fearLabel = $localize`Fear`; - protected readonly greedLabel = $localize`Greed`; + + protected fearAndGreedIndex: number | undefined; protected hasPermissionToAccessFearAndGreedIndex: boolean; - protected readonly historicalDataItems = signal([]); - protected readonly numberOfDays = 365; protected user: User; private readonly info: InfoItem; @@ -80,27 +66,8 @@ export class GfHomeMarketComponent implements OnInit { permissions.enableFearAndGreedIndex ); - if ( - this.hasPermissionToAccessFearAndGreedIndex && - this.info.fearAndGreedDataSource - ) { - this.dataService - .fetchSymbolItem({ - dataSource: this.info.fearAndGreedDataSource, - includeHistoricalData: this.numberOfDays, - symbol: ghostfolioFearAndGreedIndexSymbolStocks - }) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(({ historicalData, marketPrice }) => { - this.fearAndGreedIndex.set(marketPrice); - this.historicalDataItems.set([ - ...historicalData, - { - date: resetHours(new Date()).toISOString(), - value: marketPrice - } - ]); - }); + if (this.hasPermissionToAccessFearAndGreedIndex) { + this.fearAndGreedIndex = this.info.fearAndGreedStocksMarketPrice; } this.dataService diff --git a/apps/client/src/app/components/home-market/home-market.html b/apps/client/src/app/components/home-market/home-market.html index a782526eee..b1e21df955 100644 --- a/apps/client/src/app/components/home-market/home-market.html +++ b/apps/client/src/app/components/home-market/home-market.html @@ -1,28 +1,11 @@

Markets

@if (hasPermissionToAccessFearAndGreedIndex) { -
+
-
- Last {{ numberOfDays }} Days -
-
diff --git a/apps/client/src/app/components/home-market/home-market.scss b/apps/client/src/app/components/home-market/home-market.scss index 5b523160d5..5d4e87f30f 100644 --- a/apps/client/src/app/components/home-market/home-market.scss +++ b/apps/client/src/app/components/home-market/home-market.scss @@ -1,7 +1,3 @@ :host { display: block; - - gf-line-chart { - aspect-ratio: 16 / 9; - } } diff --git a/libs/common/src/lib/interfaces/info-item.interface.ts b/libs/common/src/lib/interfaces/info-item.interface.ts index 01897c0664..96db7f9b06 100644 --- a/libs/common/src/lib/interfaces/info-item.interface.ts +++ b/libs/common/src/lib/interfaces/info-item.interface.ts @@ -9,7 +9,7 @@ export interface InfoItem { countriesOfSubscribers?: string[]; currencies: string[]; demoAuthToken: string; - fearAndGreedDataSource?: string; + fearAndGreedStocksMarketPrice?: number; globalPermissions: string[]; isDataGatheringEnabled?: string; isReadOnlyMode?: boolean; From 7cd6ebe000df672fd52c5e6bb9a3507ddbf3d882 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 19 Jul 2026 08:20:12 +0200 Subject: [PATCH 24/54] Task/eliminate unneeded symbol pipe (#7375) Eliminate symbol pipe --- .../admin-market-data/admin-market-data.component.ts | 2 -- .../admin-market-data/admin-market-data.html | 4 +--- .../import-activities-dialog.component.ts | 2 -- .../import-activities-dialog.html | 2 +- .../allocations/allocations-page.component.ts | 8 ++++---- .../src/app/pages/public/public-page.component.ts | 8 ++++---- libs/common/src/lib/config.ts | 3 --- libs/common/src/lib/helper.ts | 5 ----- libs/common/src/lib/pipes/index.ts | 3 --- libs/common/src/lib/pipes/symbol.pipe.ts | 12 ------------ .../activities-filter.component.html | 4 ++-- .../activities-filter/activities-filter.component.ts | 2 -- .../activities-table/activities-table.component.html | 4 +--- .../activities-table.component.stories.ts | 2 -- .../activities-table/activities-table.component.ts | 2 -- .../assistant-list-item.component.ts | 3 +-- .../assistant-list-item/assistant-list-item.html | 2 +- .../portfolio-filter-form.component.html | 2 +- .../portfolio-filter-form.component.ts | 2 -- .../symbol-autocomplete.component.html | 2 +- .../symbol-autocomplete.component.ts | 2 -- .../src/lib/top-holdings/top-holdings.component.html | 2 +- .../src/lib/top-holdings/top-holdings.component.ts | 2 -- 23 files changed, 18 insertions(+), 62 deletions(-) delete mode 100644 libs/common/src/lib/pipes/index.ts delete mode 100644 libs/common/src/lib/pipes/symbol.pipe.ts 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 4b893af7b0..e716907ef3 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 @@ -13,7 +13,6 @@ import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { GfActivitiesFilterComponent } from '@ghostfolio/ui/activities-filter'; import { GfFabComponent } from '@ghostfolio/ui/fab'; import { translate } from '@ghostfolio/ui/i18n'; @@ -83,7 +82,6 @@ import { CreateAssetProfileDialogParams } from './create-asset-profile-dialog/in GfActivitiesFilterComponent, GfFabComponent, GfPremiumIndicatorComponent, - GfSymbolPipe, GfValueComponent, IonIcon, MatButtonModule, diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.html b/apps/client/src/app/components/admin-market-data/admin-market-data.html index ebb165814c..f6744b2632 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.html +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -95,9 +95,7 @@
{{ element.name }}
@if (!isUUID(element.symbol)) {
- {{ - element.symbol | gfSymbol - }} + {{ element.symbol }}
} diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts index 4541009a0f..77d889b1a6 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -7,7 +7,6 @@ import { CreateTagDto } from '@ghostfolio/common/dtos'; import { Activity, PortfolioPosition } from '@ghostfolio/common/interfaces'; -import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { GfDialogFooterComponent } from '@ghostfolio/ui/dialog-footer'; import { GfDialogHeaderComponent } from '@ghostfolio/ui/dialog-header'; @@ -66,7 +65,6 @@ import { ImportActivitiesDialogParams } from './interfaces/interfaces'; GfDialogFooterComponent, GfDialogHeaderComponent, GfFileDropDirective, - GfSymbolPipe, IonIcon, MatButtonModule, MatDialogModule, diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html index 4149ce5b64..559f639b15 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -51,7 +51,7 @@ >
{{ holding.assetProfile.symbol | gfSymbol }} · + >{{ holding.assetProfile.symbol }} · {{ holding.assetProfile.currency }} 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 52f051e779..de00048e7c 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 @@ -6,7 +6,7 @@ import { import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { MAX_TOP_HOLDINGS, UNKNOWN_KEY } from '@ghostfolio/common/config'; -import { getCountryName, prettifySymbol } from '@ghostfolio/common/helper'; +import { getCountryName } from '@ghostfolio/common/helper'; import { AssetProfileIdentifier, HoldingWithParents, @@ -495,10 +495,10 @@ export class GfAllocationsPageComponent implements OnInit { this.totalValueInEtf += this.holdings[symbol].value; } - this.symbols[prettifySymbol(symbol)] = { + this.symbols[symbol] = { + symbol, dataSource: position.assetProfile.dataSource, name: position.assetProfile.name ?? '', - symbol: prettifySymbol(symbol), value: (isNumber(position.valueInBaseCurrency) ? position.valueInBaseCurrency @@ -565,11 +565,11 @@ export class GfAllocationsPageComponent implements OnInit { return currentParentHolding && isNumber(currentParentHolding.valueInBaseCurrency) ? { + symbol, allocationInPercentage: currentParentHolding.valueInBaseCurrency / value, name: holding.assetProfile.name ?? '', position: holding, - symbol: prettifySymbol(symbol), valueInBaseCurrency: currentParentHolding.valueInBaseCurrency } diff --git a/apps/client/src/app/pages/public/public-page.component.ts b/apps/client/src/app/pages/public/public-page.component.ts index 52d295dfa9..3b149cd086 100644 --- a/apps/client/src/app/pages/public/public-page.component.ts +++ b/apps/client/src/app/pages/public/public-page.component.ts @@ -1,5 +1,5 @@ import { UNKNOWN_KEY } from '@ghostfolio/common/config'; -import { getCountryName, prettifySymbol } from '@ghostfolio/common/helper'; +import { getCountryName } from '@ghostfolio/common/helper'; import { InfoItem, PortfolioPosition, @@ -250,9 +250,9 @@ export class GfPublicPageComponent implements OnInit { } } - this.symbols[prettifySymbol(symbol)] = { - name: position.assetProfile.name ?? prettifySymbol(symbol), - symbol: prettifySymbol(symbol), + this.symbols[symbol] = { + symbol, + name: position.assetProfile.name ?? symbol, value: isNumber(position.valueInBaseCurrency) ? position.valueInBaseCurrency : (position.valueInPercentage ?? 0) diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index f7bafb1019..a5363372a9 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -6,9 +6,6 @@ import { ColorScheme, DateRange } from './types'; export const ghostfolioPrefix = 'GF'; -/* @deprecated */ -export const ghostfolioScraperApiSymbolPrefix = `_${ghostfolioPrefix}_`; - export const ghostfolioFearAndGreedIndexDataSourceCryptocurrencies = DataSource.MANUAL; export const ghostfolioFearAndGreedIndexSymbolCryptocurrencies = `${ghostfolioPrefix}_FEAR_AND_GREED_INDEX_CRYPTOCURRENCIES`; diff --git a/libs/common/src/lib/helper.ts b/libs/common/src/lib/helper.ts index 9a32927e23..6a135eef63 100644 --- a/libs/common/src/lib/helper.ts +++ b/libs/common/src/lib/helper.ts @@ -40,7 +40,6 @@ import { DERIVED_CURRENCIES, ghostfolioFearAndGreedIndexSymbolCryptocurrencies, ghostfolioFearAndGreedIndexSymbolStocks, - ghostfolioScraperApiSymbolPrefix, TAG_ID_EXCLUDE_FROM_ANALYSIS } from './config'; import { @@ -527,10 +526,6 @@ export function parseSymbol({ dataSource, symbol }: AssetProfileIdentifier) { }; } -export function prettifySymbol(aSymbol: string): string { - return aSymbol?.replace(ghostfolioScraperApiSymbolPrefix, ''); -} - export function resetHours(aDate: Date) { const year = getYear(aDate); const month = getMonth(aDate); diff --git a/libs/common/src/lib/pipes/index.ts b/libs/common/src/lib/pipes/index.ts deleted file mode 100644 index 7b5ca4bac4..0000000000 --- a/libs/common/src/lib/pipes/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { GfSymbolPipe } from './symbol.pipe'; - -export { GfSymbolPipe }; diff --git a/libs/common/src/lib/pipes/symbol.pipe.ts b/libs/common/src/lib/pipes/symbol.pipe.ts deleted file mode 100644 index 6f4981699d..0000000000 --- a/libs/common/src/lib/pipes/symbol.pipe.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { prettifySymbol } from '@ghostfolio/common/helper'; - -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'gfSymbol' -}) -export class GfSymbolPipe implements PipeTransform { - public transform(aSymbol: string) { - return prettifySymbol(aSymbol); - } -} 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 b525e51339..58626351b7 100644 --- a/libs/ui/src/lib/activities-filter/activities-filter.component.html +++ b/libs/ui/src/lib/activities-filter/activities-filter.component.html @@ -8,7 +8,7 @@ [removable]="true" (removed)="onRemoveFilter(filter)" > - {{ filter.label ?? '' | gfSymbol }} + {{ filter.label }} @@ -33,7 +33,7 @@ @for (filter of filterGroup.filters; track filter) { - {{ filter.label ?? '' | gfSymbol }} + {{ filter.label }} } 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 6b58e6aecc..7a434d94c8 100644 --- a/libs/ui/src/lib/activities-filter/activities-filter.component.ts +++ b/libs/ui/src/lib/activities-filter/activities-filter.component.ts @@ -1,5 +1,4 @@ import { Filter, FilterGroup } from '@ghostfolio/common/interfaces'; -import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { COMMA, ENTER } from '@angular/cdk/keycodes'; import { CommonModule } from '@angular/common'; @@ -39,7 +38,6 @@ import { translate } from '../i18n'; changeDetection: ChangeDetectionStrategy.OnPush, imports: [ CommonModule, - GfSymbolPipe, IonIcon, MatAutocompleteModule, MatButtonModule, 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 cc9a340475..50fb025cb4 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.html +++ b/libs/ui/src/lib/activities-table/activities-table.component.html @@ -172,9 +172,7 @@ !isUUID(element.assetProfile?.symbol) ) {
- {{ - element.assetProfile?.symbol | gfSymbol - }} + {{ element.assetProfile?.symbol }}
} diff --git a/libs/ui/src/lib/activities-table/activities-table.component.stories.ts b/libs/ui/src/lib/activities-table/activities-table.component.stories.ts index e4028e7baa..540aa92b6d 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.stories.ts +++ b/libs/ui/src/lib/activities-table/activities-table.component.stories.ts @@ -1,5 +1,4 @@ import { Activity } from '@ghostfolio/common/interfaces'; -import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { CommonModule } from '@angular/common'; import { MatButtonModule } from '@angular/material/button'; @@ -375,7 +374,6 @@ export default { GfActivityTypeComponent, GfEntityLogoComponent, GfNoTransactionsInfoComponent, - GfSymbolPipe, GfValueComponent, IonIcon, MatButtonModule, 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 399d5d7e19..be1f887527 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.ts +++ b/libs/ui/src/lib/activities-table/activities-table.component.ts @@ -8,7 +8,6 @@ import { Activity, AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; -import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { translate } from '@ghostfolio/ui/i18n'; import { NotificationService } from '@ghostfolio/ui/notifications'; @@ -83,7 +82,6 @@ import { GfValueComponent } from '../value/value.component'; GfActivityTypeComponent, GfEntityLogoComponent, GfNoTransactionsInfoComponent, - GfSymbolPipe, GfValueComponent, IonIcon, MatButtonModule, 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 36127a5669..b2c541e3f3 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 @@ -1,4 +1,3 @@ -import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { FocusableOption } from '@angular/cdk/a11y'; @@ -24,7 +23,7 @@ import { @Component({ changeDetection: ChangeDetectionStrategy.OnPush, - imports: [GfSymbolPipe, RouterModule], + imports: [RouterModule], selector: 'gf-assistant-list-item', styleUrls: ['./assistant-list-item.scss'], templateUrl: './assistant-list-item.html' 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 fa30d0c038..45a84866bb 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?.symbol }} @if (item.currency) { · {{ item.currency }} } 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 33bde3fd6c..cda9cab3c3 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 @@ -40,7 +40,7 @@ >
{{ holding.assetProfile.symbol | gfSymbol }} · + >{{ holding.assetProfile.symbol }} · {{ holding.assetProfile.currency }}
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 20e8b0f0f7..9d9002c672 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 @@ -1,6 +1,5 @@ import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { Filter, PortfolioPosition } from '@ghostfolio/common/interfaces'; -import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { AccountWithPlatform } from '@ghostfolio/common/types'; import { @@ -37,7 +36,6 @@ import { PortfolioFilterFormValue } from './interfaces'; imports: [ FormsModule, GfEntityLogoComponent, - GfSymbolPipe, MatFormFieldModule, MatSelectModule, ReactiveFormsModule diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html index 12867662bb..d786d724de 100644 --- a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html @@ -25,7 +25,7 @@ } {{ lookupItem.symbol | gfSymbol }} + >{{ lookupItem.symbol }} @if (lookupItem.currency) { · {{ lookupItem.currency }} } diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts index 87d43d764c..cab911ef2b 100644 --- a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts @@ -1,5 +1,4 @@ import { LookupItem } from '@ghostfolio/common/interfaces'; -import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { DataService } from '@ghostfolio/ui/services'; import { FocusMonitor } from '@angular/cdk/a11y'; @@ -58,7 +57,6 @@ import { AbstractMatFormField } from '../shared/abstract-mat-form-field'; imports: [ FormsModule, GfPremiumIndicatorComponent, - GfSymbolPipe, MatAutocompleteModule, MatFormFieldModule, MatInputModule, diff --git a/libs/ui/src/lib/top-holdings/top-holdings.component.html b/libs/ui/src/lib/top-holdings/top-holdings.component.html index e07e5fe4d9..3e09ab5bab 100644 --- a/libs/ui/src/lib/top-holdings/top-holdings.component.html +++ b/libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -80,7 +80,7 @@
{{ parentHolding?.name }}
{{ - parentHolding?.symbol | gfSymbol + parentHolding?.symbol }}
diff --git a/libs/ui/src/lib/top-holdings/top-holdings.component.ts b/libs/ui/src/lib/top-holdings/top-holdings.component.ts index 51ef8751fe..3e7473c656 100644 --- a/libs/ui/src/lib/top-holdings/top-holdings.component.ts +++ b/libs/ui/src/lib/top-holdings/top-holdings.component.ts @@ -3,7 +3,6 @@ import { AssetProfileIdentifier, HoldingWithParents } from '@ghostfolio/common/interfaces'; -import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { animate, @@ -43,7 +42,6 @@ import { GfValueComponent } from '../value/value.component'; ], changeDetection: ChangeDetectionStrategy.OnPush, imports: [ - GfSymbolPipe, GfValueComponent, MatButtonModule, MatPaginatorModule, From faf01ae820fcd4c0948993e8034802a3209bf798 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 19 Jul 2026 17:15:56 +0200 Subject: [PATCH 25/54] Feature/support migrating asset profile to MANUAL data source (#7376) * Support migrating asset profile to MANUAL data source * Update changelog --- CHANGELOG.md | 4 + apps/api/src/app/admin/admin.service.ts | 113 +++++++++++----- .../market-data/market-data.service.ts | 2 +- .../symbol-profile/symbol-profile.service.ts | 9 ++ .../admin-market-data.component.ts | 17 ++- .../asset-profile-dialog.component.ts | 124 +++++++++++------- .../asset-profile-dialog.html | 13 ++ 7 files changed, 193 insertions(+), 89 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a4a3bc176..2ca1c9291f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- Added support for converting an asset profile to the `MANUAL` data source in the asset profile details dialog of the admin control panel + ### Changed - Restricted the symbol data endpoint (`GET /api/v1/symbol/:dataSource/:symbol`) to authenticated users diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 8325fa90ec..26a4e06f47 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -12,6 +12,7 @@ import { PROPERTY_IS_USER_SIGNUP_ENABLED } from '@ghostfolio/common/config'; import { + applyAssetProfileOverrides, getAssetProfileIdentifier, getCurrencyFromSymbol } from '@ghostfolio/common/helper'; @@ -39,6 +40,7 @@ import { } from '@prisma/client'; import { differenceInDays } from 'date-fns'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; +import { randomUUID } from 'node:crypto'; @Injectable() export class AdminService { @@ -240,16 +242,25 @@ export class AdminService { url }: Prisma.SymbolProfileUpdateInput ) { + const isConversionToManualDataSource = + newDataSource === DataSource.MANUAL && dataSource !== DataSource.MANUAL; + + if (isConversionToManualDataSource && !newSymbol) { + newSymbol = randomUUID(); + } + if ( - newSymbol && newDataSource && - (newSymbol !== symbol || newDataSource !== dataSource) + newSymbol && + (newDataSource !== dataSource || newSymbol !== symbol) ) { + const newAssetProfileIdentifier: AssetProfileIdentifier = { + dataSource: newDataSource as DataSource, + symbol: newSymbol as string + }; + const [assetProfile] = await this.symbolProfileService.getSymbolProfiles([ - { - dataSource: DataSource[newDataSource.toString()], - symbol: newSymbol as string - } + newAssetProfileIdentifier ]); if (assetProfile) { @@ -259,45 +270,79 @@ export class AdminService { ); } - try { - await Promise.all([ - this.symbolProfileService.updateAssetProfileIdentifier( - { - dataSource, - symbol - }, - { - dataSource: DataSource[newDataSource.toString()], - symbol: newSymbol as string - } + const operations: Prisma.PrismaPromise[] = [ + this.symbolProfileService.updateAssetProfileIdentifier( + { + dataSource, + symbol + }, + newAssetProfileIdentifier + ), + this.marketDataService.updateAssetProfileIdentifier( + { + dataSource, + symbol + }, + newAssetProfileIdentifier + ) + ]; + + if (isConversionToManualDataSource) { + const currentAssetProfile = + await this.prismaService.symbolProfile.findUnique({ + include: { assetProfileOverrides: true }, + where: { dataSource_symbol: { dataSource, symbol } } + }); + + if (!currentAssetProfile) { + throw new HttpException( + getReasonPhrase(StatusCodes.NOT_FOUND), + StatusCodes.NOT_FOUND + ); + } + + const currentAssetProfileWithOverrides = applyAssetProfileOverrides( + currentAssetProfile, + currentAssetProfile.assetProfileOverrides + ); + + operations.push( + // The overrides are applied on every read, so delete them and + // persist the merged values in the asset profile instead + this.symbolProfileService.deleteAssetProfileOverrides( + newAssetProfileIdentifier ), - this.marketDataService.updateAssetProfileIdentifier( + this.symbolProfileService.updateSymbolProfile( + newAssetProfileIdentifier, { - dataSource, - symbol - }, - { - dataSource: DataSource[newDataSource.toString()], - symbol: newSymbol as string + assetClass: currentAssetProfileWithOverrides.assetClass, + assetSubClass: currentAssetProfileWithOverrides.assetSubClass, + countries: + currentAssetProfileWithOverrides.countries ?? undefined, + holdings: currentAssetProfileWithOverrides.holdings ?? undefined, + name: currentAssetProfileWithOverrides.name, + sectors: currentAssetProfileWithOverrides.sectors ?? undefined, + url: currentAssetProfileWithOverrides.url } ) - ]); - - const [updatedAssetProfile] = - await this.symbolProfileService.getSymbolProfiles([ - { - dataSource: DataSource[newDataSource.toString()], - symbol: newSymbol as string - } - ]); + ); + } - return updatedAssetProfile; + try { + await this.prismaService.$transaction(operations); } catch { throw new HttpException( getReasonPhrase(StatusCodes.BAD_REQUEST), StatusCodes.BAD_REQUEST ); } + + const [updatedAssetProfile] = + await this.symbolProfileService.getSymbolProfiles([ + newAssetProfileIdentifier + ]); + + return updatedAssetProfile; } else { const assetProfileOverrides = { assetClass: assetClass as AssetClass, diff --git a/apps/api/src/services/market-data/market-data.service.ts b/apps/api/src/services/market-data/market-data.service.ts index 086434724b..ad388ce5c5 100644 --- a/apps/api/src/services/market-data/market-data.service.ts +++ b/apps/api/src/services/market-data/market-data.service.ts @@ -204,7 +204,7 @@ export class MarketDataService { ); } - public async updateAssetProfileIdentifier( + public updateAssetProfileIdentifier( oldAssetProfileIdentifier: AssetProfileIdentifier, newAssetProfileIdentifier: AssetProfileIdentifier ) { diff --git a/apps/api/src/services/symbol-profile/symbol-profile.service.ts b/apps/api/src/services/symbol-profile/symbol-profile.service.ts index 7157f0856d..3f40db247e 100644 --- a/apps/api/src/services/symbol-profile/symbol-profile.service.ts +++ b/apps/api/src/services/symbol-profile/symbol-profile.service.ts @@ -35,6 +35,15 @@ export class SymbolProfileService { }); } + public deleteAssetProfileOverrides({ + dataSource, + symbol + }: AssetProfileIdentifier) { + return this.prismaService.assetProfileOverrides.deleteMany({ + where: { symbolProfile: { dataSource, symbol } } + }); + } + public async deleteById(id: string) { return this.prismaService.symbolProfile.delete({ where: { id } 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 e716907ef3..b29ccc7d7b 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 @@ -408,7 +408,8 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { const dialogRef = this.dialog.open< GfAssetProfileDialogComponent, - AssetProfileDialogParams + AssetProfileDialogParams, + AssetProfileIdentifier >(GfAssetProfileDialogComponent, { autoFocus: false, data: { @@ -426,15 +427,13 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { dialogRef .afterClosed() .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe( - (newAssetProfileIdentifier: AssetProfileIdentifier | undefined) => { - if (newAssetProfileIdentifier) { - this.onOpenAssetProfileDialog(newAssetProfileIdentifier); - } else { - this.router.navigate(['.'], { relativeTo: this.route }); - } + .subscribe((newAssetProfileIdentifier) => { + if (newAssetProfileIdentifier) { + this.onOpenAssetProfileDialog(newAssetProfileIdentifier); + } else { + this.router.navigate(['.'], { relativeTo: this.route }); } - ); + }); }); } 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 c34e8eb78c..c5562740fd 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,6 +5,7 @@ import { PROPERTY_IS_DATA_GATHERING_ENABLED } from '@ghostfolio/common/config'; import { UpdateAssetProfileDto } from '@ghostfolio/common/dtos'; +import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { canDeleteAssetProfile, DATE_FORMAT, @@ -75,6 +76,7 @@ import { AssetClass, AssetSubClass, DataGatheringFrequency, + DataSource, MarketData, Prisma, SymbolProfile @@ -215,6 +217,8 @@ export class GfAssetProfileDialogComponent implements OnInit { } ]; + protected readonly DataSource = DataSource; + protected readonly dateRangeOptions = [ { label: $localize`Current week` + ' (' + $localize`WTD` + ')', @@ -277,7 +281,10 @@ export class GfAssetProfileDialogComponent implements OnInit { @Inject(MAT_DIALOG_DATA) protected data: AssetProfileDialogParams, private dataService: DataService, private destroyRef: DestroyRef, - private dialogRef: MatDialogRef, + private dialogRef: MatDialogRef< + GfAssetProfileDialogComponent, + AssetProfileIdentifier + >, private formBuilder: FormBuilder, private notificationService: NotificationService, private snackBar: MatSnackBar, @@ -467,6 +474,19 @@ export class GfAssetProfileDialogComponent implements OnInit { this.dialogRef.close(); } + protected onConvertToManualDataSource() { + this.patchAssetProfileIdentifier({ + getErrorMessage: () => { + return ( + '😞 ' + + $localize`An error occurred while converting the data source to ${DataSource.MANUAL}.` + ); + }, + title: $localize`Do you really want to convert the data source to ${DataSource.MANUAL}?`, + updateAssetProfileDto: { dataSource: DataSource.MANUAL } + }); + } + protected onDeleteProfileData({ dataSource, symbol @@ -666,13 +686,16 @@ export class GfAssetProfileDialogComponent implements OnInit { } protected async onSubmitAssetProfileIdentifierForm() { + const newAssetProfileIdentifier = + this.assetProfileIdentifierForm.controls.assetProfileIdentifier.value; + + if (!newAssetProfileIdentifier?.dataSource) { + return; + } + const assetProfileIdentifier: UpdateAssetProfileDto = { - dataSource: - this.assetProfileIdentifierForm.controls.assetProfileIdentifier.value - ?.dataSource ?? undefined, - symbol: - this.assetProfileIdentifierForm.controls.assetProfileIdentifier.value - ?.symbol ?? undefined + dataSource: newAssetProfileIdentifier.dataSource, + symbol: newAssetProfileIdentifier.symbol }; try { @@ -687,46 +710,19 @@ export class GfAssetProfileDialogComponent implements OnInit { return; } - this.adminService - .patchAssetProfile( - { - dataSource: this.data.dataSource, - symbol: this.data.symbol - }, - assetProfileIdentifier - ) - .pipe( - catchError((error: HttpErrorResponse) => { - if (error.status === StatusCodes.CONFLICT) { - this.snackBar.open( - $localize`${assetProfileIdentifier.symbol} (${assetProfileIdentifier.dataSource}) is already in use.`, - undefined, - { - duration: ms('3 seconds') - } - ); - } else { - this.snackBar.open( - $localize`An error occurred while updating to ${assetProfileIdentifier.symbol} (${assetProfileIdentifier.dataSource}).`, - undefined, - { - duration: ms('3 seconds') - } - ); - } + this.patchAssetProfileIdentifier({ + getErrorMessage: (error) => { + if (error.status === StatusCodes.CONFLICT) { + // TODO: Ask if the user wants to merge the two asset profiles - return EMPTY; - }), - takeUntilDestroyed(this.destroyRef) - ) - .subscribe(() => { - const newAssetProfileIdentifier = { - dataSource: assetProfileIdentifier.dataSource, - symbol: assetProfileIdentifier.symbol - }; + return $localize`${assetProfileIdentifier.symbol} (${assetProfileIdentifier.dataSource}) is already in use.`; + } - this.dialogRef.close(newAssetProfileIdentifier); - }); + return $localize`An error occurred while updating to ${assetProfileIdentifier.symbol} (${assetProfileIdentifier.dataSource}).`; + }, + title: $localize`Do you really want to convert this asset profile to ${newAssetProfileIdentifier.symbol} (${newAssetProfileIdentifier.dataSource})?`, + updateAssetProfileDto: assetProfileIdentifier + }); } protected onTestMarketData() { @@ -824,4 +820,42 @@ export class GfAssetProfileDialogComponent implements OnInit { return null; } + + private patchAssetProfileIdentifier({ + getErrorMessage, + title, + updateAssetProfileDto + }: { + getErrorMessage: (error: HttpErrorResponse) => string; + title: string; + updateAssetProfileDto: UpdateAssetProfileDto; + }) { + this.notificationService.confirm({ + title, + confirmFn: () => { + this.adminService + .patchAssetProfile( + { + dataSource: this.data.dataSource, + symbol: this.data.symbol + }, + updateAssetProfileDto + ) + .pipe( + catchError((error: HttpErrorResponse) => { + this.snackBar.open(getErrorMessage(error), undefined, { + duration: ms('3 seconds') + }); + + return EMPTY; + }), + takeUntilDestroyed(this.destroyRef) + ) + .subscribe(({ dataSource, symbol }) => { + this.dialogRef.close({ dataSource, symbol }); + }); + }, + confirmType: ConfirmationDialogType.Primary + }); + } } 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 9b69ef6fce..c9abdeeb7c 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 @@ -162,6 +162,19 @@ Cancel + @if (data.dataSource !== DataSource.MANUAL) { +

or

+ + }
} @else {
From 3739b768856fc4148027af44b3c22c6592bc268c Mon Sep 17 00:00:00 2001 From: Arham Amin <132888838+arhxam@users.noreply.github.com> Date: Sun, 19 Jul 2026 21:12:32 +0530 Subject: [PATCH 26/54] Task/preserve negative numbers in extractNumberFromString (#7377) * Preserve negative numbers in extractNumberFromString * Update changelog --- CHANGELOG.md | 1 + libs/common/src/lib/helper.spec.ts | 20 ++++++++++++++++++++ libs/common/src/lib/helper.ts | 7 ++++++- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ca1c9291f..82954caa4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Extended the `extractNumberFromString()` function to support negative values - Restricted the symbol data endpoint (`GET /api/v1/symbol/:dataSource/:symbol`) to authenticated users - Removed the deprecated `auth` endpoint of the login with _Security Token_ (`GET`) - Simplified the `getHistorical()` function response in the data provider interface diff --git a/libs/common/src/lib/helper.spec.ts b/libs/common/src/lib/helper.spec.ts index 6a6fe47734..d33f104522 100644 --- a/libs/common/src/lib/helper.spec.ts +++ b/libs/common/src/lib/helper.spec.ts @@ -11,6 +11,10 @@ describe('Helper', () => { expect(extractNumberFromString({ value: '999.99' })).toEqual(999.99); }); + it('Get negative decimal number', () => { + expect(extractNumberFromString({ value: '-999.99' })).toEqual(-999.99); + }); + it('Get decimal number (with spaces)', () => { expect(extractNumberFromString({ value: ' 999.99 ' })).toEqual(999.99); }); @@ -19,6 +23,12 @@ describe('Helper', () => { expect(extractNumberFromString({ value: '999.99 CHF' })).toEqual(999.99); }); + it('Get negative decimal number (with currency)', () => { + expect(extractNumberFromString({ value: '-999.99 CHF' })).toEqual( + -999.99 + ); + }); + it('Get decimal number (comma notation)', () => { expect( extractNumberFromString({ locale: 'de-DE', value: '999,99' }) @@ -37,12 +47,22 @@ describe('Helper', () => { ).toEqual(99999.99); }); + it('Get negative decimal number with group (comma notation)', () => { + expect( + extractNumberFromString({ locale: 'de-DE', value: '-99.999,99' }) + ).toEqual(-99999.99); + }); + it('Get decimal number (comma notation) for locale where currency is not grouped by default', () => { expect( extractNumberFromString({ locale: 'es-ES', value: '999,99' }) ).toEqual(999.99); }); + it('Get decimal number (with hyphenated text)', () => { + expect(extractNumberFromString({ value: 'BRK-B 425.30' })).toEqual(425.3); + }); + it('Not a number', () => { expect(extractNumberFromString({ value: 'X' })).toEqual(NaN); }); diff --git a/libs/common/src/lib/helper.ts b/libs/common/src/lib/helper.ts index 6a135eef63..ad8674d815 100644 --- a/libs/common/src/lib/helper.ts +++ b/libs/common/src/lib/helper.ts @@ -209,12 +209,17 @@ export function extractNumberFromString({ value: string; }): number | undefined { try { + // Only a leading minus sign indicates a negative value. Detect it before + // stripping so that hyphens within the text cannot flip the sign. + const isNegative = value.trim().startsWith('-'); + // Remove non-numeric characters (excluding international formatting characters) const numericValue = value.replace(/[^\d.,'’\s]/g, ''); const parser = new NumberParser(locale); + const parsedValue = parser.parse(numericValue); - return parser.parse(numericValue); + return isNegative ? -parsedValue : parsedValue; } catch { return undefined; } From 849a6671eca953592db8ff7950fcda741a9d4b10 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 19 Jul 2026 17:45:41 +0200 Subject: [PATCH 27/54] Task/upgrade bull-board to version 8.1.2 (#7381) * Update bull-board to version 8.1.2 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 40 ++++++++++++++++++++-------------------- package.json | 6 +++--- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82954caa4d..f33b7ab5e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Restricted the symbol data endpoint (`GET /api/v1/symbol/:dataSource/:symbol`) to authenticated users - Removed the deprecated `auth` endpoint of the login with _Security Token_ (`GET`) - Simplified the `getHistorical()` function response in the data provider interface +- Upgraded `bull-board` from version `8.0.1` to `8.1.2` ## 3.29.0 - 2026-07-18 diff --git a/package-lock.json b/package-lock.json index ccd0388142..98547d186a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,9 +21,9 @@ "@angular/platform-browser-dynamic": "21.2.7", "@angular/router": "21.2.7", "@angular/service-worker": "21.2.7", - "@bull-board/api": "8.0.1", - "@bull-board/express": "8.0.1", - "@bull-board/nestjs": "8.0.1", + "@bull-board/api": "8.1.2", + "@bull-board/express": "8.1.2", + "@bull-board/nestjs": "8.1.2", "@codewithdan/observable-store": "2.2.15", "@date-fns/utc": "2.1.1", "@internationalized/number": "3.6.7", @@ -3548,25 +3548,25 @@ "license": "(Apache-2.0 AND BSD-3-Clause)" }, "node_modules/@bull-board/api": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@bull-board/api/-/api-8.0.1.tgz", - "integrity": "sha512-7FELJHRQPtjH9+r/DUArr4pDVU8r1yeDS9azQUzFtIbsUT5xGjyg5R1RB0I/RfwFfK5bqho/4cpzxJ/UnQjSKA==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@bull-board/api/-/api-8.1.2.tgz", + "integrity": "sha512-6NGYCIRhHJmmoCwAFA1z4lPpR/D/BdOjyERd2MMeG4Samu05FSjzKKdN55S3ga30EcXeENfYzmNn6IDmVz5OTg==", "license": "MIT", "dependencies": { "redis-info": "^3.1.0" }, "peerDependencies": { - "@bull-board/ui": "8.0.1" + "@bull-board/ui": "8.1.2" } }, "node_modules/@bull-board/express": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@bull-board/express/-/express-8.0.1.tgz", - "integrity": "sha512-VOEhLNlaaVk3mBBoREXO/Dopzr9rKK5TpOGyaCbcnpzLKlrlwhj6BAeWWreB7/3Wu+pNnbKmrAhK8OOnYdzxLg==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@bull-board/express/-/express-8.1.2.tgz", + "integrity": "sha512-IldpQLXlezJRzk1BVNJjH+Oi3NBRcBopq9bI2ndLs0R+ySK1ux+TtGDUW+eX2fl0wEHwSpuUgPBAJID695zohA==", "license": "MIT", "dependencies": { - "@bull-board/api": "8.0.1", - "@bull-board/ui": "8.0.1", + "@bull-board/api": "8.1.2", + "@bull-board/ui": "8.1.2", "ejs": "^6.0.1", "express": "^5.2.1" } @@ -3584,12 +3584,12 @@ } }, "node_modules/@bull-board/nestjs": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@bull-board/nestjs/-/nestjs-8.0.1.tgz", - "integrity": "sha512-yBB+S7ibdrcO6y01VQTzd51Qxx19bPnte5TSdA59BWSeH6oVagB+EkCqHXTbfdGrvLrwZEF3tnSCE6339nB7MQ==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@bull-board/nestjs/-/nestjs-8.1.2.tgz", + "integrity": "sha512-7sgESSitxULFSxuWIYx6zUyCgQIVFtw+s5ezGFvdh3/s2dwP2NoOQ76xJn+16cXh0EAFM+rN1f05BAtc0aLlUQ==", "license": "MIT", "peerDependencies": { - "@bull-board/api": "^8.0.1", + "@bull-board/api": "^8.1.2", "@nestjs/bull-shared": "^10.0.0 || ^11.0.0", "@nestjs/common": "^9.0.0 || ^10.0.0 || ^11.0.0", "@nestjs/core": "^9.0.0 || ^10.0.0 || ^11.0.0", @@ -3598,12 +3598,12 @@ } }, "node_modules/@bull-board/ui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@bull-board/ui/-/ui-8.0.1.tgz", - "integrity": "sha512-gKEGSD8dlUoWFGJJ4I4Q5bDtfB7yJwGfpgA2DVn1G1TzlUSN5n4fzzcGpLf5fS+QhR7tB/niydUiFRQ2zrjVrQ==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@bull-board/ui/-/ui-8.1.2.tgz", + "integrity": "sha512-gC5u9XUSiRile4/VC+WHXtaPvfZV4Mrrz8MSvPe32Hjl2MXStfSuEOb+9Tw/WMpNSZ442tGpFZLz0RDh1Yo3jg==", "license": "MIT", "dependencies": { - "@bull-board/api": "8.0.1" + "@bull-board/api": "8.1.2" } }, "node_modules/@cacheable/utils": { diff --git a/package.json b/package.json index 14d4f5f112..4355877fd7 100644 --- a/package.json +++ b/package.json @@ -65,9 +65,9 @@ "@angular/platform-browser-dynamic": "21.2.7", "@angular/router": "21.2.7", "@angular/service-worker": "21.2.7", - "@bull-board/api": "8.0.1", - "@bull-board/express": "8.0.1", - "@bull-board/nestjs": "8.0.1", + "@bull-board/api": "8.1.2", + "@bull-board/express": "8.1.2", + "@bull-board/nestjs": "8.1.2", "@codewithdan/observable-store": "2.2.15", "@date-fns/utc": "2.1.1", "@internationalized/number": "3.6.7", From d02db5002e7d139c045daef2252c3d89d312499b Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 19 Jul 2026 17:47:46 +0200 Subject: [PATCH 28/54] Release 3.30.0 (#7382) --- 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 f33b7ab5e3..f83aa49b34 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 +## 3.30.0 - 2026-07-19 ### Added diff --git a/package-lock.json b/package-lock.json index 98547d186a..946b8a0a58 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "3.29.0", + "version": "3.30.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "3.29.0", + "version": "3.30.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 4355877fd7..0376d9877b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "3.29.0", + "version": "3.30.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 759588aef1cd9215a536da39c174374d4afeaffd Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 20 Jul 2026 19:50:34 +0200 Subject: [PATCH 29/54] Bugfix/copy coupon code to clipboard (#7386) Improve copy coupon code to clipboard --- .../admin-overview.component.ts | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/apps/client/src/app/components/admin-overview/admin-overview.component.ts b/apps/client/src/app/components/admin-overview/admin-overview.component.ts index 62bc78df16..0bed8111fb 100644 --- a/apps/client/src/app/components/admin-overview/admin-overview.component.ts +++ b/apps/client/src/app/components/admin-overview/admin-overview.component.ts @@ -213,9 +213,16 @@ export class GfAdminOverviewComponent implements OnInit { duration: this.couponDuration }; + const hasCopiedCouponCode = this.clipboard.copy(newCoupon.code); + const coupons = [...this.couponsDataSource.data, newCoupon]; - this.saveCoupons({ coupons, codeToCopy: newCoupon.code }); + this.saveCoupons({ + coupons, + snackBarMessage: hasCopiedCouponCode + ? '✅ ' + $localize`${newCoupon.code} has been copied to the clipboard` + : '✅ ' + $localize`Coupon ${newCoupon.code} has been created` + }); } protected onChangeCouponDuration(aCouponDuration: StringValue) { @@ -374,11 +381,11 @@ export class GfAdminOverviewComponent implements OnInit { } private saveCoupons({ - codeToCopy, - coupons + coupons, + snackBarMessage }: { - codeToCopy?: string; coupons: Coupon[]; + snackBarMessage?: string; }) { this.dataService .putAdminSetting(PROPERTY_COUPONS, { @@ -388,14 +395,10 @@ export class GfAdminOverviewComponent implements OnInit { .subscribe(() => { this.couponsDataSource.data = coupons; - if (codeToCopy) { - this.clipboard.copy(codeToCopy); - - this.snackBar.open( - '✅ ' + $localize`${codeToCopy} has been copied to the clipboard`, - undefined, - { duration: ms('3 seconds') } - ); + if (snackBarMessage) { + this.snackBar.open(snackBarMessage, undefined, { + duration: ms('3 seconds') + }); } this.changeDetectorRef.markForCheck(); From d6295167e03ed0a8888e76fa280c0b652b44b3ff Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 20 Jul 2026 19:55:21 +0200 Subject: [PATCH 30/54] Bugfix/eliminate unresolved page title and range not satisfiable error (#7387) * Eliminate unresolved page title and RangeNotSatisfiableError * Update changelog --- CHANGELOG.md | 11 ++++++ apps/api/src/app/app.module.ts | 26 +------------ apps/api/src/main.ts | 3 ++ .../middlewares/html-template.middleware.ts | 8 +++- .../language-redirect.middleware.ts | 37 +++++++++++++++++++ apps/client/project.json | 3 -- apps/client/src/assets/index.html | 0 apps/client/src/index.html | 2 +- 8 files changed, 60 insertions(+), 30 deletions(-) create mode 100644 apps/api/src/middlewares/language-redirect.middleware.ts delete mode 100644 apps/client/src/assets/index.html diff --git a/CHANGELOG.md b/CHANGELOG.md index f83aa49b34..49923248a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Changed + +- Refactored the language redirect of the root path from the static file serving configuration to a dedicated middleware + +### Fixed + +- Fixed the `RangeNotSatisfiableError` for requests with a `Range` header to the root path caused by the empty `index.html` placeholder +- Fixed the unresolved template literal in the page title while the app is loading from the service worker cache + ## 3.30.0 - 2026-07-19 ### Added diff --git a/apps/api/src/app/app.module.ts b/apps/api/src/app/app.module.ts index 4bdd50c9e8..bd76ef49b4 100644 --- a/apps/api/src/app/app.module.ts +++ b/apps/api/src/app/app.module.ts @@ -14,8 +14,6 @@ import { DataGatheringQueueModule } from '@ghostfolio/api/services/queues/data-g import { PortfolioSnapshotQueueModule } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.module'; import { BULL_BOARD_ROUTE, - DEFAULT_LANGUAGE_CODE, - SUPPORTED_LANGUAGE_CODES, THROTTLE_DEFAULT_LIMIT, THROTTLE_DEFAULT_TTL } from '@ghostfolio/common/config'; @@ -143,29 +141,7 @@ import { UserModule } from './user/user.module'; '/api/*wildcard', '/sitemap.xml' ], - rootPath: join(__dirname, '..', 'client'), - serveStaticOptions: { - setHeaders: (res) => { - if (res.req?.path === '/') { - let languageCode = DEFAULT_LANGUAGE_CODE; - - try { - const code = res.req.headers['accept-language'] - .split(',')[0] - .split('-')[0]; - - if ( - (SUPPORTED_LANGUAGE_CODES as readonly string[]).includes(code) - ) { - languageCode = code; - } - } catch {} - - res.set('Location', `/${languageCode}`); - res.statusCode = StatusCodes.MOVED_PERMANENTLY; - } - } - } + rootPath: join(__dirname, '..', 'client') }), ServeStaticModule.forRoot({ rootPath: join(__dirname, '..', 'client', '.well-known'), diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index 33ad032e98..77d571ea0b 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -1,3 +1,4 @@ +import { languageRedirectMiddleware } from '@ghostfolio/api/middlewares/language-redirect.middleware'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { BULL_BOARD_ROUTE, @@ -100,6 +101,8 @@ async function bootstrap() { }); } + app.use(languageRedirectMiddleware); + const configurationService = app.get(ConfigurationService); const trustProxy = configurationService.get('TRUST_PROXY'); diff --git a/apps/api/src/middlewares/html-template.middleware.ts b/apps/api/src/middlewares/html-template.middleware.ts index bdace34024..928a9f22c5 100644 --- a/apps/api/src/middlewares/html-template.middleware.ts +++ b/apps/api/src/middlewares/html-template.middleware.ts @@ -111,7 +111,13 @@ export class HtmlTemplateMiddleware implements NestMiddleware { ); try { - map[languageCode] = readFileSync(indexHtmlPath, 'utf8'); + // Restore the interpolation token which the template replaces with a + // static fallback title to avoid showing an unresolved template + // literal when served without interpolation (e.g. by the service worker) + map[languageCode] = readFileSync(indexHtmlPath, 'utf8').replace( + /.*?<\/title>/, + '<title>${title}' + ); } catch { this.logger.warn( `Skipping language '${languageCode}': ${indexHtmlPath} not found` diff --git a/apps/api/src/middlewares/language-redirect.middleware.ts b/apps/api/src/middlewares/language-redirect.middleware.ts new file mode 100644 index 0000000000..5b6fac6c43 --- /dev/null +++ b/apps/api/src/middlewares/language-redirect.middleware.ts @@ -0,0 +1,37 @@ +import { environment } from '@ghostfolio/api/environments/environment'; +import { + DEFAULT_LANGUAGE_CODE, + SUPPORTED_LANGUAGE_CODES +} from '@ghostfolio/common/config'; + +import { NextFunction, Request, Response } from 'express'; +import { StatusCodes } from 'http-status-codes'; + +export function languageRedirectMiddleware( + request: Request, + response: Response, + next: NextFunction +) { + if ( + !environment.production || + request.path !== '/' || + !['GET', 'HEAD'].includes(request.method) + ) { + return next(); + } + + let languageCode = DEFAULT_LANGUAGE_CODE; + + try { + const code = request.headers['accept-language'].split(',')[0].split('-')[0]; + + if ((SUPPORTED_LANGUAGE_CODES as readonly string[]).includes(code)) { + languageCode = code; + } + } catch {} + + return response.redirect( + StatusCodes.MOVED_PERMANENTLY, + `/${languageCode}${request.url.slice(1)}` + ); +} diff --git a/apps/client/project.json b/apps/client/project.json index 9b0e8dafe2..c6367144ee 100644 --- a/apps/client/project.json +++ b/apps/client/project.json @@ -203,9 +203,6 @@ { "command": "shx cp apps/client/src/assets/favicon.ico dist/apps/client" }, - { - "command": "shx cp apps/client/src/assets/index.html dist/apps/client" - }, { "command": "shx cp apps/client/src/assets/robots.txt dist/apps/client" }, diff --git a/apps/client/src/assets/index.html b/apps/client/src/assets/index.html deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/apps/client/src/index.html b/apps/client/src/index.html index c923e3e0c5..61953bca8d 100644 --- a/apps/client/src/index.html +++ b/apps/client/src/index.html @@ -1,7 +1,7 @@ - ${title} + Ghostfolio From 960d1bb5ea4fb5b4cca8a91a7db44f3805005c60 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 20 Jul 2026 20:20:22 +0200 Subject: [PATCH 31/54] Task/upgrade yahoo-finance2 to version 4.0.0 (#7371) * Update yahoo-finance2 to version 4.0.0 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 241 +++++++++++----------------------------------- package.json | 2 +- 3 files changed, 59 insertions(+), 185 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49923248a7..94252a0e1f 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 - Refactored the language redirect of the root path from the static file serving configuration to a dedicated middleware +- Upgraded `yahoo-finance2` from version `3.15.4` to `4.0.0` ### Fixed diff --git a/package-lock.json b/package-lock.json index 946b8a0a58..a5dca0bd7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -97,7 +97,7 @@ "tablemark": "4.1.0", "twitter-api-v2": "1.29.0", "undici": "8.5.0", - "yahoo-finance2": "3.15.4", + "yahoo-finance2": "4.0.0", "zod": "4.4.3", "zone.js": "0.16.1" }, @@ -20588,13 +20588,16 @@ } }, "node_modules/fetch-mock-cache": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/fetch-mock-cache/-/fetch-mock-cache-2.3.1.tgz", - "integrity": "sha512-hDk+Nbt0Y8Aq7KTEU6ASQAcpB34UjhkpD3QjzD6yvEKP4xVElAqXrjQ7maL+LYMGafx51Zq6qUfDM57PNu/qMw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fetch-mock-cache/-/fetch-mock-cache-3.1.0.tgz", + "integrity": "sha512-VxdIstx7qhqW9+9AOjYAlxEguX9HnBFdSaydlwLiZR+xAldGdZMLmSn8pYLd6hNh3vjcIcqUkgFgcdcPomctFg==", "license": "MIT", "dependencies": { "debug": "^4.3.4", - "filenamify-url": "2.1.2" + "filenamify-url": "4.0.0" + }, + "engines": { + "node": ">=22.0.0" } }, "node_modules/figures": { @@ -20688,42 +20691,43 @@ } }, "node_modules/filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-4.0.0.tgz", + "integrity": "sha512-9ZT504KxEQDamsOogZImAWGEN24R1uFAxU3ZS4AZqn2ooidmN68Olh7n4/RcA4lLatZztjA0ZSuxeLHVoCc8JA==", "license": "MIT", "engines": { - "node": ">=4" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/filenamify": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", - "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-7.0.2.tgz", + "integrity": "sha512-fz10TUqSZ1lG7ftW1KnRotJzMD8YRb6kaAQKpZJBLvqXXfFgIEpuazy1w2lK3zhMiBSdH/uF9LFlv5smJ2Jl1w==", "license": "MIT", "dependencies": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.1", - "trim-repeated": "^1.0.0" + "filename-reserved-regex": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/filenamify-url": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/filenamify-url/-/filenamify-url-2.1.2.tgz", - "integrity": "sha512-3rMbAr7vDNMOGsj1aMniQFl749QjgM+lMJ/77ZRSPTIgxvolZwoQbn8dXLs7xfd+hAdli+oTnSWZNkJJLWQFEQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/filenamify-url/-/filenamify-url-4.0.0.tgz", + "integrity": "sha512-dhK3TuWC6dbKMgL3Li3qlsd6wHZ2bXJXt2VJw+D8mPIXCTLtet+sRmK6/t1cseuWjYRdMa4gNb7c2H6D8J0Jig==", "license": "MIT", "dependencies": { - "filenamify": "^4.3.0", - "humanize-url": "^2.1.1" + "filenamify": "^7.0.0", + "humanize-url": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -22334,15 +22338,18 @@ } }, "node_modules/humanize-url": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/humanize-url/-/humanize-url-2.1.1.tgz", - "integrity": "sha512-V4nxsPGNE7mPjr1qDp471YfW8nhBiTRWrG/4usZlpvFU8I7gsV7Jvrrzv/snbLm5dWO3dr1ennu2YqnhTWFmYA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/humanize-url/-/humanize-url-3.0.0.tgz", + "integrity": "sha512-oWcYrKNVa+bCX9ACFZ85H8l1+QcwBJ64xH5+PHYoLe/Y5aToOfw3s3OZqRA/OyJPcWOXuDLo3qil5CYvTMtp0A==", "license": "MIT", "dependencies": { - "normalize-url": "^4.5.1" + "normalize-url": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/husky": { @@ -26726,12 +26733,15 @@ } }, "node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-7.2.0.tgz", + "integrity": "sha512-uhXOdZry0L6M2UIo9BTt7FdpBDiAGN/7oItedQwPKh8jh31ZlvC8U9Xl/EJ3aijDHaywXTW3QbZ6LuCocur1YA==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/npm-bundled": { @@ -29305,18 +29315,6 @@ "license": "MIT", "optional": true }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, "node_modules/pump": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", @@ -29332,6 +29330,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -29387,12 +29386,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "license": "MIT" - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -29996,6 +29989,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, "license": "MIT" }, "node_modules/resolve": { @@ -32406,27 +32400,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-outer/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/stripe": { "version": "22.3.2", "resolved": "https://registry.npmjs.org/stripe/-/stripe-22.3.2.tgz", @@ -33058,9 +33031,7 @@ "version": "7.0.28", "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.28.tgz", "integrity": "sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==", - "dev": true, "license": "MIT", - "peer": true, "dependencies": { "tldts-core": "^7.0.28" }, @@ -33072,9 +33043,7 @@ "version": "7.0.28", "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.28.tgz", "integrity": "sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==", - "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/tmp": { "version": "0.2.7", @@ -33137,9 +33106,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", - "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "tldts": "^7.0.5" }, @@ -33148,39 +33115,15 @@ } }, "node_modules/tough-cookie-file-store": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tough-cookie-file-store/-/tough-cookie-file-store-2.0.3.tgz", - "integrity": "sha512-sMpZVcmFf6EYFHFFl+SYH4W1/OnXBYMGDsv2IlbQ2caHyFElW/UR/gpj/KYU1JwmP4dE9xqwv2+vWcmlXHojSw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/tough-cookie-file-store/-/tough-cookie-file-store-3.3.0.tgz", + "integrity": "sha512-FbO/cOi/jp4wweo8soVNG/ZjDsgpBZWqaxWwu7gRKvsjg/Qt44kStp87VLfJnin749DlTbZDYvV1wuSr5jly2g==", "license": "MIT", "dependencies": { - "tough-cookie": "^4.0.0" + "tough-cookie": "^6.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie-file-store/node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie-file-store/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" + "node": ">=16" } }, "node_modules/tr46": { @@ -33224,27 +33167,6 @@ "tree-kill": "cli.js" } }, - "node_modules/trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/trim-repeated/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/ts-api-utils": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", @@ -34355,16 +34277,6 @@ "dev": true, "license": "MIT" }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "node_modules/use-sync-external-store": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", @@ -35960,18 +35872,18 @@ } }, "node_modules/yahoo-finance2": { - "version": "3.15.4", - "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-3.15.4.tgz", - "integrity": "sha512-90eOw76iqS//ksQGL4d/VcchbysnpWzFXVuiBtG7uuImlBDdxBA0BtccxCuTvVZDDu1aXm1TqBGc+MPr6wNkyQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-4.0.0.tgz", + "integrity": "sha512-3AUMLycIxGSKEf99nEedmsccBLAXyVajCfKlY+Vxsxx6ntsDlFYN1UdL6APGMFiRs8IBivn62eJT4Zj3WQdrlw==", "license": "MIT", "dependencies": { "@deno/shim-deno": "~0.18.0", "@modelcontextprotocol/sdk": "npm:@modelcontextprotocol/sdk@^1.26.0", - "fetch-mock-cache": "npm:fetch-mock-cache@^2.1.3", + "fetch-mock-cache": "npm:fetch-mock-cache@^3.1.0", "json-schema": "^0.4.0", - "tough-cookie": "npm:tough-cookie@^5.1.1", - "tough-cookie-file-store": "npm:tough-cookie-file-store@^2.0.3", - "zod": "npm:zod@^3.25.0" + "tough-cookie": "npm:tough-cookie@^6.0.0", + "tough-cookie-file-store": "npm:tough-cookie-file-store@^3.0.0", + "zod": "npm:zod@^4.0.0" }, "bin": { "yahoo-finance": "esm/bin/yahoo-finance.js", @@ -35979,46 +35891,7 @@ "yahoo-finance2": "esm/bin/yahoo-finance.js" }, "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/yahoo-finance2/node_modules/tldts": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", - "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", - "license": "MIT", - "dependencies": { - "tldts-core": "^6.1.86" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/yahoo-finance2/node_modules/tldts-core": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", - "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", - "license": "MIT" - }, - "node_modules/yahoo-finance2/node_modules/tough-cookie": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", - "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^6.1.32" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/yahoo-finance2/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" + "node": ">=22.0.0" } }, "node_modules/yallist": { diff --git a/package.json b/package.json index 0376d9877b..f5dd23f678 100644 --- a/package.json +++ b/package.json @@ -141,7 +141,7 @@ "tablemark": "4.1.0", "twitter-api-v2": "1.29.0", "undici": "8.5.0", - "yahoo-finance2": "3.15.4", + "yahoo-finance2": "4.0.0", "zod": "4.4.3", "zone.js": "0.16.1" }, From 90a3fed6522c45f249510ab084d8f65c026f0229 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 20 Jul 2026 20:20:51 +0200 Subject: [PATCH 32/54] Task/remove deprecated SymbolProfile from activity interface (#7360) * Removed deprecated SymbolProfile from activity interface * Update changelog --- CHANGELOG.md | 1 + .../src/app/activities/activities.service.ts | 20 +------------------ .../app/endpoints/public/public.controller.ts | 3 +-- apps/api/src/app/import/import.service.ts | 5 +---- ...orm-data-source-in-response.interceptor.ts | 8 -------- libs/common/src/lib/config.ts | 14 ------------- .../lib/interfaces/activities.interface.ts | 6 ------ .../public-portfolio-response.interface.ts | 6 ------ 8 files changed, 4 insertions(+), 59 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94252a0e1f..973fa34651 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 +- Removed the deprecated `SymbolProfile` field from the activity interface - Refactored the language redirect of the root path from the static file serving configuration to a dedicated middleware - Upgraded `yahoo-finance2` from version `3.15.4` to `4.0.0` diff --git a/apps/api/src/app/activities/activities.service.ts b/apps/api/src/app/activities/activities.service.ts index df616a5dde..459293abdd 100644 --- a/apps/api/src/app/activities/activities.service.ts +++ b/apps/api/src/app/activities/activities.service.ts @@ -499,23 +499,6 @@ export class ActivitiesService { id: balanceItem.id, isDraft: false, quantity: 1, - SymbolProfile: { - activitiesCount: 0, - assetClass: AssetClass.LIQUIDITY, - assetSubClass: AssetSubClass.CASH, - countries: [], - createdAt: new Date(balanceItem.date), - currency: account.currency, - dataSource: - this.dataProviderService.getDataSourceForExchangeRates(), - holdings: [], - id: account.currency, - isActive: true, - name: account.currency, - sectors: [], - symbol: account.currency, - updatedAt: new Date(balanceItem.date) - }, symbolProfileId: account.currency, type: ActivityType.BUY, unitPrice: 1, @@ -862,8 +845,7 @@ export class ActivitiesService { feeInBaseCurrency, unitPriceInAssetProfileCurrency, value, - valueInBaseCurrency, - SymbolProfile: assetProfile + valueInBaseCurrency }; }) ); diff --git a/apps/api/src/app/endpoints/public/public.controller.ts b/apps/api/src/app/endpoints/public/public.controller.ts index a87d36218e..9bd2a78a84 100644 --- a/apps/api/src/app/endpoints/public/public.controller.ts +++ b/apps/api/src/app/endpoints/public/public.controller.ts @@ -129,8 +129,7 @@ export class PublicController { type, unitPrice, value, - valueInBaseCurrency, - SymbolProfile: assetProfile + valueInBaseCurrency }; } ); diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 07019e6947..b706baa8d5 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -153,7 +153,6 @@ export class ImportService { feeInBaseCurrency: 0, id: assetProfile.id, isDraft: false, - SymbolProfile: assetProfile, symbolProfileId: assetProfile.id, type: 'DIVIDEND', unitPrice: marketPrice, @@ -623,9 +622,7 @@ export class ImportService { assetProfile, error, value, - valueInBaseCurrency, - // @ts-ignore - SymbolProfile: assetProfile + valueInBaseCurrency }); } diff --git a/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts b/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts index 4e75ee9b71..6b38b2d54b 100644 --- a/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts +++ b/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts @@ -80,10 +80,6 @@ export class TransformDataSourceInResponseInterceptor< paths: [ 'activities[*].assetProfile.dataSource', 'activities[*].dataSource', - - /* @deprecated */ - 'activities[*].SymbolProfile.dataSource', - 'assetProfile.dataSource', 'benchmarks[*].dataSource', 'errors[*].dataSource', @@ -92,10 +88,6 @@ export class TransformDataSourceInResponseInterceptor< 'holdings[*].assetProfile.dataSource', 'holdings[*].dataSource', 'items[*].dataSource', - - /* @deprecated */ - 'SymbolProfile.dataSource', - 'watchlist[*].dataSource' ] }); diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index a5363372a9..6b070755f2 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -110,13 +110,6 @@ export const DEFAULT_REDACTED_PATHS = [ 'activities[*].feeInAssetProfileCurrency', 'activities[*].feeInBaseCurrency', 'activities[*].quantity', - - /* @deprecated */ - 'activities[*].SymbolProfile.symbolMapping', - - /* @deprecated */ - 'activities[*].SymbolProfile.watchedByCount', - 'activities[*].value', 'activities[*].valueInBaseCurrency', 'balance', @@ -147,13 +140,6 @@ export const DEFAULT_REDACTED_PATHS = [ 'platforms[*].balance', 'platforms[*].valueInBaseCurrency', 'quantity', - - /* @deprecated */ - 'SymbolProfile.symbolMapping', - - /* @deprecated */ - 'SymbolProfile.watchedByCount', - 'totalBalanceInBaseCurrency', 'totalDividendInBaseCurrency', 'totalInterestInBaseCurrency', diff --git a/libs/common/src/lib/interfaces/activities.interface.ts b/libs/common/src/lib/interfaces/activities.interface.ts index 1cc867d6e3..66c310cf4c 100644 --- a/libs/common/src/lib/interfaces/activities.interface.ts +++ b/libs/common/src/lib/interfaces/activities.interface.ts @@ -9,12 +9,6 @@ export interface Activity extends Order { error?: ActivityError; feeInAssetProfileCurrency: number; feeInBaseCurrency: number; - - /** - * @deprecated Use `assetProfile` instead - */ - SymbolProfile?: EnhancedSymbolProfile; - tagIds?: string[]; tags?: Tag[]; unitPriceInAssetProfileCurrency: number; diff --git a/libs/common/src/lib/interfaces/responses/public-portfolio-response.interface.ts b/libs/common/src/lib/interfaces/responses/public-portfolio-response.interface.ts index 04c8e0c073..3302f635a7 100644 --- a/libs/common/src/lib/interfaces/responses/public-portfolio-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/public-portfolio-response.interface.ts @@ -27,12 +27,6 @@ export interface PublicPortfolioResponse extends PublicPortfolioResponseV1 { 'currency' | 'date' | 'fee' | 'quantity' | 'type' | 'unitPrice' > & { assetProfile?: EnhancedSymbolProfile; - - /** - * @deprecated Use `assetProfile` instead - */ - SymbolProfile?: EnhancedSymbolProfile; - value: number; valueInBaseCurrency: number; })[]; From 2b78c2a8c1c8ffe97a4cf4bc026d34acdc8fbb86 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 20 Jul 2026 20:23:34 +0200 Subject: [PATCH 33/54] Release 3.31.0 (#7388) --- 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 973fa34651..ac4ba04b5f 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 +## 3.31.0 - 2026-07-20 ### Changed diff --git a/package-lock.json b/package-lock.json index a5dca0bd7e..107c23c2ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "3.30.0", + "version": "3.31.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "3.30.0", + "version": "3.31.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index f5dd23f678..c3329e55e8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "3.30.0", + "version": "3.31.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 72663fe40a1fa67a015c035c907b1456d5bf8689 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 21 Jul 2026 21:10:37 +0200 Subject: [PATCH 34/54] Task/refactor isAfter() with isFuture() and isPast() (#7389) Refactor isAfter() with isFuture() and isPast() --- .../src/app/portfolio/calculator/portfolio-calculator.ts | 6 ++++-- apps/api/src/services/benchmark/benchmark.service.ts | 4 ++-- .../investment-chart/investment-chart.component.ts | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index cee94f0208..c1e795c4af 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -51,6 +51,8 @@ import { format, isAfter, isBefore, + isFuture, + isPast, isWithinInterval, min, startOfDay, @@ -134,7 +136,7 @@ export abstract class PortfolioCalculator { dateOfFirstActivity = date; } - if (isAfter(date, new Date())) { + if (isFuture(date)) { // Adapt date to today if activity is in future (e.g. liability) // to include it in the interval date = endOfDay(new Date()); @@ -1113,7 +1115,7 @@ export abstract class PortfolioCalculator { portfolioSnapshot ); - if (isAfter(new Date(), new Date(expiration))) { + if (isPast(new Date(expiration))) { isCachedPortfolioSnapshotExpired = true; } } catch {} diff --git a/apps/api/src/services/benchmark/benchmark.service.ts b/apps/api/src/services/benchmark/benchmark.service.ts index 99ceaf21ef..affb0da08f 100644 --- a/apps/api/src/services/benchmark/benchmark.service.ts +++ b/apps/api/src/services/benchmark/benchmark.service.ts @@ -23,7 +23,7 @@ import { BenchmarkTrend } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; import { SymbolProfile } from '@prisma/client'; import { Big } from 'big.js'; -import { addHours, isAfter, subDays } from 'date-fns'; +import { addHours, isPast, subDays } from 'date-fns'; import { round, uniqBy } from 'lodash'; import ms from 'ms'; @@ -94,7 +94,7 @@ export class BenchmarkService { this.logger.debug('Fetched benchmarks from cache'); - if (isAfter(new Date(), new Date(expiration))) { + if (isPast(new Date(expiration))) { this.calculateAndCacheBenchmarks({ enableSharing }); 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 dc3152f120..3aa65b9983 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 @@ -41,7 +41,7 @@ import { } from 'chart.js'; import 'chartjs-adapter-date-fns'; import { type AnnotationOptions } from 'chartjs-plugin-annotation'; -import { isAfter } from 'date-fns'; +import { isFuture } from 'date-fns'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; @Component({ @@ -311,6 +311,6 @@ export class GfInvestmentChartComponent implements OnChanges, OnDestroy { return undefined; } - return isAfter(new Date(xValue), new Date()) ? aValue : undefined; + return isFuture(new Date(xValue)) ? aValue : undefined; } } From a20d394e0b2c8a10ad530f5de5860142d6d0d8c4 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 22 Jul 2026 17:03:13 +0200 Subject: [PATCH 35/54] Bugfix/improve error handling in access endpoints (#7392) * Improve error handling * Update changelog --- CHANGELOG.md | 6 ++++++ apps/api/src/app/access/access.controller.ts | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac4ba04b5f..3665b66adc 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 + +- Improved the error handling in the access endpoints (`POST` and `PUT`) to return `400 Bad Request` when granting access to a non-existent user + ## 3.31.0 - 2026-07-20 ### Changed diff --git a/apps/api/src/app/access/access.controller.ts b/apps/api/src/app/access/access.controller.ts index 35b1d485b0..d692f358df 100644 --- a/apps/api/src/app/access/access.controller.ts +++ b/apps/api/src/app/access/access.controller.ts @@ -87,7 +87,7 @@ export class AccessController { } try { - return this.accessService.createAccess({ + return await this.accessService.createAccess({ alias: data.alias || undefined, granteeUser: data.granteeUserId ? { connect: { id: data.granteeUserId } } @@ -155,7 +155,7 @@ export class AccessController { } try { - return this.accessService.updateAccess({ + return await this.accessService.updateAccess({ data: { alias: data.alias, granteeUser: data.granteeUserId From ca8c4e6236ec8514362c1b7a89a04c5f86632304 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 22 Jul 2026 17:17:53 +0200 Subject: [PATCH 36/54] Bugfix/handle exception in holding detail endpoint for cash positions (#7391) * Handle exception for cash positions * Update changelog --- CHANGELOG.md | 1 + .../src/app/portfolio/portfolio.service.ts | 65 +++++++++++-------- 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3665b66adc..1a21ab9a4b 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 ### Fixed +- Resolved an exception in the `GET api/v1/portfolio/holding/:dataSource/:symbol` endpoint for cash positions - Improved the error handling in the access endpoints (`POST` and `PUT`) to return `400 Bad Request` when granting access to a non-existent user ## 3.31.0 - 2026-07-20 diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 6617b8f9b1..b3e86e0502 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -783,10 +783,24 @@ export class PortfolioService { return undefined; } - const [SymbolProfile] = await this.symbolProfileService.getSymbolProfiles([ + const [symbolProfile] = await this.symbolProfileService.getSymbolProfiles([ { dataSource, symbol } ]); + const assetProfile = + symbolProfile ?? + ({ + dataSource, + symbol, + assetClass: AssetClass.LIQUIDITY, + assetSubClass: AssetSubClass.CASH, + countries: [], + currency: symbol, + holdings: [], + name: symbol, + sectors: [] + } as EnhancedSymbolProfile); + const portfolioCalculator = this.calculatorFactory.createCalculator({ activities, userId, @@ -829,9 +843,10 @@ export class PortfolioService { timeWeightedInvestmentWithCurrencyEffect } = holding; - const activitiesOfHolding = activities.filter(({ assetProfile }) => { + const activitiesOfHolding = activities.filter((activity) => { return ( - assetProfile.dataSource === dataSource && assetProfile.symbol === symbol + activity.assetProfile.dataSource === dataSource && + activity.assetProfile.symbol === symbol ); }); @@ -863,19 +878,17 @@ export class PortfolioService { new Date() ); + const [firstActivity] = activitiesOfHolding; + const referenceUnitPrice = + firstActivity?.unitPriceInAssetProfileCurrency ?? marketPrice; + const historicalDataArray: HistoricalDataItem[] = []; - let marketPriceMax = Math.max( - activitiesOfHolding[0].unitPriceInAssetProfileCurrency, - marketPrice - ); + let marketPriceMax = Math.max(referenceUnitPrice, marketPrice); let marketPriceMaxDate = - marketPrice > activitiesOfHolding[0].unitPriceInAssetProfileCurrency + marketPrice > referenceUnitPrice ? new Date() - : activitiesOfHolding[0].date; - let marketPriceMin = Math.min( - activitiesOfHolding[0].unitPriceInAssetProfileCurrency, - marketPrice - ); + : (firstActivity?.date ?? new Date()); + let marketPriceMin = Math.min(referenceUnitPrice, marketPrice); const historicalDataItems = historicalData[getAssetProfileIdentifier({ dataSource, symbol })]; @@ -926,10 +939,10 @@ export class PortfolioService { } else { // Add historical entry for buy date, if no historical data available historicalDataArray.push({ - averagePrice: activitiesOfHolding[0].unitPriceInAssetProfileCurrency, + averagePrice: referenceUnitPrice, date: dateOfFirstActivity, - marketPrice: activitiesOfHolding[0].unitPriceInAssetProfileCurrency, - quantity: activitiesOfHolding[0].quantity + marketPrice: referenceUnitPrice, + quantity: firstActivity?.quantity ?? quantity.toNumber() }); } @@ -947,16 +960,16 @@ export class PortfolioService { marketPriceMin, tags, assetProfile: { - assetClass: SymbolProfile.assetClass, - assetSubClass: SymbolProfile.assetSubClass, - countries: SymbolProfile.countries, - currency: SymbolProfile.currency, - dataSource: SymbolProfile.dataSource, - isin: SymbolProfile.isin, - name: SymbolProfile.name, - sectors: SymbolProfile.sectors, - symbol: SymbolProfile.symbol, - userId: SymbolProfile.userId + assetClass: assetProfile.assetClass, + assetSubClass: assetProfile.assetSubClass, + countries: assetProfile.countries, + currency: assetProfile.currency, + dataSource: assetProfile.dataSource, + isin: assetProfile.isin, + name: assetProfile.name, + sectors: assetProfile.sectors, + symbol: assetProfile.symbol, + userId: assetProfile.userId }, averagePrice: averagePrice.toNumber(), dataProviderInfo: portfolioCalculator.getDataProviderInfos()?.[0], From 347d7efee5edc97cbe75e098cda06053dd260b92 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 22 Jul 2026 17:29:47 +0200 Subject: [PATCH 37/54] Bugfix/skip opening holding detail dialog for cash positions (#7390) * Skip opening holding detail dialog for cash positions * Update changelog --- CHANGELOG.md | 1 + .../allocations/allocations-page.component.ts | 7 ++- .../analysis/analysis-page.component.ts | 8 ++- libs/common/src/lib/helper.ts | 10 +++- .../holdings-table.component.ts | 16 +++--- .../portfolio-proportion-chart.component.ts | 15 +++++- .../top-holdings/top-holdings.component.html | 9 +--- .../top-holdings/top-holdings.component.ts | 20 ++++++-- .../treemap-chart/treemap-chart.component.ts | 51 ++++++++++++------- 9 files changed, 91 insertions(+), 46 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a21ab9a4b..d073e016bf 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 ### Fixed +- Skipped opening the holding detail dialog for cash positions on the allocations page, the analysis page and the portfolio holdings page - Resolved an exception in the `GET api/v1/portfolio/holding/:dataSource/:symbol` endpoint for cash positions - Improved the error handling in the access endpoints (`POST` and `PUT`) to return `400 Bad Request` when granting access to a non-existent user 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 de00048e7c..dd2c62f98e 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 @@ -6,7 +6,10 @@ import { import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { MAX_TOP_HOLDINGS, UNKNOWN_KEY } from '@ghostfolio/common/config'; -import { getCountryName } from '@ghostfolio/common/helper'; +import { + canOpenHoldingDetail, + getCountryName +} from '@ghostfolio/common/helper'; import { AssetProfileIdentifier, HoldingWithParents, @@ -116,6 +119,7 @@ export class GfAllocationsPageComponent implements OnInit { protected symbols: { [name: string]: { dataSource?: DataSource; + isClickable?: boolean; name: string; symbol: string; value: number; @@ -498,6 +502,7 @@ export class GfAllocationsPageComponent implements OnInit { this.symbols[symbol] = { symbol, dataSource: position.assetProfile.dataSource, + isClickable: canOpenHoldingDetail(position), name: position.assetProfile.name ?? '', value: (isNumber(position.valueInBaseCurrency) diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts index ae41f54c88..5fa952a4fe 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -6,6 +6,7 @@ import { DEFAULT_DATE_RANGE, NUMERICAL_PRECISION_THRESHOLD_6_FIGURES } from '@ghostfolio/common/config'; +import { canOpenHoldingDetail } from '@ghostfolio/common/helper'; import { HistoricalDataItem, InvestmentItem, @@ -365,8 +366,11 @@ export class GfAnalysisPageComponent implements OnInit { .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe(({ holdings }) => { const holdingsSorted = sortBy( - holdings.filter(({ netPerformancePercentWithCurrencyEffect }) => { - return isNumber(netPerformancePercentWithCurrencyEffect); + holdings.filter((holding) => { + return ( + canOpenHoldingDetail(holding) && + isNumber(holding.netPerformancePercentWithCurrencyEffect) + ); }), 'netPerformancePercentWithCurrencyEffect' ).reverse(); diff --git a/libs/common/src/lib/helper.ts b/libs/common/src/lib/helper.ts index ad8674d815..7787b2a97b 100644 --- a/libs/common/src/lib/helper.ts +++ b/libs/common/src/lib/helper.ts @@ -2,6 +2,7 @@ import { NumberParser } from '@internationalized/number'; import { Type as ActivityType, AssetProfileOverrides, + AssetSubClass, MarketData, Prisma, SymbolProfile @@ -45,7 +46,8 @@ import { import { AssetProfileIdentifier, AssetProfileItem, - Benchmark + Benchmark, + PortfolioPosition } from './interfaces'; import { BenchmarkTrend, ColorScheme } from './types'; @@ -172,6 +174,12 @@ export function canDeleteUser({ return currentUserId !== userId; } +export function canOpenHoldingDetail({ + assetProfile +}: Pick): boolean { + return assetProfile?.assetSubClass !== AssetSubClass.CASH; +} + export function capitalize(aString: string) { return aString.charAt(0).toUpperCase() + aString.slice(1).toLowerCase(); } diff --git a/libs/ui/src/lib/holdings-table/holdings-table.component.ts b/libs/ui/src/lib/holdings-table/holdings-table.component.ts index 5b5a2bcfe4..7fe21720ef 100644 --- a/libs/ui/src/lib/holdings-table/holdings-table.component.ts +++ b/libs/ui/src/lib/holdings-table/holdings-table.component.ts @@ -1,4 +1,8 @@ -import { getLocale, getLowercase } from '@ghostfolio/common/helper'; +import { + canOpenHoldingDetail, + getLocale, + getLowercase +} from '@ghostfolio/common/helper'; import { AssetProfileIdentifier, PortfolioPosition @@ -20,7 +24,6 @@ import { MatDialogModule } from '@angular/material/dialog'; import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator'; import { MatSort, MatSortModule } from '@angular/material/sort'; import { MatTableDataSource, MatTableModule } from '@angular/material/table'; -import { AssetSubClass } from '@prisma/client'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { GfEntityLogoComponent } from '../entity-logo/entity-logo.component'; @@ -79,10 +82,6 @@ export class GfHoldingsTableComponent { return columns; }); - protected readonly ignoreAssetSubClasses: AssetSubClass[] = [ - AssetSubClass.CASH - ]; - protected readonly isLoading = computed(() => !this.holdings()); public constructor() { @@ -101,10 +100,7 @@ export class GfHoldingsTableComponent { } protected canShowDetails(holding: PortfolioPosition): boolean { - return ( - this.hasPermissionToOpenDetails() && - !this.ignoreAssetSubClasses.includes(holding.assetProfile.assetSubClass) - ); + return this.hasPermissionToOpenDetails() && canOpenHoldingDetail(holding); } protected onOpenHoldingDialog({ 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 e24446c342..b50f89a8eb 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 @@ -66,6 +66,7 @@ export class GfPortfolioProportionChartComponent @Input() data: { [symbol: string]: Pick & { dataSource?: DataSource; + isClickable?: boolean; name: string; value: number; }; @@ -356,6 +357,10 @@ export class GfPortfolioProportionChartComponent const dataIndex = activeElements[0].index; const symbol = chart.data.labels?.[dataIndex] as string; + if (this.data[symbol]?.isClickable === false) { + return; + } + const dataSource = this.data[symbol]?.dataSource; this.proportionChartClicked.emit( @@ -363,10 +368,16 @@ export class GfPortfolioProportionChartComponent ); } catch {} }, - onHover: (event, chartElement) => { + onHover: (event, chartElement, chart) => { if (this.cursor) { + const symbol = chartElement[0] + ? (chart.data.labels?.[chartElement[0].index] as string) + : undefined; + (event.native?.target as HTMLElement).style.cursor = - chartElement[0] ? this.cursor : 'default'; + symbol && this.data[symbol]?.isClickable !== false + ? this.cursor + : 'default'; } }, plugins: { diff --git a/libs/ui/src/lib/top-holdings/top-holdings.component.html b/libs/ui/src/lib/top-holdings/top-holdings.component.html index 3e09ab5bab..11900106ae 100644 --- a/libs/ui/src/lib/top-holdings/top-holdings.component.html +++ b/libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -120,13 +120,8 @@ , + activeElement: ActiveElement + ): PortfolioPosition | undefined { + if (!activeElement) { + return undefined; + } + + const dataset = orderBy( + chart.data.datasets[activeElement.datasetIndex].tree, + ['allocationInPercentage'], + ['desc'] + ) as PortfolioPosition[]; + + return dataset[activeElement.index]; + } + private initialize() { const holdings = this.holdings(); @@ -323,27 +339,24 @@ export class GfTreemapChartComponent animation: false, onClick: (_, activeElements, chart: Chart<'treemap'>) => { try { - const dataIndex = activeElements[0].index; - const datasetIndex = activeElements[0].datasetIndex; + const holding = this.getHolding(chart, activeElements[0]); - const dataset = orderBy( - chart.data.datasets[datasetIndex].tree, - ['allocationInPercentage'], - ['desc'] - ) as PortfolioPosition[]; - - const dataSource: DataSource = - dataset[dataIndex].assetProfile.dataSource; - - const symbol: string = dataset[dataIndex].assetProfile.symbol; - - this.treemapChartClicked.emit({ dataSource, symbol }); + if (holding && canOpenHoldingDetail(holding)) { + this.treemapChartClicked.emit({ + dataSource: holding.assetProfile.dataSource, + symbol: holding.assetProfile.symbol + }); + } } catch {} }, - onHover: (event, chartElement) => { + onHover: (event, chartElements, chart: Chart<'treemap'>) => { if (this.cursor()) { + const holding = this.getHolding(chart, chartElements[0]); + (event.native?.target as HTMLElement).style.cursor = - chartElement[0] ? this.cursor() : 'default'; + holding && canOpenHoldingDetail(holding) + ? this.cursor() + : 'default'; } }, plugins: { From 5b80e62ec8ed46df5362a29236efd2b4f3c8a502 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 22 Jul 2026 20:51:07 +0200 Subject: [PATCH 38/54] Task/upgrade chartjs-chart-treemap to version 4.2.0 (#7395) * Update chartjs-chart-treemap to version 4.2.0 * Update changelog --- CHANGELOG.md | 4 ++ .../treemap-chart/interfaces/interfaces.ts | 15 +++----- .../treemap-chart/treemap-chart.component.ts | 38 ++++++++++++------- package-lock.json | 8 ++-- package.json | 2 +- 5 files changed, 39 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d073e016bf..ac3660b81a 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 + +- Upgraded `chartjs-chart-treemap` from version `3.1.0` to `4.2.0` + ### Fixed - Skipped opening the holding detail dialog for cash positions on the allocations page, the analysis page and the portfolio holdings page diff --git a/libs/ui/src/lib/treemap-chart/interfaces/interfaces.ts b/libs/ui/src/lib/treemap-chart/interfaces/interfaces.ts index e8d182adb0..ffd7b0094b 100644 --- a/libs/ui/src/lib/treemap-chart/interfaces/interfaces.ts +++ b/libs/ui/src/lib/treemap-chart/interfaces/interfaces.ts @@ -1,6 +1,6 @@ import { PortfolioPosition } from '@ghostfolio/common/interfaces'; -import { ScriptableContext, TooltipItem } from 'chart.js'; +import { ScriptableContext } from 'chart.js'; import { TreemapDataPoint } from 'chartjs-chart-treemap'; export interface GetColorParams { @@ -9,13 +9,10 @@ export interface GetColorParams { positiveNetPerformancePercentsRange: { max: number; min: number }; } -interface GfTreemapDataPoint extends TreemapDataPoint { +export type GfTreemapDataPoint = TreemapDataPoint & { _data: PortfolioPosition; -} +}; -export interface GfTreemapScriptableContext extends ScriptableContext<'treemap'> { - raw: GfTreemapDataPoint; -} -export interface GfTreemapTooltipItem extends TooltipItem<'treemap'> { - raw: GfTreemapDataPoint; -} +export type GfTreemapScriptableContext = ScriptableContext<'treemap'> & { + raw: TreemapDataPoint; +}; diff --git a/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts b/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts index f26d954528..54c8d7f907 100644 --- a/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts +++ b/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -22,7 +22,12 @@ import { viewChild } from '@angular/core'; import { Big } from 'big.js'; -import type { ActiveElement, ChartData, TooltipOptions } from 'chart.js'; +import type { + ActiveElement, + ChartData, + TooltipItem, + TooltipOptions +} from 'chart.js'; import { Chart, LinearScale, Tooltip } from 'chart.js'; import { TreemapController, TreemapElement } from 'chartjs-chart-treemap'; import { isUUID } from 'class-validator'; @@ -33,8 +38,8 @@ import OpenColor from 'open-color'; import type { GetColorParams, - GfTreemapScriptableContext, - GfTreemapTooltipItem + GfTreemapDataPoint, + GfTreemapScriptableContext } from './interfaces/interfaces'; const { gray, green, red } = OpenColor; @@ -225,7 +230,9 @@ export class GfTreemapChartComponent datasets: [ { backgroundColor: (context: GfTreemapScriptableContext) => { - if (!context.raw) { + const raw = context.raw as GfTreemapDataPoint; + + if (!raw) { return undefined; } @@ -233,13 +240,10 @@ export class GfTreemapChartComponent getAnnualizedPerformancePercent({ daysInMarket: differenceInDays( endDate, - max([ - context.raw._data.dateOfFirstActivity ?? new Date(0), - startDate - ]) + max([raw._data.dateOfFirstActivity ?? new Date(0), startDate]) ), netPerformancePercentage: new Big( - context.raw._data.netPerformancePercentWithCurrencyEffect + raw._data.netPerformancePercentWithCurrencyEffect ) }).toNumber(); @@ -261,7 +265,9 @@ export class GfTreemapChartComponent labels: { align: 'left', color: (context: GfTreemapScriptableContext) => { - if (!context.raw) { + const raw = context.raw as GfTreemapDataPoint; + + if (!raw) { return undefined; } @@ -270,12 +276,12 @@ export class GfTreemapChartComponent daysInMarket: differenceInDays( endDate, max([ - context.raw._data.dateOfFirstActivity ?? new Date(0), + raw._data.dateOfFirstActivity ?? new Date(0), startDate ]) ), netPerformancePercentage: new Big( - context.raw._data.netPerformancePercentWithCurrencyEffect + raw._data.netPerformancePercentWithCurrencyEffect ) }).toNumber(); @@ -294,7 +300,9 @@ export class GfTreemapChartComponent }, display: true, font: [{ size: 16 }, { lineHeight: 1.5, size: 14 }], - formatter: ({ raw }: GfTreemapScriptableContext) => { + formatter: (context: GfTreemapScriptableContext) => { + const raw = context.raw as GfTreemapDataPoint; + let netPerformancePercentWithCurrencyEffect = round( raw._data.netPerformancePercentWithCurrencyEffect, 4 @@ -380,7 +388,9 @@ export class GfTreemapChartComponent }), // @ts-expect-error: no need to set all attributes in callbacks callbacks: { - label: ({ raw }: GfTreemapTooltipItem) => { + label: (context: TooltipItem<'treemap'>) => { + const raw = context.raw as GfTreemapDataPoint; + const allocationInPercentage = `${(raw._data.allocationInPercentage * 100).toFixed(2)}%`; const name = raw._data.assetProfile.name; diff --git a/package-lock.json b/package-lock.json index 107c23c2ef..ea294d28c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,7 +54,7 @@ "bull": "4.16.5", "chart.js": "4.5.1", "chartjs-adapter-date-fns": "3.0.0", - "chartjs-chart-treemap": "3.1.0", + "chartjs-chart-treemap": "4.2.0", "chartjs-plugin-annotation": "3.1.0", "chartjs-plugin-datalabels": "2.2.0", "cheerio": "1.2.0", @@ -16124,9 +16124,9 @@ } }, "node_modules/chartjs-chart-treemap": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/chartjs-chart-treemap/-/chartjs-chart-treemap-3.1.0.tgz", - "integrity": "sha512-0LJxj4J9sCTHmrXCFlqtoBKMJDcS7VzFeRgNBRZRwU1QSpCXJKTNk5TysPEs5/YW0XYvZoN8u44RqqLf0pAzQw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chartjs-chart-treemap/-/chartjs-chart-treemap-4.2.0.tgz", + "integrity": "sha512-2ghdKHbknLYEzqD2fRTbACOzEhuH/f7zI5t6dbQ3cAOS+ric4mLjll6Sxsaugy/HFU0KUftJEszYOvtay3wFSQ==", "license": "MIT", "peerDependencies": { "chart.js": ">=3.0.0" diff --git a/package.json b/package.json index c3329e55e8..b6b572d828 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "bull": "4.16.5", "chart.js": "4.5.1", "chartjs-adapter-date-fns": "3.0.0", - "chartjs-chart-treemap": "3.1.0", + "chartjs-chart-treemap": "4.2.0", "chartjs-plugin-annotation": "3.1.0", "chartjs-plugin-datalabels": "2.2.0", "cheerio": "1.2.0", From e339d8ca8b8d1a01fa585cc6099b1373e8576cf8 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 22 Jul 2026 20:59:10 +0200 Subject: [PATCH 39/54] Release 3.32.0 (#7397) --- 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 ac3660b81a..572f17688a 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 +## 3.32.0 - 2026-07-22 ### Changed diff --git a/package-lock.json b/package-lock.json index ea294d28c4..2e2445d49d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "3.31.0", + "version": "3.32.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "3.31.0", + "version": "3.32.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index b6b572d828..2dd6deeb83 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "3.31.0", + "version": "3.32.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From d70bc473bee75e297e350d067f15d61989a92916 Mon Sep 17 00:00:00 2001 From: Cyprian Zasada <120047588+cyptrix12@users.noreply.github.com> Date: Thu, 23 Jul 2026 17:30:23 +0200 Subject: [PATCH 40/54] Task/improve language localization for PL (20260723) (#7399) * Update translation * Update changelog --- CHANGELOG.md | 6 ++++++ apps/client/src/locales/messages.pl.xlf | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 572f17688a..fce8d4ac60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Changed + +- Improved the language localization for Polish (`pl`) + ## 3.32.0 - 2026-07-22 ### Changed diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 5d18539aa3..0bc20eec6b 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -6526,7 +6526,7 @@ Active - Antywne + Aktywne apps/client/src/app/components/home-holdings/home-holdings.component.ts 64 From 60f34f4759adf0c30930c51bed90094cf54f8c4f Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 23 Jul 2026 17:44:39 +0200 Subject: [PATCH 41/54] Bugfix/spacing in testimonials of landing page (#7398) * Fix spacing * Update changelog --- CHANGELOG.md | 4 ++++ apps/client/src/app/pages/landing/landing-page.html | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fce8d4ac60..4122d17fbc 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 - Improved the language localization for Polish (`pl`) +### Fixed + +- Improved the spacing in the testimonial section on the landing page + ## 3.32.0 - 2026-07-22 ### Changed diff --git a/apps/client/src/app/pages/landing/landing-page.html b/apps/client/src/app/pages/landing/landing-page.html index cb86b471db..bdd5f422f6 100644 --- a/apps/client/src/app/pages/landing/landing-page.html +++ b/apps/client/src/app/pages/landing/landing-page.html @@ -247,11 +247,11 @@ @if (testimonial.url) { {{ testimonial.author - }} + }}, } @else { - {{ testimonial.author }} + {{ testimonial.author }}, } - , {{ testimonial.country }}
From f451199a9900093ed0883ae5b6b22b80050b2df0 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 23 Jul 2026 17:45:14 +0200 Subject: [PATCH 42/54] Task/migrate deprecated animation providers (#7396) * Migrate deprecated animation providers * Update changelog --- CHANGELOG.md | 1 + apps/client/src/main.ts | 2 -- libs/ui/src/lib/carousel/carousel.component.ts | 2 +- .../entity-logo.component.stories.ts | 8 +++++--- .../fire-calculator.component.stories.ts | 12 +++++++++--- .../symbol-autocomplete.component.stories.ts | 8 +++++--- .../tags-selector.component.stories.ts | 10 ++++++++-- .../top-holdings/top-holdings.component.html | 2 +- .../top-holdings/top-holdings.component.scss | 15 +++++++++++++++ .../lib/top-holdings/top-holdings.component.ts | 17 ----------------- .../ui/src/lib/value/value.component.stories.ts | 9 +++++++-- 11 files changed, 52 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4122d17fbc..f936dd472f 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 +- Refactored the deprecated animation providers (`provideAnimations()` and `provideNoopAnimations()`) - Improved the language localization for Polish (`pl`) ### Fixed diff --git a/apps/client/src/main.ts b/apps/client/src/main.ts index 45901baeca..3e80df9c73 100644 --- a/apps/client/src/main.ts +++ b/apps/client/src/main.ts @@ -23,7 +23,6 @@ import { import { MatSnackBarModule } from '@angular/material/snack-bar'; import { MatTooltipModule } from '@angular/material/tooltip'; import { bootstrapApplication } from '@angular/platform-browser'; -import { provideAnimations } from '@angular/platform-browser/animations'; import { RouterModule, TitleStrategy } from '@angular/router'; import { ServiceWorkerModule } from '@angular/service-worker'; import { provideIonicAngular } from '@ionic/angular/standalone'; @@ -82,7 +81,6 @@ import { environment } from './environments/environment'; ), LanguageService, ModulePreloadService, - provideAnimations(), provideHttpClient(withInterceptorsFromDi()), provideIonicAngular(), provideMarkdown(), diff --git a/libs/ui/src/lib/carousel/carousel.component.ts b/libs/ui/src/lib/carousel/carousel.component.ts index 4ecd12c79b..f47d41ae5f 100644 --- a/libs/ui/src/lib/carousel/carousel.component.ts +++ b/libs/ui/src/lib/carousel/carousel.component.ts @@ -1,4 +1,5 @@ import { + ANIMATION_MODULE_TYPE, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, @@ -11,7 +12,6 @@ import { ViewChild } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; -import { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations'; import { IonIcon } from '@ionic/angular/standalone'; import { addIcons } from 'ionicons'; import { chevronBackOutline, chevronForwardOutline } from 'ionicons/icons'; diff --git a/libs/ui/src/lib/entity-logo/entity-logo.component.stories.ts b/libs/ui/src/lib/entity-logo/entity-logo.component.stories.ts index 6c89718bd2..45a9962944 100644 --- a/libs/ui/src/lib/entity-logo/entity-logo.component.stories.ts +++ b/libs/ui/src/lib/entity-logo/entity-logo.component.stories.ts @@ -1,6 +1,5 @@ import { CommonModule } from '@angular/common'; -import { importProvidersFrom } from '@angular/core'; -import { provideNoopAnimations } from '@angular/platform-browser/animations'; +import { ANIMATION_MODULE_TYPE, importProvidersFrom } from '@angular/core'; import { applicationConfig, Meta, StoryObj } from '@storybook/angular'; import { EntityLogoImageSourceServiceMock } from '../mocks/entity-logo-image-source.service.mock'; @@ -13,8 +12,11 @@ export default { decorators: [ applicationConfig({ providers: [ - provideNoopAnimations(), importProvidersFrom(CommonModule), + { + provide: ANIMATION_MODULE_TYPE, + useValue: 'NoopAnimations' + }, { provide: EntityLogoImageSourceService, useValue: new EntityLogoImageSourceServiceMock() diff --git a/libs/ui/src/lib/fire-calculator/fire-calculator.component.stories.ts b/libs/ui/src/lib/fire-calculator/fire-calculator.component.stories.ts index ad80499d7b..f4528aac63 100644 --- a/libs/ui/src/lib/fire-calculator/fire-calculator.component.stories.ts +++ b/libs/ui/src/lib/fire-calculator/fire-calculator.component.stories.ts @@ -1,6 +1,7 @@ import { DEFAULT_LOCALE } from '@ghostfolio/common/config'; import { CommonModule } from '@angular/common'; +import { ANIMATION_MODULE_TYPE } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import '@angular/localize/init'; import { MatButtonModule } from '@angular/material/button'; @@ -8,7 +9,6 @@ import { provideNativeDateAdapter } from '@angular/material/core'; import { MatDatepickerModule } from '@angular/material/datepicker'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { moduleMetadata } from '@storybook/angular'; import type { Meta, StoryObj } from '@storybook/angular'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; @@ -32,10 +32,16 @@ export default { MatFormFieldModule, MatInputModule, NgxSkeletonLoaderModule, - NoopAnimationsModule, ReactiveFormsModule ], - providers: [FireCalculatorService, provideNativeDateAdapter()] + providers: [ + FireCalculatorService, + provideNativeDateAdapter(), + { + provide: ANIMATION_MODULE_TYPE, + useValue: 'NoopAnimations' + } + ] }) ] } as Meta; diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.stories.ts b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.stories.ts index de7a09a042..5bae01c70f 100644 --- a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.stories.ts +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.stories.ts @@ -2,14 +2,13 @@ import { LookupItem } from '@ghostfolio/common/interfaces'; import { CommonModule } from '@angular/common'; import { HttpClient } from '@angular/common/http'; -import { importProvidersFrom } from '@angular/core'; +import { ANIMATION_MODULE_TYPE, importProvidersFrom } from '@angular/core'; import { FormControl, FormsModule, NgControl, ReactiveFormsModule } from '@angular/forms'; -import { provideNoopAnimations } from '@angular/platform-browser/animations'; import { applicationConfig, Meta, StoryObj } from '@storybook/angular'; import { HttpClientMock } from '../mocks/httpClient.mock'; @@ -75,8 +74,11 @@ export default { decorators: [ applicationConfig({ providers: [ - provideNoopAnimations(), importProvidersFrom(CommonModule, FormsModule, ReactiveFormsModule), + { + provide: ANIMATION_MODULE_TYPE, + useValue: 'NoopAnimations' + }, { provide: NgControl, useValue: { diff --git a/libs/ui/src/lib/tags-selector/tags-selector.component.stories.ts b/libs/ui/src/lib/tags-selector/tags-selector.component.stories.ts index d11175fd1c..48aeaffe31 100644 --- a/libs/ui/src/lib/tags-selector/tags-selector.component.stories.ts +++ b/libs/ui/src/lib/tags-selector/tags-selector.component.stories.ts @@ -1,6 +1,6 @@ import { CommonModule } from '@angular/common'; +import { ANIMATION_MODULE_TYPE } from '@angular/core'; import '@angular/localize/init'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { Meta, moduleMetadata, StoryObj } from '@storybook/angular'; import { GfTagsSelectorComponent } from './tags-selector.component'; @@ -10,7 +10,13 @@ export default { component: GfTagsSelectorComponent, decorators: [ moduleMetadata({ - imports: [CommonModule, NoopAnimationsModule] + imports: [CommonModule], + providers: [ + { + provide: ANIMATION_MODULE_TYPE, + useValue: 'NoopAnimations' + } + ] }) ] } as Meta; diff --git a/libs/ui/src/lib/top-holdings/top-holdings.component.html b/libs/ui/src/lib/top-holdings/top-holdings.component.html index 11900106ae..60f8032891 100644 --- a/libs/ui/src/lib/top-holdings/top-holdings.component.html +++ b/libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -58,7 +58,7 @@ mat-cell [attr.colspan]="displayedColumns.length" > -
+
collapsed', - animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)') - ) - ]) - ], changeDetection: ChangeDetectionStrategy.OnPush, imports: [ GfValueComponent, diff --git a/libs/ui/src/lib/value/value.component.stories.ts b/libs/ui/src/lib/value/value.component.stories.ts index 5a285e89ba..a5971b2520 100644 --- a/libs/ui/src/lib/value/value.component.stories.ts +++ b/libs/ui/src/lib/value/value.component.stories.ts @@ -1,5 +1,5 @@ +import { ANIMATION_MODULE_TYPE } from '@angular/core'; import '@angular/localize/init'; -import { provideNoopAnimations } from '@angular/platform-browser/animations'; import { applicationConfig, moduleMetadata } from '@storybook/angular'; import type { Meta, StoryObj } from '@storybook/angular'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; @@ -11,7 +11,12 @@ export default { component: GfValueComponent, decorators: [ applicationConfig({ - providers: [provideNoopAnimations()] + providers: [ + { + provide: ANIMATION_MODULE_TYPE, + useValue: 'NoopAnimations' + } + ] }), moduleMetadata({ imports: [NgxSkeletonLoaderModule] From fab16d09799787693e78ad1fbd4f0917c2c86299 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 23 Jul 2026 17:45:58 +0200 Subject: [PATCH 43/54] Task/add stack trace logging for MaxListenersExceededWarning (#7400) * Add stack trace logging for MaxListenersExceededWarning * Update changelog --- CHANGELOG.md | 4 ++++ apps/api/src/main.ts | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f936dd472f..3b0b0a418e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- Added the stack trace logging for `MaxListenersExceededWarning` occurrences + ### Changed - Refactored the deprecated animation providers (`provideAnimations()` and `provideNoopAnimations()`) diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index 77d571ea0b..b30a20323e 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -26,6 +26,15 @@ import { AppModule } from './app/app.module'; import { environment } from './environments/environment'; const logger = new Logger('Bootstrap'); +const processWarningLogger = new Logger('ProcessWarning'); + +process.on('warning', ({ name, stack }) => { + if (name === 'MaxListenersExceededWarning') { + // Log the stack trace of MaxListenersExceededWarning occurrences to identify + // the event emitter and the call site which registers the listeners + processWarningLogger.warn(stack); + } +}); async function bootstrap() { // Respect HTTP_PROXY / HTTPS_PROXY / NO_PROXY for outbound HTTP requests From 8169b2c723181b4019d6cc39b0e78763e556ee64 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 23 Jul 2026 20:10:27 +0200 Subject: [PATCH 44/54] Task/recompute portfolio snapshot on portfolio change (#7403) * Recompute portfolio snapshot on portfolio change * Update changelog --- CHANGELOG.md | 2 + .../calculator/portfolio-calculator.ts | 17 +++--- apps/api/src/events/events.module.ts | 8 ++- .../src/events/portfolio-changed.listener.ts | 55 ++++++++++++++++++- apps/api/src/services/api/api.service.ts | 16 +++++- 5 files changed, 87 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b0b0a418e..49da55d4f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Recomputed the portfolio snapshot calculation in the background on a portfolio change +- Improved the deduplication of the portfolio snapshot calculation jobs by considering the filters - Refactored the deprecated animation providers (`provideAnimations()` and `provideNoopAnimations()`) - Improved the language localization for Polish (`pl`) diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index c1e795c4af..606c223b48 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -1097,15 +1097,18 @@ export abstract class PortfolioCalculator { let cachedPortfolioSnapshot: PortfolioSnapshot; let isCachedPortfolioSnapshotExpired = false; - const jobId = this.userId; + const portfolioSnapshotKey = this.redisCacheService.getPortfolioSnapshotKey( + { + filters: this.filters, + userId: this.userId + } + ); + + const jobId = portfolioSnapshotKey; try { - const cachedPortfolioSnapshotValue = await this.redisCacheService.get( - this.redisCacheService.getPortfolioSnapshotKey({ - filters: this.filters, - userId: this.userId - }) - ); + const cachedPortfolioSnapshotValue = + await this.redisCacheService.get(portfolioSnapshotKey); const { expiration, portfolioSnapshot }: PortfolioSnapshotValue = JSON.parse(cachedPortfolioSnapshotValue); diff --git a/apps/api/src/events/events.module.ts b/apps/api/src/events/events.module.ts index df943a3c95..dabc3edb77 100644 --- a/apps/api/src/events/events.module.ts +++ b/apps/api/src/events/events.module.ts @@ -1,9 +1,12 @@ import { ActivitiesModule } from '@ghostfolio/api/app/activities/activities.module'; import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; +import { UserModule } from '@ghostfolio/api/app/user/user.module'; +import { ApiModule } from '@ghostfolio/api/services/api/api.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { DataGatheringQueueModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module'; +import { PortfolioSnapshotQueueModule } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.module'; import { Module } from '@nestjs/common'; @@ -13,11 +16,14 @@ import { PortfolioChangedListener } from './portfolio-changed.listener'; @Module({ imports: [ ActivitiesModule, + ApiModule, ConfigurationModule, DataGatheringQueueModule, DataProviderModule, ExchangeRateDataModule, - RedisCacheModule + PortfolioSnapshotQueueModule, + RedisCacheModule, + UserModule ], providers: [AssetProfileChangedListener, PortfolioChangedListener] }) diff --git a/apps/api/src/events/portfolio-changed.listener.ts b/apps/api/src/events/portfolio-changed.listener.ts index 12441517b8..026711b93d 100644 --- a/apps/api/src/events/portfolio-changed.listener.ts +++ b/apps/api/src/events/portfolio-changed.listener.ts @@ -1,4 +1,12 @@ import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; +import { UserService } from '@ghostfolio/api/app/user/user.service'; +import { ApiService } from '@ghostfolio/api/services/api/api.service'; +import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; +import { + PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE_PRIORITY_LOW, + PORTFOLIO_SNAPSHOT_PROCESS_JOB_NAME, + PORTFOLIO_SNAPSHOT_PROCESS_JOB_OPTIONS +} from '@ghostfolio/common/config'; import { Injectable, Logger } from '@nestjs/common'; import { OnEvent } from '@nestjs/event-emitter'; @@ -14,7 +22,12 @@ export class PortfolioChangedListener { private debounceTimers = new Map(); - public constructor(private readonly redisCacheService: RedisCacheService) {} + public constructor( + private readonly apiService: ApiService, + private readonly portfolioSnapshotService: PortfolioSnapshotService, + private readonly redisCacheService: RedisCacheService, + private readonly userService: UserService + ) {} @OnEvent(PortfolioChangedEvent.getName()) handlePortfolioChangedEvent(event: PortfolioChangedEvent) { @@ -39,6 +52,44 @@ export class PortfolioChangedListener { private async processPortfolioChanged({ userId }: { userId: string }) { this.logger.log(`Portfolio of user '${userId}' has changed`); - await this.redisCacheService.removePortfolioSnapshotsByUserId({ userId }); + try { + await this.redisCacheService.removePortfolioSnapshotsByUserId({ userId }); + + const user = await this.userService.user({ id: userId }); + + if (!user) { + return; + } + + const userSettings = user.settings.settings; + + const filters = this.apiService.buildFiltersFromUserSettings({ + userSettings + }); + + // Recompute in the background to avoid a cold start on the next request + await this.portfolioSnapshotService.addJobToQueue({ + data: { + filters, + userId, + calculationType: userSettings.performanceCalculationType, + userCurrency: userSettings.baseCurrency + }, + name: PORTFOLIO_SNAPSHOT_PROCESS_JOB_NAME, + opts: { + ...PORTFOLIO_SNAPSHOT_PROCESS_JOB_OPTIONS, + jobId: this.redisCacheService.getPortfolioSnapshotKey({ + filters, + userId + }), + priority: PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE_PRIORITY_LOW + } + }); + } catch (error) { + this.logger.error( + `Portfolio snapshot of user '${userId}' could not be recomputed`, + error + ); + } } } diff --git a/apps/api/src/services/api/api.service.ts b/apps/api/src/services/api/api.service.ts index 052119246d..11074870ef 100644 --- a/apps/api/src/services/api/api.service.ts +++ b/apps/api/src/services/api/api.service.ts @@ -1,4 +1,4 @@ -import { Filter } from '@ghostfolio/common/interfaces'; +import { Filter, UserSettings } from '@ghostfolio/common/interfaces'; import { Injectable } from '@nestjs/common'; @@ -89,4 +89,18 @@ export class ApiService { return filters; } + + public buildFiltersFromUserSettings({ + userSettings + }: { + userSettings: UserSettings; + }): Filter[] { + return this.buildFiltersFromQueryParams({ + filterByAccounts: userSettings?.['filters.accounts']?.[0], + filterByAssetClasses: userSettings?.['filters.assetClasses']?.[0], + filterByDataSource: userSettings?.['filters.dataSource'], + filterBySymbol: userSettings?.['filters.symbol'], + filterByTags: userSettings?.['filters.tags']?.[0] + }); + } } From ad92c763cb433f6150dc7ae246d195732a007dee Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 23 Jul 2026 20:10:46 +0200 Subject: [PATCH 45/54] Bugfix/localization of FIRE page (#7401) * Fix localization of FIRE page * Update changelog --- CHANGELOG.md | 2 + .../portfolio/fire/fire-page.component.ts | 15 ++ .../app/pages/portfolio/fire/fire-page.html | 150 ++++++++---------- apps/client/src/locales/messages.ca.xlf | 22 +-- apps/client/src/locales/messages.de.xlf | 22 +-- apps/client/src/locales/messages.es.xlf | 22 +-- apps/client/src/locales/messages.fr.xlf | 22 +-- apps/client/src/locales/messages.it.xlf | 22 +-- apps/client/src/locales/messages.ja.xlf | 22 +-- apps/client/src/locales/messages.ko.xlf | 22 +-- apps/client/src/locales/messages.nl.xlf | 22 +-- apps/client/src/locales/messages.pl.xlf | 22 +-- apps/client/src/locales/messages.pt.xlf | 22 +-- apps/client/src/locales/messages.tr.xlf | 22 +-- apps/client/src/locales/messages.uk.xlf | 22 +-- apps/client/src/locales/messages.xlf | 18 +-- apps/client/src/locales/messages.zh.xlf | 22 +-- libs/common/src/lib/helper.ts | 13 ++ .../fire-calculator.component.html | 6 +- .../fire-calculator.component.ts | 15 +- 20 files changed, 150 insertions(+), 355 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49da55d4f2..cdf6e47181 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,10 +16,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Recomputed the portfolio snapshot calculation in the background on a portfolio change - Improved the deduplication of the portfolio snapshot calculation jobs by considering the filters - Refactored the deprecated animation providers (`provideAnimations()` and `provideNoopAnimations()`) +- Improved the language localization for German (`de`) - Improved the language localization for Polish (`pl`) ### Fixed +- Fixed an issue with the localization in the _FIRE_ page - Improved the spacing in the testimonial section on the landing page ## 3.32.0 - 2026-07-22 diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts b/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts index e7b6948196..b7ef8b302b 100644 --- a/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts +++ b/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts @@ -1,6 +1,7 @@ import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { SubscriptionType } from '@ghostfolio/common/enums'; +import { formatMonthAndYear } from '@ghostfolio/common/helper'; import { FireCalculationCompleteEvent, FireWealth, @@ -77,6 +78,20 @@ export class GfFirePageComponent implements OnInit { ); private readonly userService = inject(UserService); + protected get retirementDateLabel(): string { + const retirementDate = + this.user?.settings?.retirementDate ?? this.retirementDate; + + if (!retirementDate) { + return ''; + } + + return formatMonthAndYear({ + date: new Date(retirementDate), + locale: this.user?.settings?.locale + }); + } + public ngOnInit() { this.isLoading = true; diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page.html b/apps/client/src/app/pages/portfolio/fire/fire-page.html index 2730b35cd5..3bc62dd95f 100644 --- a/apps/client/src/app/pages/portfolio/fire/fire-page.html +++ b/apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -66,47 +66,38 @@
If you retire today, you would be able to withdraw -   - -   - per year -   - or -   - -   - per monthIf you retire today, you would be able to withdraw + + per year + or + + per month, based on your total assets of + + and a safe withdrawal rate (SWR) of - , based on your total assets of -   - - -   - and a safe withdrawal rate (SWR) of @if ( !hasImpersonationId && hasPermissionToUpdateUserSettings && @@ -137,53 +128,40 @@ @if (user?.settings?.isExperimentalFeatures) {
- By -   - {{ - user?.settings?.retirementDate ?? retirementDate - | date: 'MMMM yyyy' - }} - , -   - this is projected to increase to -   - -   - per yearBy {{ retirementDateLabel }}, this is projected to increase to + + per year + or + + per month, assuming a + + annual interest rate. -   - or -   - -   - per month - , assuming a -   - -   - annual interest rate.
}
diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index aa1734e324..b6ae28a2a7 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -4223,14 +4223,6 @@ 60 - - and a safe withdrawal rate (SWR) of - and a safe withdrawal rate (SWR) of - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 109 - - New Users Usuaris nous @@ -6636,9 +6628,9 @@ 78 - - If you retire today, you would be able to withdraw - If you retire today, you would be able to withdraw + + If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a safe withdrawal rate (SWR) of + If you retire today, you would be able to withdraw per any o per month, based on your total assets of and a safe withdrawal rate (SWR) of apps/client/src/app/pages/portfolio/fire/fire-page.html 69 @@ -6968,14 +6960,6 @@ 263 - - , based on your total assets of - , based on your total assets of - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 97 - - Inactive Inactive diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 1aa95c70f7..1d65a313ab 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -3281,9 +3281,9 @@ 77 - - If you retire today, you would be able to withdraw - Wenn du heute in den Ruhestand gehen würdest, könntest du + + If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a safe withdrawal rate (SWR) of + Wenn du heute in den Ruhestand gehen würdest, könntest du pro Jahr oder pro Monat entnehmen, bezogen auf dein Gesamtanlagevermögen von und einer sicheren Entnahmerate (SWR) von apps/client/src/app/pages/portfolio/fire/fire-page.html 69 @@ -5763,14 +5763,6 @@ 60 - - and a safe withdrawal rate (SWR) of - und einer sicheren Entnahmerate (SWR) von - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 109 - - Available on Verfügbar für @@ -6992,14 +6984,6 @@ 263 - - , based on your total assets of - entnehmen, bezogen auf dein Gesamtanlagevermögen von - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 97 - - Inactive Inaktiv diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 81f5ce42e6..e030136af3 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -3266,9 +3266,9 @@ 77 - - If you retire today, you would be able to withdraw - Si te jubilas hoy, podrías retirar + + If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a safe withdrawal rate (SWR) of + Si te jubilas hoy, podrías retirar por año o por mes, basado en tus activos totales de y una tasa de retiro segura (SWR) de apps/client/src/app/pages/portfolio/fire/fire-page.html 69 @@ -5740,14 +5740,6 @@ 60 - - and a safe withdrawal rate (SWR) of - y una tasa de retiro segura (SWR) de - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 109 - - Available on Available on @@ -6969,14 +6961,6 @@ 263 - - , based on your total assets of - , basado en tus activos totales de - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 97 - - Inactive Inactiva diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 3637a997f4..3763466f76 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -3441,9 +3441,9 @@ 78 - - If you retire today, you would be able to withdraw - Si vous partez à la retraite aujourd’hui, vous pourriez retirer + + If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a safe withdrawal rate (SWR) of + Si vous partez à la retraite aujourd’hui, vous pourriez retirer par an ou par mois, basé sur le total de vos actifs de et un taux de retrait sûr (SWR) de apps/client/src/app/pages/portfolio/fire/fire-page.html 69 @@ -5739,14 +5739,6 @@ 60 - - and a safe withdrawal rate (SWR) of - et un taux de retrait sûr (SWR) de - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 109 - - Available on Disponible sur @@ -6968,14 +6960,6 @@ 263 - - , based on your total assets of - , basé sur le total de vos actifs de - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 97 - - Inactive Inactif diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 26f5752c84..86675aac45 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -3266,9 +3266,9 @@ 77 - - If you retire today, you would be able to withdraw - If you retire today, you would be able to withdraw + + If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a safe withdrawal rate (SWR) of + If you retire today, you would be able to withdraw per anno oppure per month, based on your total assets of and a safe withdrawal rate (SWR) of apps/client/src/app/pages/portfolio/fire/fire-page.html 69 @@ -5740,14 +5740,6 @@ 60 - - and a safe withdrawal rate (SWR) of - and a safe withdrawal rate (SWR) of - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 109 - - Available on Available on @@ -6969,14 +6961,6 @@ 263 - - , based on your total assets of - , based on your total assets of - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 97 - - Inactive Inattivo diff --git a/apps/client/src/locales/messages.ja.xlf b/apps/client/src/locales/messages.ja.xlf index f584352a48..219f41f817 100644 --- a/apps/client/src/locales/messages.ja.xlf +++ b/apps/client/src/locales/messages.ja.xlf @@ -3879,14 +3879,6 @@ 60 - - and a safe withdrawal rate (SWR) of - および安全な引き出し率(SWR)の - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 109 - - New Users 新規ユーザー @@ -6068,9 +6060,9 @@ 78 - - If you retire today, you would be able to withdraw - もしあなたが今日退職するなら、あなたは引き出すことができるでしょう + + If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a safe withdrawal rate (SWR) of + もしあなたが今日退職するなら、あなたは引き出すことができるでしょう 年あたり または 月あたり, based on your total assets of および安全な引き出し率(SWR)の apps/client/src/app/pages/portfolio/fire/fire-page.html 69 @@ -7041,14 +7033,6 @@ 39 - - , based on your total assets of - , based on your total assets of - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 97 - - Inactive Inactive diff --git a/apps/client/src/locales/messages.ko.xlf b/apps/client/src/locales/messages.ko.xlf index 6793e720ea..b570f552ca 100644 --- a/apps/client/src/locales/messages.ko.xlf +++ b/apps/client/src/locales/messages.ko.xlf @@ -3871,14 +3871,6 @@ 60 - - and a safe withdrawal rate (SWR) of - 안전 인출률(SWR)은 다음과 같습니다. - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 109 - - New Users 신규 사용자 @@ -6068,9 +6060,9 @@ 78 - - If you retire today, you would be able to withdraw - 오늘 퇴사하면 탈퇴 가능 + + If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a safe withdrawal rate (SWR) of + 오늘 퇴사하면 탈퇴 가능 연간 또는 매월, 귀하의 총 자산을 기준으로 안전 인출률(SWR)은 다음과 같습니다. apps/client/src/app/pages/portfolio/fire/fire-page.html 69 @@ -7041,14 +7033,6 @@ 39 - - , based on your total assets of - , 귀하의 총 자산을 기준으로 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 97 - - Inactive 비활성 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 1f70d55182..cd37770500 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -3265,9 +3265,9 @@ 77 - - If you retire today, you would be able to withdraw - Als u vandaag met pensioen gaat, kunt u + + If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a safe withdrawal rate (SWR) of + Als u vandaag met pensioen gaat, kunt u per jaar of per maand opnemen, dit is gebaseerd op uw totale vermogen van en een veilige opnameratio (SWR) van apps/client/src/app/pages/portfolio/fire/fire-page.html 69 @@ -5739,14 +5739,6 @@ 60 - - and a safe withdrawal rate (SWR) of - en een veilige opnameratio (SWR) van - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 109 - - Available on Beschikbaar op @@ -6968,14 +6960,6 @@ 263 - - , based on your total assets of - opnemen, dit is gebaseerd op uw totale vermogen van - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 97 - - Inactive Inactief diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 0bc20eec6b..1068a7d573 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -3838,14 +3838,6 @@ 60 - - and a safe withdrawal rate (SWR) of - oraz bezpiecznej stopy wypłaty (SWR) na poziomie - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 109 - - New Users Nowi Użytkownicy @@ -5991,9 +5983,9 @@ 78 - - If you retire today, you would be able to withdraw - Gdybyś przeszedł na emeryturę dziś, mógłbyś wypłacać + + If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a safe withdrawal rate (SWR) of + Gdybyś przeszedł na emeryturę dziś, mógłbyś wypłacać rocznie lub miesięcznie, na podstawie całkowitej wartości aktywów wynoszącej oraz bezpiecznej stopy wypłaty (SWR) na poziomie apps/client/src/app/pages/portfolio/fire/fire-page.html 69 @@ -6968,14 +6960,6 @@ 263 - - , based on your total assets of - , na podstawie całkowitej wartości aktywów wynoszącej - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 97 - - Inactive Nieaktywny diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 80f351a930..751e813baf 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -3269,9 +3269,9 @@ 78 - - If you retire today, you would be able to withdraw - If you retire today, you would be able to withdraw + + If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a safe withdrawal rate (SWR) of + If you retire today, you would be able to withdraw por ano ou per month, based on your total assets of and a safe withdrawal rate (SWR) of apps/client/src/app/pages/portfolio/fire/fire-page.html 69 @@ -5739,14 +5739,6 @@ 60 - - and a safe withdrawal rate (SWR) of - and a safe withdrawal rate (SWR) of - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 109 - - Available on Available on @@ -6968,14 +6960,6 @@ 263 - - , based on your total assets of - , based on your total assets of - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 97 - - Inactive Inativo diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 85a1ce506d..3f7086da71 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -5643,9 +5643,9 @@ 78 - - If you retire today, you would be able to withdraw - If you retire today, you would be able to withdraw + + If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a safe withdrawal rate (SWR) of + If you retire today, you would be able to withdraw yıllık veya per month, based on your total assets of and a safe withdrawal rate (SWR) of apps/client/src/app/pages/portfolio/fire/fire-page.html 69 @@ -5747,14 +5747,6 @@ 60 - - and a safe withdrawal rate (SWR) of - and a safe withdrawal rate (SWR) of - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 109 - - Available on Available on @@ -6968,14 +6960,6 @@ 263 - - , based on your total assets of - , based on your total assets of - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 97 - - Inactive Pasif diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 953b05b35c..a3857d31dc 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -4519,14 +4519,6 @@ 60 - - and a safe withdrawal rate (SWR) of - та безпечним рівнем зняття коштів (SWR) у розмірі - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 109 - - New Users Нові користувачі @@ -5343,14 +5335,6 @@ 58 - - , based on your total assets of - , based on your total assets of - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 97 - - Inactive Неактивний @@ -7598,9 +7582,9 @@ 78 - - If you retire today, you would be able to withdraw - If you retire today, you would be able to withdraw + + If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a safe withdrawal rate (SWR) of + If you retire today, you would be able to withdraw на рік або per month, based on your total assets of та безпечним рівнем зняття коштів (SWR) у розмірі apps/client/src/app/pages/portfolio/fire/fire-page.html 69 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 5e26a30cb0..208eff81b4 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -3544,13 +3544,6 @@ 60 - - and a safe withdrawal rate (SWR) of - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 109 - - New Users @@ -5519,8 +5512,8 @@ 78 - - If you retire today, you would be able to withdraw + + If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a safe withdrawal rate (SWR) of apps/client/src/app/pages/portfolio/fire/fire-page.html 69 @@ -6396,13 +6389,6 @@ 39 - - , based on your total assets of - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 97 - - Inactive diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index be338019d9..6a3439d47f 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -3855,14 +3855,6 @@ 60 - - and a safe withdrawal rate (SWR) of - 和安全取款率 (SWR) 为 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 109 - - New Users 新用户 @@ -6044,9 +6036,9 @@ 78 - - If you retire today, you would be able to withdraw - 如果您今天退休,您将能够提取 + + If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a safe withdrawal rate (SWR) of + 如果您今天退休,您将能够提取 每年 每月基于您总资产的 和安全取款率 (SWR) 为 apps/client/src/app/pages/portfolio/fire/fire-page.html 69 @@ -6969,14 +6961,6 @@ 263 - - , based on your total assets of - 基于您总资产的 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 97 - - Inactive 非活跃 diff --git a/libs/common/src/lib/helper.ts b/libs/common/src/lib/helper.ts index 7787b2a97b..5d1ff538e5 100644 --- a/libs/common/src/lib/helper.ts +++ b/libs/common/src/lib/helper.ts @@ -233,6 +233,19 @@ export function extractNumberFromString({ } } +export function formatMonthAndYear({ + date, + locale +}: { + date: Date; + locale?: string; +}) { + return new Intl.DateTimeFormat(locale, { + month: 'long', + year: 'numeric' + }).format(date); +} + export function getAllActivityTypes(): ActivityType[] { return Object.values(ActivityType); } diff --git a/libs/ui/src/lib/fire-calculator/fire-calculator.component.html b/libs/ui/src/lib/fire-calculator/fire-calculator.component.html index df78cadca7..b2162a764a 100644 --- a/libs/ui/src/lib/fire-calculator/fire-calculator.component.html +++ b/libs/ui/src/lib/fire-calculator/fire-calculator.component.html @@ -30,11 +30,7 @@ Retirement Date -
- {{ - calculatorForm.get('retirementDate')?.value | date: 'MMMM yyyy' - }} -
+
{{ retirementDateLabel }}
= 0) { this.calculatorForm.setValue( From 5d7ca3ffb1527dc10fcc1d3ab9cbcddcf8f11968 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 23 Jul 2026 20:16:23 +0200 Subject: [PATCH 46/54] Task/update locales (#7367) Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.ca.xlf | 422 +++++++++++------------- apps/client/src/locales/messages.de.xlf | 422 +++++++++++------------- apps/client/src/locales/messages.es.xlf | 422 +++++++++++------------- apps/client/src/locales/messages.fr.xlf | 422 +++++++++++------------- apps/client/src/locales/messages.it.xlf | 422 +++++++++++------------- apps/client/src/locales/messages.ja.xlf | 422 +++++++++++------------- apps/client/src/locales/messages.ko.xlf | 422 +++++++++++------------- apps/client/src/locales/messages.nl.xlf | 422 +++++++++++------------- apps/client/src/locales/messages.pl.xlf | 422 +++++++++++------------- apps/client/src/locales/messages.pt.xlf | 422 +++++++++++------------- apps/client/src/locales/messages.tr.xlf | 422 +++++++++++------------- apps/client/src/locales/messages.uk.xlf | 422 +++++++++++------------- apps/client/src/locales/messages.xlf | 408 +++++++++++------------ apps/client/src/locales/messages.zh.xlf | 422 +++++++++++------------- 14 files changed, 2751 insertions(+), 3143 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index b6ae28a2a7..9343aaf745 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -431,7 +431,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 332 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -507,11 +507,11 @@ Divisa apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 216 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 326 + 339 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -531,7 +531,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 305 + 303
@@ -567,11 +567,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 286 + 284 libs/ui/src/lib/activities-table/activities-table.component.html - 322 + 320 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -595,7 +595,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 306 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -611,7 +611,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 485 + 483 @@ -619,7 +619,7 @@ Suprimir apps/client/src/app/components/admin-market-data/admin-market-data.html - 329 + 327 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -651,7 +651,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 515 + 513 libs/ui/src/lib/benchmark/benchmark.component.html @@ -699,7 +699,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 185 + 183 @@ -719,7 +719,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 473 + 486 @@ -731,11 +731,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 109 + 107 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 184 + 197 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -867,7 +867,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 194 + 192 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -887,7 +887,7 @@ Preu de Mercat apps/client/src/app/components/admin-market-data/admin-market-data.html - 154 + 152 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -903,7 +903,7 @@ Punts de referència apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 125 @@ -911,7 +911,7 @@ Divises apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 130 apps/client/src/app/pages/public/public-page.html @@ -931,7 +931,7 @@ ETFs sense País apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 135 @@ -939,7 +939,15 @@ ETFs sense Sector apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 140 + + + + An error occurred while converting the data source to . + An error occurred while converting the data source to . + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 482 @@ -947,7 +955,7 @@ Filtra per... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 367 + 365 @@ -955,11 +963,11 @@ Primera Activitat apps/client/src/app/components/admin-market-data/admin-market-data.html - 169 + 167 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 222 + 235 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -975,7 +983,7 @@ Data Gathering Frequency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 454 + 467 @@ -983,7 +991,7 @@ Nombre d’Activitats apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 182 @@ -991,7 +999,7 @@ Dades Històriques apps/client/src/app/components/admin-market-data/admin-market-data.html - 193 + 191 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -1003,7 +1011,7 @@ Nombre de Sectors apps/client/src/app/components/admin-market-data/admin-market-data.html - 202 + 200 @@ -1027,7 +1035,7 @@ Nombre de Països apps/client/src/app/components/admin-market-data/admin-market-data.html - 211 + 209 @@ -1035,7 +1043,7 @@ Recopilar Dades del Perfil apps/client/src/app/components/admin-market-data/admin-market-data.html - 262 + 260 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1075,7 +1083,7 @@ El preu de mercat actual és apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 770 + 766 @@ -1102,12 +1110,20 @@ 69 + + By , this is projected to increase to per year or per month, assuming a annual interest rate. + By , this is projected to increase to per year or per month, assuming a annual interest rate. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 132 + + Sector Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 280 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1119,7 +1135,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 282 + 295 apps/client/src/app/components/admin-users/admin-users.html @@ -1139,11 +1155,11 @@ Sectors apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 301 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 407 + 420 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1159,11 +1175,11 @@ Països apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 298 + 311 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 418 + 431 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1175,7 +1191,7 @@ Mapatge de Símbols apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 396 + 409 @@ -1215,7 +1231,7 @@ Configuració del Proveïdor de Dades apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 496 + 509 @@ -1223,7 +1239,7 @@ Prova apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 606 @@ -1231,11 +1247,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 429 + 442 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 588 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1251,7 +1267,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 645 + 665 @@ -1259,7 +1275,7 @@ Notes apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 455 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1275,7 +1291,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 372 + 370 @@ -1343,7 +1359,7 @@ Està segur qeu vol eliminar aquest cupó? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 235 + 242 @@ -1351,7 +1367,7 @@ Està segur que vol eliminar aquest missatge del sistema? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 248 + 255 @@ -1359,7 +1375,7 @@ Està segur que vol depurar el cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 272 + 279 @@ -1367,7 +1383,7 @@ Si us plau, afegeixi el seu missatge del sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 292 + 299 @@ -1415,7 +1431,7 @@ Recollida de Dades apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 616 + 629 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1506,14 +1522,6 @@ 11 - - By - By - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 140 - - Update platform Actualitzar plataforma @@ -1527,7 +1535,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 @@ -1667,11 +1675,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 621 + 641 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 624 + 644 @@ -1719,7 +1727,7 @@ Punt de Referència apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 388 + 401 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1835,7 +1843,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 215 + 213 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1921,10 +1929,6 @@ Fear Por - - apps/client/src/app/components/home-market/home-market.component.ts - 48 - apps/client/src/app/components/markets/markets.component.ts 46 @@ -1937,10 +1941,6 @@ Greed Cobdícia - - apps/client/src/app/components/home-market/home-market.component.ts - 49 - apps/client/src/app/components/markets/markets.component.ts 47 @@ -1953,10 +1953,6 @@ Last Days Últims Dies - - apps/client/src/app/components/home-market/home-market.html - 7 - apps/client/src/app/components/markets/markets.html 17 @@ -2047,7 +2043,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 @@ -2117,6 +2113,10 @@ or o + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 167 + apps/client/src/app/components/admin-settings/admin-settings.component.html 30 @@ -2137,14 +2137,6 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 100 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 84 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 162 - apps/client/src/app/pages/pricing/pricing-page.html 326 @@ -2471,7 +2463,7 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 libs/ui/src/lib/assistant/assistant.component.ts @@ -2483,7 +2475,7 @@ 1 any apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 libs/ui/src/lib/assistant/assistant.component.ts @@ -2503,7 +2495,7 @@ 5 anys apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -2523,7 +2515,7 @@ Màx apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 244 libs/ui/src/lib/assistant/assistant.component.ts @@ -2645,14 +2637,6 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html 33 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 81 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 159 - apps/client/src/app/pages/pricing/pricing-page.html 265 @@ -2723,7 +2707,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 399 @@ -2795,7 +2779,7 @@ Localització apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 547 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2874,14 +2858,6 @@ 221 - - this is projected to increase to - this is projected to increase to - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 148 - - Biometric Authentication Autenticació biomètrica @@ -2959,7 +2935,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 190 @@ -2979,7 +2955,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 190 + 188 @@ -2991,7 +2967,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 191 @@ -2999,7 +2975,7 @@ Daily apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 210 + 212 @@ -3443,11 +3419,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 569 + 589 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 572 + 592 @@ -3756,7 +3732,7 @@ Mercats apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 390 + 403 apps/client/src/app/components/footer/footer.component.html @@ -4211,6 +4187,14 @@ 63 + + Convert to + Convert to + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 174 + + (Last 30 days) (Últims 30 dies) @@ -4292,7 +4276,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 231 + 244 apps/client/src/app/components/admin-overview/admin-overview.html @@ -4408,7 +4392,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 239 + 237 @@ -4416,7 +4400,7 @@ Activitats d’importació apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 92 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4424,7 +4408,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 408 + 406 @@ -4432,7 +4416,7 @@ Importar dividends apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 133 + 131 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4440,7 +4424,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 422 + 420 @@ -4448,7 +4432,7 @@ S’estan important dades... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 170 @@ -4456,7 +4440,7 @@ La importació s’ha completat apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 182 + 180 @@ -4472,7 +4456,7 @@ S’estan validant les dades... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 293 + 291 @@ -4563,6 +4547,14 @@ 176 + + Do you really want to convert this asset profile to ()? + Do you really want to convert this asset profile to ()? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 723 + + Allocations Allocations @@ -4804,7 +4796,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 libs/ui/src/lib/i18n.ts @@ -4824,11 +4816,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 84 + 85 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 100 + 101 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -4848,7 +4840,7 @@ Mensualment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 94 + 95 @@ -4856,7 +4848,7 @@ Anualment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 95 + 96 @@ -5040,7 +5032,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 214 + 216 @@ -5176,11 +5168,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 655 + 675 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 658 + 678 @@ -5364,18 +5356,6 @@ 44 - - per month - per month - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 95 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 173 - - Ghostfolio vs comparison table Taula comparativa Ghostfolio vs @@ -5416,6 +5396,14 @@ 108 + + Coupon has been created + Coupon has been created + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 224 + + Available in Disponible a @@ -5697,7 +5685,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 436 + 434 @@ -5709,7 +5697,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 449 + 447 @@ -5733,7 +5721,7 @@ Clonar libs/ui/src/lib/activities-table/activities-table.component.html - 494 + 492 @@ -5741,7 +5729,7 @@ Exporta l’esborrany com a ICS libs/ui/src/lib/activities-table/activities-table.component.html - 504 + 502 @@ -5749,7 +5737,7 @@ De veritat vols suprimir aquestes activitats? libs/ui/src/lib/activities-table/activities-table.component.ts - 319 + 317 @@ -5757,7 +5745,7 @@ Realment vols suprimir aquesta activitat? libs/ui/src/lib/activities-table/activities-table.component.ts - 329 + 327 @@ -5773,7 +5761,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -5793,7 +5781,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 libs/ui/src/lib/assistant/assistant.component.ts @@ -5821,7 +5809,7 @@ any apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -5841,7 +5829,7 @@ anys apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -5908,14 +5896,6 @@ 76 - - , - , - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 146 - - Last All Time High Darrer tot el temps @@ -5953,7 +5933,7 @@ {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} apps/client/src/app/components/admin-market-data/admin-market-data.html - 277 + 275 @@ -6001,15 +5981,7 @@ Import total previst libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 66 - - - - annual interest rate - annual interest rate - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 186 + 62 @@ -6017,7 +5989,7 @@ Dipòsit libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 410 + 423 @@ -6033,7 +6005,7 @@ libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 420 + 433 libs/ui/src/lib/i18n.ts @@ -6045,7 +6017,7 @@ Estalvi libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 430 + 443 @@ -6093,7 +6065,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 337 + 335 libs/ui/src/lib/i18n.ts @@ -6117,15 +6089,15 @@ Classe d’actius apps/client/src/app/components/admin-market-data/admin-market-data.html - 118 + 116 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 240 + 253 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 336 + 349 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -6149,15 +6121,15 @@ Subclasse d’actiu apps/client/src/app/components/admin-market-data/admin-market-data.html - 136 + 134 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 249 + 262 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 352 + 365 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -6281,7 +6253,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 449 + 460 @@ -6305,7 +6277,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 147 + 145 @@ -6345,7 +6317,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 186 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6429,7 +6401,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 263 + 261 libs/ui/src/lib/i18n.ts @@ -6713,15 +6685,15 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 462 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 465 + 476 libs/ui/src/lib/top-holdings/top-holdings.component.html - 186 + 181 @@ -6729,7 +6701,7 @@ Mostra més libs/ui/src/lib/top-holdings/top-holdings.component.html - 179 + 174 @@ -6917,7 +6889,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 475 + 473 @@ -6933,7 +6905,7 @@ Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 761 + 757 @@ -6977,7 +6949,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 634 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7029,7 +7001,7 @@ Close apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 623 + 636 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7181,11 +7153,11 @@ - has been copied to the clipboard - has been copied to the clipboard + has been copied to the clipboard + has been copied to the clipboard apps/client/src/app/components/admin-overview/admin-overview.component.ts - 395 + 223 libs/ui/src/lib/value/value.component.ts @@ -7248,14 +7220,6 @@ 207 - - , assuming a - , assuming a - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 175 - - Financial Services Financial Services @@ -7289,7 +7253,7 @@ Delete apps/client/src/app/components/admin-market-data/admin-market-data.html - 272 + 270 @@ -7611,7 +7575,7 @@ Save apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 645 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7711,7 +7675,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 217 + 218 @@ -7727,7 +7691,7 @@ Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7735,7 +7699,7 @@ Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7743,7 +7707,7 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 506 + 519 @@ -7751,7 +7715,15 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 543 + 556 + + + + Do you really want to convert the data source to ? + Do you really want to convert the data source to ? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 485 @@ -7759,7 +7731,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 559 + 572 @@ -7767,7 +7739,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 532 @@ -7775,7 +7747,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7783,7 +7755,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7791,7 +7763,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 218 + 219 @@ -7799,7 +7771,7 @@ Create libs/ui/src/lib/tags-selector/tags-selector.component.html - 66 + 64 @@ -7811,7 +7783,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 @@ -7843,11 +7815,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 404 + 427 @@ -7996,7 +7968,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 702 + 718 @@ -8004,7 +7976,7 @@ An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 710 + 721 @@ -8028,7 +8000,7 @@ Gather Recent Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 253 + 251 @@ -8036,7 +8008,7 @@ Gather All Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 258 + 256 @@ -8116,7 +8088,7 @@ Calculations are based on delayed market data and may not be displayed in real-time. apps/client/src/app/components/home-market/home-market.html - 45 + 28 apps/client/src/app/components/markets/markets.html @@ -8149,7 +8121,7 @@ Demo user account has been synced. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 316 + 323 @@ -8371,7 +8343,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 1d65a313ab..9cda8237ba 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -70,7 +70,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 185 + 183 @@ -114,7 +114,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 332 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -210,11 +210,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 286 + 284 libs/ui/src/lib/activities-table/activities-table.component.html - 322 + 320 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -238,7 +238,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 306 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -254,7 +254,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 485 + 483 @@ -262,7 +262,7 @@ Löschen apps/client/src/app/components/admin-market-data/admin-market-data.html - 329 + 327 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -294,7 +294,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 515 + 513 libs/ui/src/lib/benchmark/benchmark.component.html @@ -334,11 +334,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 109 + 107 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 184 + 197 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -414,7 +414,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 473 + 486 @@ -470,7 +470,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 194 + 192 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -490,7 +490,7 @@ Marktpreis apps/client/src/app/components/admin-market-data/admin-market-data.html - 154 + 152 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -506,11 +506,11 @@ Erste Aktivität apps/client/src/app/components/admin-market-data/admin-market-data.html - 169 + 167 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 222 + 235 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -526,7 +526,7 @@ Historische Daten apps/client/src/app/components/admin-market-data/admin-market-data.html - 193 + 191 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -538,7 +538,7 @@ Möchtest du diesen Gutscheincode wirklich löschen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 235 + 242 @@ -546,7 +546,7 @@ Möchtest du den Cache wirklich leeren? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 272 + 279 @@ -554,7 +554,7 @@ Bitte gebe deine Systemmeldung ein: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 292 + 299 @@ -570,7 +570,7 @@ Letzte historische Marktdaten synchronisieren apps/client/src/app/components/admin-market-data/admin-market-data.html - 253 + 251 @@ -578,7 +578,7 @@ Alle historischen Marktdaten synchronisieren apps/client/src/app/components/admin-market-data/admin-market-data.html - 258 + 256 @@ -586,7 +586,7 @@ Profildaten synchronisieren apps/client/src/app/components/admin-market-data/admin-market-data.html - 262 + 260 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -824,10 +824,6 @@ Last Days Letzte Tage - - apps/client/src/app/components/home-market/home-market.html - 7 - apps/client/src/app/components/markets/markets.html 17 @@ -864,6 +860,10 @@ or oder + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 167 + apps/client/src/app/components/admin-settings/admin-settings.component.html 30 @@ -884,14 +884,6 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 100 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 84 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 162 - apps/client/src/app/pages/pricing/pricing-page.html 326 @@ -1014,11 +1006,11 @@ Sektoren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 301 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 407 + 420 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1034,11 +1026,11 @@ Länder apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 298 + 311 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 418 + 431 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1122,7 +1114,7 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 libs/ui/src/lib/assistant/assistant.component.ts @@ -1134,7 +1126,7 @@ 1J apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 libs/ui/src/lib/assistant/assistant.component.ts @@ -1154,7 +1146,7 @@ 5J apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -1174,7 +1166,7 @@ Max apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 244 libs/ui/src/lib/assistant/assistant.component.ts @@ -1190,7 +1182,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 191 @@ -1300,14 +1292,6 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html 33 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 81 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 159 - apps/client/src/app/pages/pricing/pricing-page.html 265 @@ -1366,7 +1350,7 @@ Lokalität apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 547 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1526,11 +1510,11 @@ Währung apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 216 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 326 + 339 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1550,7 +1534,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 305 + 303 @@ -1834,7 +1818,7 @@ Märkte apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 390 + 403 apps/client/src/app/components/footer/footer.component.html @@ -2062,7 +2046,7 @@ Aktuelle Woche apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 @@ -2130,7 +2114,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 215 + 213 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2146,7 +2130,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 239 + 237 @@ -2154,7 +2138,7 @@ Kommentar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 455 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2170,7 +2154,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 372 + 370 @@ -2186,7 +2170,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 231 + 244 apps/client/src/app/components/admin-overview/admin-overview.html @@ -2230,7 +2214,7 @@ Daten importieren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 170 @@ -2238,7 +2222,7 @@ Der Import wurde abgeschlossen apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 182 + 180 @@ -2422,7 +2406,7 @@ Aktivitäten importieren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 92 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2430,7 +2414,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 408 + 406 @@ -2442,7 +2426,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 436 + 434 @@ -2454,7 +2438,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 449 + 447 @@ -2462,7 +2446,7 @@ Kopieren libs/ui/src/lib/activities-table/activities-table.component.html - 494 + 492 @@ -2470,7 +2454,7 @@ Geplante Aktivität als ICS exportieren libs/ui/src/lib/activities-table/activities-table.component.html - 504 + 502 @@ -2478,7 +2462,7 @@ Möchtest du diese Aktivität wirklich löschen? libs/ui/src/lib/activities-table/activities-table.component.ts - 329 + 327 @@ -2510,7 +2494,7 @@ {VAR_PLURAL, plural, =1 {Profil} other {Profile}} apps/client/src/app/components/admin-market-data/admin-market-data.html - 277 + 275 @@ -2558,7 +2542,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 190 @@ -2570,7 +2554,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 190 + 188 @@ -2589,12 +2573,20 @@ 149 + + By , this is projected to increase to per year or per month, assuming a annual interest rate. + By , this is projected to increase to per year or per month, assuming a annual interest rate. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 132 + + Sector Sektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 280 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2606,7 +2598,7 @@ Land apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 282 + 295 apps/client/src/app/components/admin-users/admin-users.html @@ -2682,7 +2674,7 @@ Projizierter Gesamtbetrag libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 66 + 62 @@ -2690,15 +2682,7 @@ Monatlich apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 94 - - - - annual interest rate - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 186 + 95 @@ -2706,7 +2690,7 @@ Einlage libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 410 + 423 @@ -2722,7 +2706,7 @@ libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 420 + 433 libs/ui/src/lib/i18n.ts @@ -2734,7 +2718,7 @@ Ersparnisse libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 430 + 443 @@ -2742,7 +2726,7 @@ Anzahl Länder apps/client/src/app/components/admin-market-data/admin-market-data.html - 211 + 209 @@ -2750,7 +2734,7 @@ Anzahl Sektoren apps/client/src/app/components/admin-market-data/admin-market-data.html - 202 + 200 @@ -2772,10 +2756,6 @@ Fear Angst - - apps/client/src/app/components/home-market/home-market.component.ts - 48 - apps/client/src/app/components/markets/markets.component.ts 46 @@ -2788,10 +2768,6 @@ Greed Gier - - apps/client/src/app/components/home-market/home-market.component.ts - 49 - apps/client/src/app/components/markets/markets.component.ts 47 @@ -2806,7 +2782,7 @@ Filtern nach... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 367 + 365 @@ -2842,11 +2818,11 @@ Das Formular konnte nicht validiert werden apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 621 + 641 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 624 + 644 @@ -2862,7 +2838,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 388 + 401 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -2982,7 +2958,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 337 + 335 libs/ui/src/lib/i18n.ts @@ -2998,15 +2974,15 @@ Anlageklasse apps/client/src/app/components/admin-market-data/admin-market-data.html - 118 + 116 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 240 + 253 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 336 + 349 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3038,7 +3014,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 186 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -3210,7 +3186,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 449 + 460 @@ -3230,15 +3206,15 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 462 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 465 + 476 libs/ui/src/lib/top-holdings/top-holdings.component.html - 186 + 181 @@ -3333,12 +3309,20 @@ 176 + + Do you really want to convert this asset profile to ()? + Do you really want to convert this asset profile to ()? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 723 + + Data Gathering Frequency Häufigkeit der Datensynchronisierung apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 454 + 467 @@ -3346,7 +3330,7 @@ Anzahl Aktivitäten apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 182 @@ -3362,7 +3346,7 @@ Symbol Zuordnung apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 396 + 409 @@ -3406,7 +3390,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 libs/ui/src/lib/i18n.ts @@ -3418,15 +3402,15 @@ Anlageunterklasse apps/client/src/app/components/admin-market-data/admin-market-data.html - 136 + 134 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 249 + 262 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 352 + 365 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3454,7 +3438,7 @@ Daten validieren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 293 + 291 @@ -3542,7 +3526,7 @@ Jährlich apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 95 + 96 @@ -3550,7 +3534,7 @@ Dividenden importieren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 133 + 131 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3558,7 +3542,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 422 + 420 @@ -3610,7 +3594,7 @@ Keine Aktivitäten apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 147 + 145 @@ -3794,7 +3778,7 @@ Stündlich apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 214 + 216 @@ -3902,11 +3886,11 @@ Das Anlageprofil konnte nicht gespeichert werden apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 655 + 675 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 658 + 678 @@ -4098,7 +4082,7 @@ Möchtest du diese Aktivitäten wirklich löschen? libs/ui/src/lib/activities-table/activities-table.component.ts - 319 + 317 @@ -4117,14 +4101,6 @@ 11 - - By - Bis - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 140 - - Update platform Plattform bearbeiten @@ -4138,7 +4114,7 @@ Aktuelles Jahr apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 @@ -4154,11 +4130,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 429 + 442 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 588 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4174,7 +4150,7 @@ Das Anlageprofil wurde gespeichert apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 645 + 665 @@ -4566,7 +4542,7 @@ Scraper Konfiguration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 496 + 509 @@ -4629,6 +4605,14 @@ 108 + + Coupon has been created + Coupon has been created + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 224 + + Available in Verfügbar in @@ -4834,7 +4818,7 @@ ETFs ohne Länder apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 135 @@ -4842,7 +4826,15 @@ ETFs ohne Sektoren apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 140 + + + + An error occurred while converting the data source to . + An error occurred while converting the data source to . + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 482 @@ -4965,14 +4957,6 @@ 49 - - this is projected to increase to - wird ein Anstieg prognostiziert auf - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 148 - - Biometric Authentication Biometrische Authentifizierung @@ -5078,7 +5062,7 @@ Währungen apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 130 apps/client/src/app/pages/public/public-page.html @@ -5130,11 +5114,11 @@ Die Scraper Konfiguration konnte nicht geparsed werden apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 569 + 589 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 572 + 592 @@ -5751,6 +5735,14 @@ 348 + + Convert to + Convert to + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 174 + + (Last 30 days) (Letzte 30 Tage) @@ -5820,7 +5812,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 263 + 261 libs/ui/src/lib/i18n.ts @@ -5995,14 +5987,6 @@ 5 - - , - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 146 - - Last All Time High Letztes Allzeithoch @@ -6011,18 +5995,6 @@ 105 - - per month - pro Monat - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 95 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 173 - - Ghostfolio vs comparison table Ghostfolio vs Vergleichstabelle @@ -6100,7 +6072,7 @@ Möchtest du diese Systemmeldung wirklich löschen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 248 + 255 @@ -6168,7 +6140,7 @@ Der aktuelle Marktpreis ist apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 770 + 766 @@ -6176,7 +6148,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 606 @@ -6260,11 +6232,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 84 + 85 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 100 + 101 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6332,7 +6304,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -6352,7 +6324,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 libs/ui/src/lib/assistant/assistant.component.ts @@ -6416,7 +6388,7 @@ Jahr apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6436,7 +6408,7 @@ Jahre apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -6456,7 +6428,7 @@ Finanzmarktdaten synchronisieren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 616 + 629 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6521,7 +6493,7 @@ Täglich apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 210 + 212 @@ -6705,7 +6677,7 @@ Berücksichtigen in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 399 @@ -6721,7 +6693,7 @@ Mehr anzeigen libs/ui/src/lib/top-holdings/top-holdings.component.html - 179 + 174 @@ -6729,7 +6701,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 125 @@ -6941,7 +6913,7 @@ Position ansehen libs/ui/src/lib/activities-table/activities-table.component.html - 475 + 473 @@ -6957,7 +6929,7 @@ Fehler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 761 + 757 @@ -7001,7 +6973,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 634 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7053,7 +7025,7 @@ Schliessen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 623 + 636 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7205,11 +7177,11 @@ - has been copied to the clipboard - wurde in die Zwischenablage kopiert + has been copied to the clipboard + wurde in die Zwischenablage kopiert apps/client/src/app/components/admin-overview/admin-overview.component.ts - 395 + 223 libs/ui/src/lib/value/value.component.ts @@ -7272,14 +7244,6 @@ 207 - - , assuming a - , bei einem angenommenen Jahreszinssatz von - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 175 - - Financial Services Finanzdienstleistungen @@ -7313,7 +7277,7 @@ löschen apps/client/src/app/components/admin-market-data/admin-market-data.html - 272 + 270 @@ -7635,7 +7599,7 @@ Speichern apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 645 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7735,7 +7699,7 @@ KI-Anweisung wurde in die Zwischenablage kopiert apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 217 + 218 @@ -7751,7 +7715,7 @@ Verzögert apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7759,7 +7723,7 @@ Sofort apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7767,7 +7731,7 @@ Standardmarktpreis apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 506 + 519 @@ -7775,7 +7739,15 @@ Modus apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 543 + 556 + + + + Do you really want to convert the data source to ? + Do you really want to convert the data source to ? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 485 @@ -7783,7 +7755,7 @@ Selektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 559 + 572 @@ -7791,7 +7763,7 @@ HTTP Request-Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 532 @@ -7799,7 +7771,7 @@ Tagesende apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7807,7 +7779,7 @@ in Echtzeit apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7815,7 +7787,7 @@ Öffne Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 218 + 219 @@ -7823,7 +7795,7 @@ Erstelle libs/ui/src/lib/tags-selector/tags-selector.component.html - 66 + 64 @@ -7835,7 +7807,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 @@ -7867,11 +7839,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 404 + 427 @@ -8020,7 +7992,7 @@ () wird bereits verwendet. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 702 + 718 @@ -8028,7 +8000,7 @@ Bei der Änderung zu () ist ein Fehler aufgetreten. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 710 + 721 @@ -8116,7 +8088,7 @@ Berechnungen basieren auf verzögerten Marktdaten und werden nicht in Echtzeit angezeigt. apps/client/src/app/components/home-market/home-market.html - 45 + 28 apps/client/src/app/components/markets/markets.html @@ -8149,7 +8121,7 @@ Demo Benutzerkonto wurde synchronisiert. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 316 + 323 @@ -8371,7 +8343,7 @@ Aktueller Monat apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index e030136af3..1711b8aa1f 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -71,7 +71,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 185 + 183 @@ -115,7 +115,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 332 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -211,11 +211,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 286 + 284 libs/ui/src/lib/activities-table/activities-table.component.html - 322 + 320 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -239,7 +239,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 306 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -255,7 +255,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 485 + 483 @@ -263,7 +263,7 @@ Eliminar apps/client/src/app/components/admin-market-data/admin-market-data.html - 329 + 327 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -295,7 +295,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 515 + 513 libs/ui/src/lib/benchmark/benchmark.component.html @@ -335,11 +335,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 109 + 107 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 184 + 197 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -415,7 +415,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 473 + 486 @@ -471,7 +471,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 194 + 192 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -491,7 +491,7 @@ Precio de mercado apps/client/src/app/components/admin-market-data/admin-market-data.html - 154 + 152 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -507,11 +507,11 @@ Primera operación apps/client/src/app/components/admin-market-data/admin-market-data.html - 169 + 167 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 222 + 235 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -527,7 +527,7 @@ Datos históricos apps/client/src/app/components/admin-market-data/admin-market-data.html - 193 + 191 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -539,7 +539,7 @@ ¿Seguro que quieres eliminar este cupón? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 235 + 242 @@ -547,7 +547,7 @@ ¿Seguro que quieres limpiar la caché? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 272 + 279 @@ -555,7 +555,7 @@ Por favor, establece tu mensaje del sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 292 + 299 @@ -571,7 +571,7 @@ Recopilar datos del perfil apps/client/src/app/components/admin-market-data/admin-market-data.html - 262 + 260 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -809,10 +809,6 @@ Last Days Últimos días - - apps/client/src/app/components/home-market/home-market.html - 7 - apps/client/src/app/components/markets/markets.html 17 @@ -849,6 +845,10 @@ or o + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 167 + apps/client/src/app/components/admin-settings/admin-settings.component.html 30 @@ -869,14 +869,6 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 100 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 84 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 162 - apps/client/src/app/pages/pricing/pricing-page.html 326 @@ -999,11 +991,11 @@ Sectores apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 301 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 407 + 420 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1019,11 +1011,11 @@ Países apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 298 + 311 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 418 + 431 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1107,7 +1099,7 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 libs/ui/src/lib/assistant/assistant.component.ts @@ -1119,7 +1111,7 @@ 1 año apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 libs/ui/src/lib/assistant/assistant.component.ts @@ -1139,7 +1131,7 @@ 5 años apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -1159,7 +1151,7 @@ Máximo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 244 libs/ui/src/lib/assistant/assistant.component.ts @@ -1175,7 +1167,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 191 @@ -1285,14 +1277,6 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html 33 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 81 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 159 - apps/client/src/app/pages/pricing/pricing-page.html 265 @@ -1351,7 +1335,7 @@ Configuración regional apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 547 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1511,11 +1495,11 @@ Divisa apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 216 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 326 + 339 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1535,7 +1519,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 305 + 303 @@ -1819,7 +1803,7 @@ Mercados apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 390 + 403 apps/client/src/app/components/footer/footer.component.html @@ -2047,7 +2031,7 @@ Semana actual apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 @@ -2115,7 +2099,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 215 + 213 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2131,7 +2115,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 239 + 237 @@ -2139,7 +2123,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 455 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2155,7 +2139,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 372 + 370 @@ -2171,7 +2155,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 231 + 244 apps/client/src/app/components/admin-overview/admin-overview.html @@ -2215,7 +2199,7 @@ Importando datos... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 170 @@ -2223,7 +2207,7 @@ La importación se ha completado apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 182 + 180 @@ -2407,7 +2391,7 @@ Importar operaciones apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 92 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2415,7 +2399,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 408 + 406 @@ -2427,7 +2411,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 436 + 434 @@ -2439,7 +2423,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 449 + 447 @@ -2447,7 +2431,7 @@ Clonar libs/ui/src/lib/activities-table/activities-table.component.html - 494 + 492 @@ -2455,7 +2439,7 @@ Exportar borrador como ICS libs/ui/src/lib/activities-table/activities-table.component.html - 504 + 502 @@ -2463,7 +2447,7 @@ ¿Seguro que quieres eliminar esta operación? libs/ui/src/lib/activities-table/activities-table.component.ts - 329 + 327 @@ -2495,7 +2479,7 @@ {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} apps/client/src/app/components/admin-market-data/admin-market-data.html - 277 + 275 @@ -2539,7 +2523,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 190 + 188 @@ -2555,7 +2539,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 190 @@ -2622,12 +2606,20 @@ 176 + + By , this is projected to increase to per year or per month, assuming a annual interest rate. + By , this is projected to increase to per year or per month, assuming a annual interest rate. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 132 + + Sector Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 280 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2639,7 +2631,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 282 + 295 apps/client/src/app/components/admin-users/admin-users.html @@ -2667,7 +2659,7 @@ Importe total previsto libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 66 + 62 @@ -2675,7 +2667,7 @@ Ahorros libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 430 + 443 @@ -2691,27 +2683,19 @@ libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 420 + 433 libs/ui/src/lib/i18n.ts 45 - - annual interest rate - tasa de interés anual - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 186 - - Deposit Depósito libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 410 + 423 @@ -2719,7 +2703,7 @@ Mensual apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 94 + 95 @@ -2727,7 +2711,7 @@ Número de sectores apps/client/src/app/components/admin-market-data/admin-market-data.html - 202 + 200 @@ -2751,16 +2735,12 @@ Número de países apps/client/src/app/components/admin-market-data/admin-market-data.html - 211 + 209 Fear Miedo - - apps/client/src/app/components/home-market/home-market.component.ts - 48 - apps/client/src/app/components/markets/markets.component.ts 46 @@ -2773,10 +2753,6 @@ Greed Codicia - - apps/client/src/app/components/home-market/home-market.component.ts - 49 - apps/client/src/app/components/markets/markets.component.ts 47 @@ -2791,7 +2767,7 @@ Filtrar por... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 367 + 365 @@ -2827,7 +2803,7 @@ Índice de referencia apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 388 + 401 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -2839,11 +2815,11 @@ No se pudo validar el formulario apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 621 + 641 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 624 + 644 @@ -2967,7 +2943,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 337 + 335 libs/ui/src/lib/i18n.ts @@ -2983,15 +2959,15 @@ Tipo de activo apps/client/src/app/components/admin-market-data/admin-market-data.html - 118 + 116 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 240 + 253 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 336 + 349 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3023,7 +2999,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 186 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -3195,7 +3171,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 449 + 460 @@ -3215,15 +3191,15 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 462 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 465 + 476 libs/ui/src/lib/top-holdings/top-holdings.component.html - 186 + 181 @@ -3318,12 +3294,20 @@ 176 + + Do you really want to convert this asset profile to ()? + Do you really want to convert this asset profile to ()? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 723 + + Data Gathering Frequency Data Gathering Frequency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 454 + 467 @@ -3331,7 +3315,7 @@ Número de operaciones apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 182 @@ -3347,7 +3331,7 @@ Mapeo de símbolos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 396 + 409 @@ -3383,7 +3367,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 libs/ui/src/lib/i18n.ts @@ -3403,15 +3387,15 @@ Subtipo de activo apps/client/src/app/components/admin-market-data/admin-market-data.html - 136 + 134 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 249 + 262 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 352 + 365 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3439,7 +3423,7 @@ Validando datos... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 293 + 291 @@ -3527,7 +3511,7 @@ Anual apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 95 + 96 @@ -3535,7 +3519,7 @@ Importar dividendos apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 133 + 131 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3543,7 +3527,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 422 + 420 @@ -3595,7 +3579,7 @@ Sin operaciones apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 147 + 145 @@ -3779,7 +3763,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 214 + 216 @@ -3887,11 +3871,11 @@ No se pudo guardar el perfil del activo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 655 + 675 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 658 + 678 @@ -4075,7 +4059,7 @@ ¿Seguro que quieres eliminar estas operaciones? libs/ui/src/lib/activities-table/activities-table.component.ts - 319 + 317 @@ -4094,14 +4078,6 @@ 11 - - By - Por - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 140 - - Update platform Actualizar plataforma @@ -4115,7 +4091,7 @@ Año actual apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 @@ -4131,11 +4107,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 429 + 442 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 588 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4151,7 +4127,7 @@ Perfil del activo guardado apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 645 + 665 @@ -4543,7 +4519,7 @@ Configuración del scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 496 + 509 @@ -4606,6 +4582,14 @@ 108 + + Coupon has been created + Coupon has been created + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 224 + + Available in Disponible en @@ -4811,7 +4795,7 @@ ETFs sin países apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 135 @@ -4819,7 +4803,15 @@ ETFs sin sectores apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 140 + + + + An error occurred while converting the data source to . + An error occurred while converting the data source to . + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 482 @@ -4942,14 +4934,6 @@ 49 - - this is projected to increase to - se proyecta que esto aumente a - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 148 - - Biometric Authentication Autenticación biométrica @@ -5055,7 +5039,7 @@ Divisas apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 130 apps/client/src/app/pages/public/public-page.html @@ -5107,11 +5091,11 @@ No se pudo analizar la configuración del scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 569 + 589 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 572 + 592 @@ -5728,6 +5712,14 @@ 348 + + Convert to + Convert to + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 174 + + (Last 30 days) (Últimos 30 días) @@ -5797,7 +5789,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 263 + 261 libs/ui/src/lib/i18n.ts @@ -5972,14 +5964,6 @@ 5 - - , - , - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 146 - - Last All Time High Último máximo histórico @@ -5988,18 +5972,6 @@ 105 - - per month - por mes - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 95 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 173 - - Ghostfolio vs comparison table Tabla comparativa de Ghostfolio vs @@ -6077,7 +6049,7 @@ ¿Seguro que quieres eliminar este mensaje del sistema? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 248 + 255 @@ -6145,7 +6117,7 @@ El precio actual de mercado es apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 770 + 766 @@ -6153,7 +6125,7 @@ Prueba apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 606 @@ -6237,11 +6209,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 84 + 85 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 100 + 101 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6309,7 +6281,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -6329,7 +6301,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 libs/ui/src/lib/assistant/assistant.component.ts @@ -6393,7 +6365,7 @@ año apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6413,7 +6385,7 @@ años apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -6433,7 +6405,7 @@ Recopilación de datos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 616 + 629 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6498,7 +6470,7 @@ Daily apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 210 + 212 @@ -6682,7 +6654,7 @@ Incluir en apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 399 @@ -6698,7 +6670,7 @@ Mostrar más libs/ui/src/lib/top-holdings/top-holdings.component.html - 179 + 174 @@ -6706,7 +6678,7 @@ Índices de referencia apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 125 @@ -6918,7 +6890,7 @@ Ver posición libs/ui/src/lib/activities-table/activities-table.component.html - 475 + 473 @@ -6934,7 +6906,7 @@ Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 761 + 757 @@ -6978,7 +6950,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 634 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7030,7 +7002,7 @@ Cerrar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 623 + 636 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7182,11 +7154,11 @@ - has been copied to the clipboard - ha sido copiado al portapapeles + has been copied to the clipboard + ha sido copiado al portapapeles apps/client/src/app/components/admin-overview/admin-overview.component.ts - 395 + 223 libs/ui/src/lib/value/value.component.ts @@ -7249,14 +7221,6 @@ 207 - - , assuming a - , asumiendo un - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 175 - - Financial Services Servicios Financieros @@ -7290,7 +7254,7 @@ Delete apps/client/src/app/components/admin-market-data/admin-market-data.html - 272 + 270 @@ -7612,7 +7576,7 @@ Guardar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 645 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7712,7 +7676,7 @@ El prompt para la IA ha sido copiado al portapapeles apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 217 + 218 @@ -7728,7 +7692,7 @@ Bajo demanda apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7736,7 +7700,7 @@ Instantáneo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7744,7 +7708,7 @@ Precio de mercado por defecto apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 506 + 519 @@ -7752,7 +7716,15 @@ Modo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 543 + 556 + + + + Do you really want to convert the data source to ? + Do you really want to convert the data source to ? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 485 @@ -7760,7 +7732,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 559 + 572 @@ -7768,7 +7740,7 @@ Encabezados de solicitud HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 532 @@ -7776,7 +7748,7 @@ final del día apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7784,7 +7756,7 @@ en tiempo real apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7792,7 +7764,7 @@ Abrir Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 218 + 219 @@ -7800,7 +7772,7 @@ Crear libs/ui/src/lib/tags-selector/tags-selector.component.html - 66 + 64 @@ -7812,7 +7784,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 @@ -7844,11 +7816,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 404 + 427 @@ -7997,7 +7969,7 @@ () ya está en uso. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 702 + 718 @@ -8005,7 +7977,7 @@ Ocurrió un error al actualizar a (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 710 + 721 @@ -8029,7 +8001,7 @@ Recopilar datos históricos recientes del mercado apps/client/src/app/components/admin-market-data/admin-market-data.html - 253 + 251 @@ -8037,7 +8009,7 @@ Recopilar todos los datos históricos del mercado apps/client/src/app/components/admin-market-data/admin-market-data.html - 258 + 256 @@ -8117,7 +8089,7 @@ Los cálculos se basan en datos de mercado con retraso y es posible que no se muestren en tiempo real. apps/client/src/app/components/home-market/home-market.html - 45 + 28 apps/client/src/app/components/markets/markets.html @@ -8150,7 +8122,7 @@ La cuenta de usuario de demostración se ha sincronizado. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 316 + 323 @@ -8372,7 +8344,7 @@ Mes actual apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 3763466f76..5282f74c9b 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -62,7 +62,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 185 + 183 @@ -122,7 +122,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 332 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -198,11 +198,11 @@ Devise apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 216 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 326 + 339 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -222,7 +222,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 305 + 303 @@ -274,11 +274,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 286 + 284 libs/ui/src/lib/activities-table/activities-table.component.html - 322 + 320 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -302,7 +302,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 306 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -318,7 +318,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 485 + 483 @@ -326,7 +326,7 @@ Supprimer apps/client/src/app/components/admin-market-data/admin-market-data.html - 329 + 327 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -358,7 +358,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 515 + 513 libs/ui/src/lib/benchmark/benchmark.component.html @@ -390,11 +390,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 109 + 107 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 184 + 197 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -478,7 +478,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 473 + 486 @@ -534,7 +534,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 194 + 192 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -554,7 +554,7 @@ Prix du marché apps/client/src/app/components/admin-market-data/admin-market-data.html - 154 + 152 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -570,7 +570,7 @@ Filtrer par... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 367 + 365 @@ -578,11 +578,11 @@ Première Activité apps/client/src/app/components/admin-market-data/admin-market-data.html - 169 + 167 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 222 + 235 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -598,7 +598,7 @@ Fréquence de collecte des données apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 454 + 467 @@ -606,7 +606,7 @@ Nombre d’Activités apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 182 @@ -614,7 +614,7 @@ Données Historiques apps/client/src/app/components/admin-market-data/admin-market-data.html - 193 + 191 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -626,7 +626,7 @@ Nombre de Secteurs apps/client/src/app/components/admin-market-data/admin-market-data.html - 202 + 200 @@ -650,7 +650,7 @@ Nombre de Pays apps/client/src/app/components/admin-market-data/admin-market-data.html - 211 + 209 @@ -658,7 +658,7 @@ Obtenir les Données du Profil apps/client/src/app/components/admin-market-data/admin-market-data.html - 262 + 260 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -673,12 +673,20 @@ 21 + + By , this is projected to increase to per year or per month, assuming a annual interest rate. + By , this is projected to increase to per year or per month, assuming a annual interest rate. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 132 + + Sector Secteur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 280 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -690,7 +698,7 @@ Pays apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 282 + 295 apps/client/src/app/components/admin-users/admin-users.html @@ -710,11 +718,11 @@ Secteurs apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 301 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 407 + 420 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -730,11 +738,11 @@ Pays apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 298 + 311 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 418 + 431 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -746,7 +754,7 @@ Équivalence de Symboles apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 396 + 409 @@ -754,7 +762,7 @@ Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 455 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -770,7 +778,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 372 + 370 @@ -778,7 +786,7 @@ Voulez-vous vraiment supprimer ce code promotionnel ? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 235 + 242 @@ -786,7 +794,7 @@ Voulez-vous vraiment vider le cache ? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 272 + 279 @@ -794,7 +802,7 @@ Veuillez définir votre message système : apps/client/src/app/components/admin-overview/admin-overview.component.ts - 292 + 299 @@ -954,11 +962,11 @@ Le formulaire n’a pas pu être validé apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 621 + 641 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 624 + 644 @@ -998,7 +1006,7 @@ Référence apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 388 + 401 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1072,10 +1080,6 @@ Fear Peur - - apps/client/src/app/components/home-market/home-market.component.ts - 48 - apps/client/src/app/components/markets/markets.component.ts 46 @@ -1088,10 +1092,6 @@ Greed Avidité - - apps/client/src/app/components/home-market/home-market.component.ts - 49 - apps/client/src/app/components/markets/markets.component.ts 47 @@ -1104,10 +1104,6 @@ Last Days derniers jours - - apps/client/src/app/components/home-market/home-market.html - 7 - apps/client/src/app/components/markets/markets.html 17 @@ -1168,6 +1164,10 @@ or ou + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 167 + apps/client/src/app/components/admin-settings/admin-settings.component.html 30 @@ -1188,14 +1188,6 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 100 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 84 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 162 - apps/client/src/app/pages/pricing/pricing-page.html 326 @@ -1350,7 +1342,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 215 + 213 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1382,7 +1374,7 @@ CDA apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 libs/ui/src/lib/assistant/assistant.component.ts @@ -1394,7 +1386,7 @@ 1A apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 libs/ui/src/lib/assistant/assistant.component.ts @@ -1414,7 +1406,7 @@ 5A apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -1434,7 +1426,7 @@ Max apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 244 libs/ui/src/lib/assistant/assistant.component.ts @@ -1462,7 +1454,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 190 @@ -1474,7 +1466,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 190 + 188 @@ -1486,7 +1478,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 191 @@ -1608,14 +1600,6 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html 33 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 81 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 159 - apps/client/src/app/pages/pricing/pricing-page.html 265 @@ -1682,7 +1666,7 @@ Paramètres régionaux apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 547 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2166,7 +2150,7 @@ Marchés apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 390 + 403 apps/client/src/app/components/footer/footer.component.html @@ -2222,7 +2206,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 231 + 244 apps/client/src/app/components/admin-overview/admin-overview.html @@ -2274,7 +2258,7 @@ Semaine en cours apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 @@ -2338,7 +2322,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 239 + 237 @@ -2346,7 +2330,7 @@ Import des données... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 170 @@ -2354,7 +2338,7 @@ L’import est terminé apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 182 + 180 @@ -2370,7 +2354,7 @@ Validation des données... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 293 + 291 @@ -2401,6 +2385,14 @@ 176 + + Do you really want to convert this asset profile to ()? + Do you really want to convert this asset profile to ()? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 723 + + Import Importer @@ -2618,27 +2610,19 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 libs/ui/src/lib/i18n.ts 43 - - annual interest rate - taux d’intérêt annuel - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 186 - - Deposit Dépôt libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 410 + 423 @@ -2646,7 +2630,7 @@ Mensuel apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 94 + 95 @@ -2962,7 +2946,7 @@ Importer Activités apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 92 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2970,7 +2954,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 408 + 406 @@ -2982,7 +2966,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 436 + 434 @@ -2994,7 +2978,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 449 + 447 @@ -3002,7 +2986,7 @@ Dupliquer libs/ui/src/lib/activities-table/activities-table.component.html - 494 + 492 @@ -3010,7 +2994,7 @@ Exporter Brouillon sous ICS libs/ui/src/lib/activities-table/activities-table.component.html - 504 + 502 @@ -3018,7 +3002,7 @@ Voulez-vous vraiment supprimer cette activité ? libs/ui/src/lib/activities-table/activities-table.component.ts - 329 + 327 @@ -3050,7 +3034,7 @@ {VAR_PLURAL, plural, =1 {Profil} other {Profils}} apps/client/src/app/components/admin-market-data/admin-market-data.html - 277 + 275 @@ -3066,7 +3050,7 @@ Montant Total Prévu libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 66 + 62 @@ -3082,7 +3066,7 @@ libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 420 + 433 libs/ui/src/lib/i18n.ts @@ -3094,7 +3078,7 @@ Épargne libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 430 + 443 @@ -3142,7 +3126,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 337 + 335 libs/ui/src/lib/i18n.ts @@ -3158,15 +3142,15 @@ Classe d’Actifs apps/client/src/app/components/admin-market-data/admin-market-data.html - 118 + 116 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 240 + 253 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 336 + 349 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3190,15 +3174,15 @@ Sous-classe d’Actifs apps/client/src/app/components/admin-market-data/admin-market-data.html - 136 + 134 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 249 + 262 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 352 + 365 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3242,7 +3226,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 449 + 460 @@ -3258,7 +3242,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 186 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -3490,15 +3474,15 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 462 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 465 + 476 libs/ui/src/lib/top-holdings/top-holdings.component.html - 186 + 181 @@ -3526,7 +3510,7 @@ Annuel apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 95 + 96 @@ -3534,7 +3518,7 @@ Importer Dividendes apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 133 + 131 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3542,7 +3526,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 422 + 420 @@ -3594,7 +3578,7 @@ Aucune Activité apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 147 + 145 @@ -3778,7 +3762,7 @@ Toutes les heures apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 214 + 216 @@ -3886,11 +3870,11 @@ Le profil d’actif n’a pas pu être enregistré apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 655 + 675 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 658 + 678 @@ -4074,7 +4058,7 @@ Voulez-vous vraiment supprimer toutes vos activités ? libs/ui/src/lib/activities-table/activities-table.component.ts - 319 + 317 @@ -4093,14 +4077,6 @@ 11 - - By - By - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 140 - - Update platform Mettre à jour la Plateforme @@ -4114,7 +4090,7 @@ Année en cours apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 @@ -4130,11 +4106,11 @@ Lien apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 429 + 442 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 588 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4150,7 +4126,7 @@ Le profil d’actif a été enregistré apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 645 + 665 @@ -4542,7 +4518,7 @@ Configuration du Scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 496 + 509 @@ -4605,6 +4581,14 @@ 108 + + Coupon has been created + Coupon has been created + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 224 + + Available in Disponible en @@ -4810,7 +4794,7 @@ ETF sans Pays apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 135 @@ -4818,7 +4802,15 @@ ETF sans Secteurs apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 140 + + + + An error occurred while converting the data source to . + An error occurred while converting the data source to . + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 482 @@ -4941,14 +4933,6 @@ 49 - - this is projected to increase to - cela devrait augmenter jusqu’à - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 148 - - Biometric Authentication Authentication biométrique @@ -5054,7 +5038,7 @@ Devises apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 130 apps/client/src/app/pages/public/public-page.html @@ -5106,11 +5090,11 @@ La configuration du scraper n’a pas pu être analysée apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 569 + 589 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 572 + 592 @@ -5727,6 +5711,14 @@ 348 + + Convert to + Convert to + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 174 + + (Last 30 days) (Derniers 30 jours) @@ -5796,7 +5788,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 263 + 261 libs/ui/src/lib/i18n.ts @@ -5971,14 +5963,6 @@ 5 - - , - , - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 146 - - Last All Time High Dernier All Time High @@ -5987,18 +5971,6 @@ 105 - - per month - par mois - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 95 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 173 - - Ghostfolio vs comparison table Ghostfolio vs tableau comparatif @@ -6076,7 +6048,7 @@ Confirmer la suppresion de ce message système? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 248 + 255 @@ -6144,7 +6116,7 @@ Le prix actuel du marché est apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 770 + 766 @@ -6152,7 +6124,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 606 @@ -6236,11 +6208,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 84 + 85 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 100 + 101 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6308,7 +6280,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -6328,7 +6300,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 libs/ui/src/lib/assistant/assistant.component.ts @@ -6392,7 +6364,7 @@ année apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6412,7 +6384,7 @@ années apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -6432,7 +6404,7 @@ Collecter les données apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 616 + 629 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6497,7 +6469,7 @@ Tous les jours apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 210 + 212 @@ -6681,7 +6653,7 @@ Inclure dans apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 399 @@ -6697,7 +6669,7 @@ Voir plus libs/ui/src/lib/top-holdings/top-holdings.component.html - 179 + 174 @@ -6705,7 +6677,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 125 @@ -6917,7 +6889,7 @@ Voir la Position libs/ui/src/lib/activities-table/activities-table.component.html - 475 + 473 @@ -6933,7 +6905,7 @@ Erreur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 761 + 757 @@ -6977,7 +6949,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 634 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7029,7 +7001,7 @@ Fermer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 623 + 636 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7181,11 +7153,11 @@ - has been copied to the clipboard - a été copié dans le presse-papiers + has been copied to the clipboard + a été copié dans le presse-papiers apps/client/src/app/components/admin-overview/admin-overview.component.ts - 395 + 223 libs/ui/src/lib/value/value.component.ts @@ -7248,14 +7220,6 @@ 207 - - , assuming a - , en supposant un - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 175 - - Financial Services Services Financiers @@ -7289,7 +7253,7 @@ Supprimer apps/client/src/app/components/admin-market-data/admin-market-data.html - 272 + 270 @@ -7611,7 +7575,7 @@ Sauvegarder apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 645 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7711,7 +7675,7 @@ Le prompt IA a été copié dans le presse-papiers apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 217 + 218 @@ -7727,7 +7691,7 @@ Paresseux apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7735,7 +7699,7 @@ Instantané apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7743,7 +7707,7 @@ Prix du marché par défaut apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 506 + 519 @@ -7751,7 +7715,15 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 543 + 556 + + + + Do you really want to convert the data source to ? + Do you really want to convert the data source to ? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 485 @@ -7759,7 +7731,7 @@ Selecteur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 559 + 572 @@ -7767,7 +7739,7 @@ En-têtes de requête HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 532 @@ -7775,7 +7747,7 @@ fin de journée apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7783,7 +7755,7 @@ temps réel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7791,7 +7763,7 @@ Ouvrir Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 218 + 219 @@ -7799,7 +7771,7 @@ Créer libs/ui/src/lib/tags-selector/tags-selector.component.html - 66 + 64 @@ -7811,7 +7783,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 @@ -7843,11 +7815,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 404 + 427 @@ -7996,7 +7968,7 @@ () est déjà utilisé. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 702 + 718 @@ -8004,7 +7976,7 @@ Une erreur s’est produite lors de la mise à jour vers (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 710 + 721 @@ -8028,7 +8000,7 @@ Collecter les données récentes du marché historique apps/client/src/app/components/admin-market-data/admin-market-data.html - 253 + 251 @@ -8036,7 +8008,7 @@ Collecter toutes les données du marché historique apps/client/src/app/components/admin-market-data/admin-market-data.html - 258 + 256 @@ -8116,7 +8088,7 @@ Les calculs sont basés sur des données de marché retardées et peuvent ne pas être affichés en temps réel. apps/client/src/app/components/home-market/home-market.html - 45 + 28 apps/client/src/app/components/markets/markets.html @@ -8149,7 +8121,7 @@ Le compte utilisateur de démonstration a été synchronisé. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 316 + 323 @@ -8371,7 +8343,7 @@ Mois en cours apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 86675aac45..b6193cf4d4 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -71,7 +71,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 185 + 183 @@ -115,7 +115,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 332 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -211,11 +211,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 286 + 284 libs/ui/src/lib/activities-table/activities-table.component.html - 322 + 320 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -239,7 +239,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 306 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -255,7 +255,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 485 + 483 @@ -263,7 +263,7 @@ Elimina apps/client/src/app/components/admin-market-data/admin-market-data.html - 329 + 327 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -295,7 +295,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 515 + 513 libs/ui/src/lib/benchmark/benchmark.component.html @@ -335,11 +335,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 109 + 107 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 184 + 197 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -415,7 +415,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 473 + 486 @@ -471,7 +471,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 194 + 192 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -491,7 +491,7 @@ Prezzo di mercato apps/client/src/app/components/admin-market-data/admin-market-data.html - 154 + 152 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -507,11 +507,11 @@ Prima attività apps/client/src/app/components/admin-market-data/admin-market-data.html - 169 + 167 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 222 + 235 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -527,7 +527,7 @@ Dati storici apps/client/src/app/components/admin-market-data/admin-market-data.html - 193 + 191 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -539,7 +539,7 @@ Vuoi davvero eliminare questo buono? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 235 + 242 @@ -547,7 +547,7 @@ Vuoi davvero svuotare la cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 272 + 279 @@ -555,7 +555,7 @@ Imposta il messaggio di sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 292 + 299 @@ -571,7 +571,7 @@ Raccogli i dati del profilo apps/client/src/app/components/admin-market-data/admin-market-data.html - 262 + 260 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -809,10 +809,6 @@ Last Days Ultimi giorni - - apps/client/src/app/components/home-market/home-market.html - 7 - apps/client/src/app/components/markets/markets.html 17 @@ -849,6 +845,10 @@ or oppure + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 167 + apps/client/src/app/components/admin-settings/admin-settings.component.html 30 @@ -869,14 +869,6 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 100 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 84 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 162 - apps/client/src/app/pages/pricing/pricing-page.html 326 @@ -999,11 +991,11 @@ Settori apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 301 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 407 + 420 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1019,11 +1011,11 @@ Paesi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 298 + 311 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 418 + 431 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1107,7 +1099,7 @@ anno corrente apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 libs/ui/src/lib/assistant/assistant.component.ts @@ -1119,7 +1111,7 @@ 1 anno apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 libs/ui/src/lib/assistant/assistant.component.ts @@ -1139,7 +1131,7 @@ 5 anni apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -1159,7 +1151,7 @@ Massimo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 244 libs/ui/src/lib/assistant/assistant.component.ts @@ -1175,7 +1167,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 191 @@ -1285,14 +1277,6 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html 33 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 81 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 159 - apps/client/src/app/pages/pricing/pricing-page.html 265 @@ -1351,7 +1335,7 @@ Locale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 547 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1511,11 +1495,11 @@ Valuta apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 216 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 326 + 339 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1535,7 +1519,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 305 + 303 @@ -1819,7 +1803,7 @@ Mercati apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 390 + 403 apps/client/src/app/components/footer/footer.component.html @@ -2047,7 +2031,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 @@ -2115,7 +2099,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 215 + 213 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2131,7 +2115,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 239 + 237 @@ -2139,7 +2123,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 455 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2155,7 +2139,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 372 + 370 @@ -2171,7 +2155,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 231 + 244 apps/client/src/app/components/admin-overview/admin-overview.html @@ -2215,7 +2199,7 @@ Importazione dei dati... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 170 @@ -2223,7 +2207,7 @@ L’importazione è stata completata apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 182 + 180 @@ -2407,7 +2391,7 @@ Importa le attività apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 92 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2415,7 +2399,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 408 + 406 @@ -2427,7 +2411,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 436 + 434 @@ -2439,7 +2423,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 449 + 447 @@ -2447,7 +2431,7 @@ Clona libs/ui/src/lib/activities-table/activities-table.component.html - 494 + 492 @@ -2455,7 +2439,7 @@ Esporta la bozza come ICS libs/ui/src/lib/activities-table/activities-table.component.html - 504 + 502 @@ -2463,7 +2447,7 @@ Vuoi davvero eliminare questa attività? libs/ui/src/lib/activities-table/activities-table.component.ts - 329 + 327 @@ -2495,7 +2479,7 @@ {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} apps/client/src/app/components/admin-market-data/admin-market-data.html - 277 + 275 @@ -2539,7 +2523,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 190 + 188 @@ -2555,7 +2539,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 190 @@ -2622,12 +2606,20 @@ 176 + + By , this is projected to increase to per year or per month, assuming a annual interest rate. + By , this is projected to increase to per year or per month, assuming a annual interest rate. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 132 + + Sector Settore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 280 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2639,7 +2631,7 @@ Paese apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 282 + 295 apps/client/src/app/components/admin-users/admin-users.html @@ -2667,7 +2659,7 @@ Importo totale previsto libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 66 + 62 @@ -2675,7 +2667,7 @@ Risparmio libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 430 + 443 @@ -2691,27 +2683,19 @@ libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 420 + 433 libs/ui/src/lib/i18n.ts 45 - - annual interest rate - annual interest rate - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 186 - - Deposit Deposito libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 410 + 423 @@ -2719,7 +2703,7 @@ Mensile apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 94 + 95 @@ -2727,7 +2711,7 @@ Numero di settori apps/client/src/app/components/admin-market-data/admin-market-data.html - 202 + 200 @@ -2751,16 +2735,12 @@ Numero di paesi apps/client/src/app/components/admin-market-data/admin-market-data.html - 211 + 209 Fear Paura - - apps/client/src/app/components/home-market/home-market.component.ts - 48 - apps/client/src/app/components/markets/markets.component.ts 46 @@ -2773,10 +2753,6 @@ Greed Avidità - - apps/client/src/app/components/home-market/home-market.component.ts - 49 - apps/client/src/app/components/markets/markets.component.ts 47 @@ -2791,7 +2767,7 @@ Filtra per... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 367 + 365 @@ -2827,7 +2803,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 388 + 401 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -2839,11 +2815,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 621 + 641 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 624 + 644 @@ -2967,7 +2943,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 337 + 335 libs/ui/src/lib/i18n.ts @@ -2983,15 +2959,15 @@ Classe asset apps/client/src/app/components/admin-market-data/admin-market-data.html - 118 + 116 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 240 + 253 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 336 + 349 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3023,7 +2999,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 186 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -3195,7 +3171,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 449 + 460 @@ -3215,15 +3191,15 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 462 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 465 + 476 libs/ui/src/lib/top-holdings/top-holdings.component.html - 186 + 181 @@ -3318,12 +3294,20 @@ 176 + + Do you really want to convert this asset profile to ()? + Do you really want to convert this asset profile to ()? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 723 + + Data Gathering Frequency Data Gathering Frequency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 454 + 467 @@ -3331,7 +3315,7 @@ Conteggio attività apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 182 @@ -3347,7 +3331,7 @@ Mappatura dei simboli apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 396 + 409 @@ -3383,7 +3367,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 libs/ui/src/lib/i18n.ts @@ -3403,15 +3387,15 @@ Sottoclasse asset apps/client/src/app/components/admin-market-data/admin-market-data.html - 136 + 134 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 249 + 262 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 352 + 365 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3439,7 +3423,7 @@ Convalida dei dati... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 293 + 291 @@ -3527,7 +3511,7 @@ Annuale apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 95 + 96 @@ -3535,7 +3519,7 @@ Importa i dividendi apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 133 + 131 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3543,7 +3527,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 422 + 420 @@ -3595,7 +3579,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 147 + 145 @@ -3779,7 +3763,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 214 + 216 @@ -3887,11 +3871,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 655 + 675 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 658 + 678 @@ -4075,7 +4059,7 @@ Vuoi davvero eliminare tutte le tue attività? libs/ui/src/lib/activities-table/activities-table.component.ts - 319 + 317 @@ -4094,14 +4078,6 @@ 11 - - By - By - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 140 - - Update platform Aggiorna la piattaforma @@ -4115,7 +4091,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 @@ -4131,11 +4107,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 429 + 442 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 588 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4151,7 +4127,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 645 + 665 @@ -4543,7 +4519,7 @@ Configurazione dello scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 496 + 509 @@ -4606,6 +4582,14 @@ 108 + + Coupon has been created + Coupon has been created + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 224 + + Available in Disponibile in @@ -4811,7 +4795,7 @@ ETF senza paesi apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 135 @@ -4819,7 +4803,15 @@ ETF senza settori apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 140 + + + + An error occurred while converting the data source to . + An error occurred while converting the data source to . + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 482 @@ -4942,14 +4934,6 @@ 49 - - this is projected to increase to - this is projected to increase to - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 148 - - Biometric Authentication Autenticazione biometrica @@ -5055,7 +5039,7 @@ Valute apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 130 apps/client/src/app/pages/public/public-page.html @@ -5107,11 +5091,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 569 + 589 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 572 + 592 @@ -5728,6 +5712,14 @@ 348 + + Convert to + Convert to + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 174 + + (Last 30 days) (Ultimi 30 giorni) @@ -5797,7 +5789,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 263 + 261 libs/ui/src/lib/i18n.ts @@ -5972,14 +5964,6 @@ 5 - - , - , - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 146 - - Last All Time High Ultimo massimo storico @@ -5988,18 +5972,6 @@ 105 - - per month - per month - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 95 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 173 - - Ghostfolio vs comparison table Ghostfolio vs tabella di comparazione @@ -6077,7 +6049,7 @@ Confermi di voler cancellare questo messaggio di sistema? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 248 + 255 @@ -6145,7 +6117,7 @@ L’attuale prezzo di mercato è apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 770 + 766 @@ -6153,7 +6125,7 @@ Prova apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 606 @@ -6237,11 +6209,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 84 + 85 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 100 + 101 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6309,7 +6281,7 @@ Settimana corrente apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -6329,7 +6301,7 @@ Mese corrente apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 libs/ui/src/lib/assistant/assistant.component.ts @@ -6393,7 +6365,7 @@ anno apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6413,7 +6385,7 @@ anni apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -6433,7 +6405,7 @@ Raccolta Dati apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 616 + 629 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6498,7 +6470,7 @@ Daily apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 210 + 212 @@ -6682,7 +6654,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 399 @@ -6698,7 +6670,7 @@ Visualizza di più libs/ui/src/lib/top-holdings/top-holdings.component.html - 179 + 174 @@ -6706,7 +6678,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 125 @@ -6918,7 +6890,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 475 + 473 @@ -6934,7 +6906,7 @@ Errore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 761 + 757 @@ -6978,7 +6950,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 634 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7030,7 +7002,7 @@ Chiudi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 623 + 636 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7182,11 +7154,11 @@ - has been copied to the clipboard - has been copied to the clipboard + has been copied to the clipboard + has been copied to the clipboard apps/client/src/app/components/admin-overview/admin-overview.component.ts - 395 + 223 libs/ui/src/lib/value/value.component.ts @@ -7249,14 +7221,6 @@ 207 - - , assuming a - , assuming a - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 175 - - Financial Services Financial Services @@ -7290,7 +7254,7 @@ Delete apps/client/src/app/components/admin-market-data/admin-market-data.html - 272 + 270 @@ -7612,7 +7576,7 @@ Salva apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 645 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7712,7 +7676,7 @@ L’AI prompt è stato copiato negli appunti apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 217 + 218 @@ -7728,7 +7692,7 @@ Pigro apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7736,7 +7700,7 @@ Istantaneo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7744,7 +7708,7 @@ Prezzo di mercato predefinito apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 506 + 519 @@ -7752,7 +7716,15 @@ Modalità apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 543 + 556 + + + + Do you really want to convert the data source to ? + Do you really want to convert the data source to ? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 485 @@ -7760,7 +7732,7 @@ Selettore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 559 + 572 @@ -7768,7 +7740,7 @@ Intestazioni della richiesta HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 532 @@ -7776,7 +7748,7 @@ fine giornata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7784,7 +7756,7 @@ in tempo reale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7792,7 +7764,7 @@ Apri Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 218 + 219 @@ -7800,7 +7772,7 @@ Creare libs/ui/src/lib/tags-selector/tags-selector.component.html - 66 + 64 @@ -7812,7 +7784,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 @@ -7844,11 +7816,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 404 + 427 @@ -7997,7 +7969,7 @@ () e gia in uso. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 702 + 718 @@ -8005,7 +7977,7 @@ Si è verificato un errore durante l’aggiornamento di (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 710 + 721 @@ -8029,7 +8001,7 @@ Raccogli dati storici di mercato recenti apps/client/src/app/components/admin-market-data/admin-market-data.html - 253 + 251 @@ -8037,7 +8009,7 @@ Raccogli tutti i dati storici di mercato apps/client/src/app/components/admin-market-data/admin-market-data.html - 258 + 256 @@ -8117,7 +8089,7 @@ I calcoli sono basati su dati di mercato ritardati e potrebbero non essere visualizzati in tempo reale. apps/client/src/app/components/home-market/home-market.html - 45 + 28 apps/client/src/app/components/markets/markets.html @@ -8150,7 +8122,7 @@ L’account utente demo è stato sincronizzato. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 316 + 323 @@ -8372,7 +8344,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 diff --git a/apps/client/src/locales/messages.ja.xlf b/apps/client/src/locales/messages.ja.xlf index 219f41f817..bb7bfc08b2 100644 --- a/apps/client/src/locales/messages.ja.xlf +++ b/apps/client/src/locales/messages.ja.xlf @@ -272,7 +272,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 185 + 183 @@ -368,7 +368,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 332 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -444,11 +444,11 @@ 通貨 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 216 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 326 + 339 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -468,7 +468,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 305 + 303 @@ -504,11 +504,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 286 + 284 libs/ui/src/lib/activities-table/activities-table.component.html - 322 + 320 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -532,7 +532,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 306 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -548,7 +548,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 485 + 483 @@ -556,7 +556,7 @@ 削除 apps/client/src/app/components/admin-market-data/admin-market-data.html - 329 + 327 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -588,7 +588,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 515 + 513 libs/ui/src/lib/benchmark/benchmark.component.html @@ -628,7 +628,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 473 + 486 @@ -640,11 +640,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 109 + 107 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 184 + 197 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -760,7 +760,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 194 + 192 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -780,7 +780,7 @@ 市場価格 apps/client/src/app/components/admin-market-data/admin-market-data.html - 154 + 152 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -796,7 +796,7 @@ 通貨 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 130 apps/client/src/app/pages/public/public-page.html @@ -816,7 +816,7 @@ 国に縛られないETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 135 @@ -824,7 +824,15 @@ セクター別ではないETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 140 + + + + An error occurred while converting the data source to . + An error occurred while converting the data source to . + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 482 @@ -844,7 +852,7 @@ 絞り込み... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 367 + 365 @@ -852,11 +860,11 @@ 最初の活動 apps/client/src/app/components/admin-market-data/admin-market-data.html - 169 + 167 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 222 + 235 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -872,7 +880,7 @@ データ収集頻度 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 454 + 467 @@ -880,7 +888,7 @@ アクティビティ数 apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 182 @@ -888,7 +896,7 @@ 過去データ apps/client/src/app/components/admin-market-data/admin-market-data.html - 193 + 191 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -900,7 +908,7 @@ セクター数 apps/client/src/app/components/admin-market-data/admin-market-data.html - 202 + 200 @@ -924,7 +932,7 @@ 国の数 apps/client/src/app/components/admin-market-data/admin-market-data.html - 211 + 209 @@ -932,7 +940,7 @@ 直近の市場実績データを収集する apps/client/src/app/components/admin-market-data/admin-market-data.html - 253 + 251 @@ -940,7 +948,7 @@ すべての過去の市場データを収集する apps/client/src/app/components/admin-market-data/admin-market-data.html - 258 + 256 @@ -948,7 +956,7 @@ プロファイルデータを収集する apps/client/src/app/components/admin-market-data/admin-market-data.html - 262 + 260 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1003,12 +1011,20 @@ 69 + + By , this is projected to increase to per year or per month, assuming a annual interest rate. + By , this is projected to increase to per year or per month, assuming a annual interest rate. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 132 + + Sector セクター apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 280 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1020,7 +1036,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 282 + 295 apps/client/src/app/components/admin-users/admin-users.html @@ -1040,11 +1056,11 @@ セクター apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 301 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 407 + 420 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1060,11 +1076,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 298 + 311 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 418 + 431 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1076,7 +1092,7 @@ シンボルマッピング apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 396 + 409 @@ -1116,7 +1132,7 @@ スクレイパーの設定 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 496 + 509 @@ -1124,7 +1140,7 @@ メモ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 455 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1140,7 +1156,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 372 + 370 @@ -1208,7 +1224,7 @@ このクーポンを削除してもよろしいですか? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 235 + 242 @@ -1216,7 +1232,7 @@ 本当にこのシステムメッセージを削除しますか? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 248 + 255 @@ -1224,7 +1240,7 @@ キャッシュをクリアしてもよろしいですか? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 272 + 279 @@ -1232,7 +1248,7 @@ システムメッセージを設定してください: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 292 + 299 @@ -1340,11 +1356,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 429 + 442 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 588 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1360,7 +1376,7 @@ 資産プロファイルを保存しました apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 645 + 665 @@ -1379,14 +1395,6 @@ 11 - - By - による - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 140 - - Update platform プラットフォームを更新 @@ -1400,7 +1408,7 @@ 現在の年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 @@ -1540,11 +1548,11 @@ フォームを検証できませんでした apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 621 + 641 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 624 + 644 @@ -1592,7 +1600,7 @@ ベンチマーク apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 388 + 401 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1666,10 +1674,6 @@ Fear 恐怖 - - apps/client/src/app/components/home-market/home-market.component.ts - 48 - apps/client/src/app/components/markets/markets.component.ts 46 @@ -1682,10 +1686,6 @@ Greed Greed - - apps/client/src/app/components/home-market/home-market.component.ts - 49 - apps/client/src/app/components/markets/markets.component.ts 47 @@ -1698,10 +1698,6 @@ Last Days 過去日間 - - apps/client/src/app/components/home-market/home-market.html - 7 - apps/client/src/app/components/markets/markets.html 17 @@ -1792,7 +1788,7 @@ 今週 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 @@ -1862,6 +1858,10 @@ or または + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 167 + apps/client/src/app/components/admin-settings/admin-settings.component.html 30 @@ -1882,14 +1882,6 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 100 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 84 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 162 - apps/client/src/app/pages/pricing/pricing-page.html 326 @@ -2076,7 +2068,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 215 + 213 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2276,7 +2268,7 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 libs/ui/src/lib/assistant/assistant.component.ts @@ -2288,7 +2280,7 @@ 1年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 libs/ui/src/lib/assistant/assistant.component.ts @@ -2308,7 +2300,7 @@ 5年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -2328,7 +2320,7 @@ マックス apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 244 libs/ui/src/lib/assistant/assistant.component.ts @@ -2418,14 +2410,6 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html 33 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 81 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 159 - apps/client/src/app/pages/pricing/pricing-page.html 265 @@ -2520,7 +2504,7 @@ ロケール apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 547 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2599,14 +2583,6 @@ 221 - - this is projected to increase to - これはに増加すると予測されています - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 148 - - Biometric Authentication 生体認証 @@ -2684,7 +2660,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 190 @@ -2696,7 +2672,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 190 + 188 @@ -2708,7 +2684,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 191 @@ -3132,11 +3108,11 @@ スクレイパー設定を解析できませんでした apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 569 + 589 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 572 + 592 @@ -3420,7 +3396,7 @@ マーケット apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 390 + 403 apps/client/src/app/components/footer/footer.component.html @@ -3867,6 +3843,14 @@ 63 + + Convert to + Convert to + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 174 + + (Last 30 days) (直近30日間) @@ -3948,7 +3932,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 231 + 244 apps/client/src/app/components/admin-overview/admin-overview.html @@ -3992,7 +3976,7 @@ 本当にこれらのアクティビティを削除したいですか? libs/ui/src/lib/activities-table/activities-table.component.ts - 319 + 317 @@ -4072,7 +4056,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 239 + 237 @@ -4080,7 +4064,7 @@ アクティビティをインポート apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 92 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4088,7 +4072,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 408 + 406 @@ -4096,7 +4080,7 @@ 配当金をインポート apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 133 + 131 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4104,7 +4088,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 422 + 420 @@ -4112,7 +4096,7 @@ データをインポート中... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 170 @@ -4120,7 +4104,7 @@ インポートが完了しました apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 182 + 180 @@ -4136,7 +4120,7 @@ データを検証中... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 293 + 291 @@ -4227,6 +4211,14 @@ 176 + + Do you really want to convert this asset profile to ()? + Do you really want to convert this asset profile to ()? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 723 + + Allocations 配分 @@ -4452,27 +4444,19 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 libs/ui/src/lib/i18n.ts 43 - - annual interest rate - 年利 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 186 - - Deposit 入金 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 410 + 423 @@ -4480,7 +4464,7 @@ 毎月 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 94 + 95 @@ -4488,7 +4472,7 @@ 年次 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 95 + 96 @@ -4632,7 +4616,7 @@ 時間ごと apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 214 + 216 @@ -4784,11 +4768,11 @@ 資産プロフィールを保存できませんでした apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 655 + 675 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 658 + 678 @@ -4952,18 +4936,6 @@ 44 - - per month - 月あたり - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 95 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 173 - - Ghostfolio vs comparison table Ghostfolio vs 比較表 @@ -5004,6 +4976,14 @@ 108 + + Coupon has been created + Coupon has been created + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 224 + + Available in 利用可能で @@ -5297,7 +5277,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 436 + 434 @@ -5309,7 +5289,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 449 + 447 @@ -5325,7 +5305,7 @@ クローン libs/ui/src/lib/activities-table/activities-table.component.html - 494 + 492 @@ -5333,7 +5313,7 @@ ドラフトをICSとしてエクスポート libs/ui/src/lib/activities-table/activities-table.component.html - 504 + 502 @@ -5341,7 +5321,7 @@ 本当にこのアクティビティを削除したいですか? libs/ui/src/lib/activities-table/activities-table.component.ts - 329 + 327 @@ -5380,14 +5360,6 @@ 76 - - , - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 146 - - Last All Time High 直近の全時間最高値 @@ -5425,7 +5397,7 @@ {VAR_PLURAL, plural, =1 {プロフィール} other {プロフィール}} apps/client/src/app/components/admin-market-data/admin-market-data.html - 277 + 275 @@ -5473,7 +5445,7 @@ 予測総額 libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 66 + 62 @@ -5489,7 +5461,7 @@ libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 420 + 433 libs/ui/src/lib/i18n.ts @@ -5501,7 +5473,7 @@ 貯蓄 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 430 + 443 @@ -5549,7 +5521,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 337 + 335 libs/ui/src/lib/i18n.ts @@ -5573,15 +5545,15 @@ 資産クラス apps/client/src/app/components/admin-market-data/admin-market-data.html - 118 + 116 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 240 + 253 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 336 + 349 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5605,15 +5577,15 @@ 資産サブクラス apps/client/src/app/components/admin-market-data/admin-market-data.html - 136 + 134 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 249 + 262 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 352 + 365 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5729,7 +5701,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 449 + 460 @@ -5753,7 +5725,7 @@ アクティビティなし apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 147 + 145 @@ -5785,7 +5757,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 186 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -5869,7 +5841,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 263 + 261 libs/ui/src/lib/i18n.ts @@ -6145,15 +6117,15 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 462 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 465 + 476 libs/ui/src/lib/top-holdings/top-holdings.component.html - 186 + 181 @@ -6177,7 +6149,7 @@ 現在の市場価格は apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 770 + 766 @@ -6185,7 +6157,7 @@ テスト apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 606 @@ -6285,11 +6257,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 84 + 85 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 100 + 101 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6349,7 +6321,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 libs/ui/src/lib/assistant/assistant.component.ts @@ -6369,7 +6341,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -6417,7 +6389,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6437,7 +6409,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -6482,7 +6454,7 @@ データ収集 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 616 + 629 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6522,7 +6494,7 @@ 毎日 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 210 + 212 @@ -6706,7 +6678,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 399 @@ -6722,7 +6694,7 @@ Show more libs/ui/src/lib/top-holdings/top-holdings.component.html - 179 + 174 @@ -6730,7 +6702,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 125 @@ -6878,7 +6850,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 475 + 473 @@ -6958,7 +6930,7 @@ Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 761 + 757 @@ -6970,7 +6942,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 634 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7046,7 +7018,7 @@ Close apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 623 + 636 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7222,11 +7194,11 @@ - has been copied to the clipboard - has been copied to the clipboard + has been copied to the clipboard + has been copied to the clipboard apps/client/src/app/components/admin-overview/admin-overview.component.ts - 395 + 223 libs/ui/src/lib/value/value.component.ts @@ -7273,14 +7245,6 @@ 10 - - , assuming a - , assuming a - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 175 - - Financial Services Financial Services @@ -7314,7 +7278,7 @@ Delete apps/client/src/app/components/admin-market-data/admin-market-data.html - 272 + 270 @@ -7636,7 +7600,7 @@ 保存 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 645 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7736,7 +7700,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 217 + 218 @@ -7752,7 +7716,15 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 543 + 556 + + + + Do you really want to convert the data source to ? + Do you really want to convert the data source to ? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 485 @@ -7760,7 +7732,7 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 506 + 519 @@ -7768,7 +7740,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 559 + 572 @@ -7776,7 +7748,7 @@ Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7784,7 +7756,7 @@ Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7792,7 +7764,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 532 @@ -7800,7 +7772,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7808,7 +7780,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7816,7 +7788,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 218 + 219 @@ -7824,7 +7796,7 @@ Create libs/ui/src/lib/tags-selector/tags-selector.component.html - 66 + 64 @@ -7836,7 +7808,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 @@ -7868,11 +7840,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 404 + 427 @@ -8021,7 +7993,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 702 + 718 @@ -8029,7 +8001,7 @@ An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 710 + 721 @@ -8117,7 +8089,7 @@ Calculations are based on delayed market data and may not be displayed in real-time. apps/client/src/app/components/home-market/home-market.html - 45 + 28 apps/client/src/app/components/markets/markets.html @@ -8158,7 +8130,7 @@ Demo user account has been synced. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 316 + 323 @@ -8372,7 +8344,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 diff --git a/apps/client/src/locales/messages.ko.xlf b/apps/client/src/locales/messages.ko.xlf index b570f552ca..f97a1610be 100644 --- a/apps/client/src/locales/messages.ko.xlf +++ b/apps/client/src/locales/messages.ko.xlf @@ -272,7 +272,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 185 + 183 @@ -368,7 +368,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 332 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -444,11 +444,11 @@ 통화 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 216 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 326 + 339 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -468,7 +468,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 305 + 303 @@ -504,11 +504,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 286 + 284 libs/ui/src/lib/activities-table/activities-table.component.html - 322 + 320 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -532,7 +532,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 306 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -548,7 +548,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 485 + 483 @@ -556,7 +556,7 @@ 삭제 apps/client/src/app/components/admin-market-data/admin-market-data.html - 329 + 327 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -588,7 +588,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 515 + 513 libs/ui/src/lib/benchmark/benchmark.component.html @@ -628,7 +628,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 473 + 486 @@ -640,11 +640,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 109 + 107 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 184 + 197 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -760,7 +760,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 194 + 192 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -780,7 +780,7 @@ 시장 가격 apps/client/src/app/components/admin-market-data/admin-market-data.html - 154 + 152 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -796,7 +796,7 @@ 통화 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 130 apps/client/src/app/pages/public/public-page.html @@ -816,7 +816,7 @@ 국가 정보 없는 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 135 @@ -824,7 +824,15 @@ 섹터 정보 없는 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 140 + + + + An error occurred while converting the data source to . + An error occurred while converting the data source to . + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 482 @@ -844,7 +852,7 @@ 다음 기준으로 필터... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 367 + 365 @@ -852,11 +860,11 @@ 첫 거래 apps/client/src/app/components/admin-market-data/admin-market-data.html - 169 + 167 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 222 + 235 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -872,7 +880,7 @@ 데이터 수집 빈도 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 454 + 467 @@ -880,7 +888,7 @@ 거래 건수 apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 182 @@ -888,7 +896,7 @@ 과거 데이터 apps/client/src/app/components/admin-market-data/admin-market-data.html - 193 + 191 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -900,7 +908,7 @@ 섹터 수 apps/client/src/app/components/admin-market-data/admin-market-data.html - 202 + 200 @@ -924,7 +932,7 @@ 국가 수 apps/client/src/app/components/admin-market-data/admin-market-data.html - 211 + 209 @@ -932,7 +940,7 @@ 최근 과거 시장 데이터 수집 apps/client/src/app/components/admin-market-data/admin-market-data.html - 253 + 251 @@ -940,7 +948,7 @@ 전체 과거 시장 데이터 수집 apps/client/src/app/components/admin-market-data/admin-market-data.html - 258 + 256 @@ -948,7 +956,7 @@ 프로필 데이터 수집 apps/client/src/app/components/admin-market-data/admin-market-data.html - 262 + 260 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1003,12 +1011,20 @@ 69 + + By , this is projected to increase to per year or per month, assuming a annual interest rate. + By , this is projected to increase to per year or per month, assuming a annual interest rate. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 132 + + Sector 섹터 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 280 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1020,7 +1036,7 @@ 국가 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 282 + 295 apps/client/src/app/components/admin-users/admin-users.html @@ -1040,11 +1056,11 @@ 섹터 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 301 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 407 + 420 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1060,11 +1076,11 @@ 국가 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 298 + 311 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 418 + 431 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1076,7 +1092,7 @@ 심볼 매핑 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 396 + 409 @@ -1116,7 +1132,7 @@ 스크래퍼 설정 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 496 + 509 @@ -1124,7 +1140,7 @@ 메모 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 455 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1140,7 +1156,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 372 + 370 @@ -1208,7 +1224,7 @@ 이 쿠폰을 정말 삭제하시겠습니까? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 235 + 242 @@ -1216,7 +1232,7 @@ 이 시스템 메시지를 정말 삭제하시겠습니까? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 248 + 255 @@ -1224,7 +1240,7 @@ 정말로 캐시를 플러시하시겠습니까? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 272 + 279 @@ -1232,7 +1248,7 @@ 시스템 메시지를 설정하십시오: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 292 + 299 @@ -1340,11 +1356,11 @@ 링크 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 429 + 442 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 588 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1360,7 +1376,7 @@ 자산 정보가 저장되었습니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 645 + 665 @@ -1379,14 +1395,6 @@ 11 - - By - 에 의해 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 140 - - Update platform 플랫폼 업데이트 @@ -1400,7 +1408,7 @@ 올해 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 @@ -1540,11 +1548,11 @@ 양식 유효성 검사에 실패했습니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 621 + 641 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 624 + 644 @@ -1592,7 +1600,7 @@ 기준 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 388 + 401 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1666,10 +1674,6 @@ Fear 두려움 - - apps/client/src/app/components/home-market/home-market.component.ts - 48 - apps/client/src/app/components/markets/markets.component.ts 46 @@ -1682,10 +1686,6 @@ Greed 탐욕 - - apps/client/src/app/components/home-market/home-market.component.ts - 49 - apps/client/src/app/components/markets/markets.component.ts 47 @@ -1698,10 +1698,6 @@ Last Days 지난 - - apps/client/src/app/components/home-market/home-market.html - 7 - apps/client/src/app/components/markets/markets.html 17 @@ -1792,7 +1788,7 @@ 이번주 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 @@ -1862,6 +1858,10 @@ or 또는 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 167 + apps/client/src/app/components/admin-settings/admin-settings.component.html 30 @@ -1882,14 +1882,6 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 100 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 84 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 162 - apps/client/src/app/pages/pricing/pricing-page.html 326 @@ -2076,7 +2068,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 215 + 213 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2276,7 +2268,7 @@ 연초 대비 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 libs/ui/src/lib/assistant/assistant.component.ts @@ -2288,7 +2280,7 @@ 1년 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 libs/ui/src/lib/assistant/assistant.component.ts @@ -2308,7 +2300,7 @@ 5년 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -2328,7 +2320,7 @@ 맥스 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 244 libs/ui/src/lib/assistant/assistant.component.ts @@ -2418,14 +2410,6 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html 33 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 81 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 159 - apps/client/src/app/pages/pricing/pricing-page.html 265 @@ -2520,7 +2504,7 @@ 장소 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 547 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2599,14 +2583,6 @@ 221 - - this is projected to increase to - 이는 다음과 같이 증가할 것으로 예상된다. - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 148 - - Biometric Authentication 생체인증 @@ -2684,7 +2660,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 190 @@ -2696,7 +2672,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 190 + 188 @@ -2708,7 +2684,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 191 @@ -3132,11 +3108,11 @@ 스크래퍼 설정을 파싱할 수 없습니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 569 + 589 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 572 + 592 @@ -3420,7 +3396,7 @@ 시장 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 390 + 403 apps/client/src/app/components/footer/footer.component.html @@ -3859,6 +3835,14 @@ 63 + + Convert to + Convert to + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 174 + + (Last 30 days) (지난 30일) @@ -3940,7 +3924,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 231 + 244 apps/client/src/app/components/admin-overview/admin-overview.html @@ -3984,7 +3968,7 @@ 정말로 이 거래들을 삭제하시겠습니까? libs/ui/src/lib/activities-table/activities-table.component.ts - 319 + 317 @@ -4064,7 +4048,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 239 + 237 @@ -4072,7 +4056,7 @@ 거래 내역 가져오기 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 92 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4080,7 +4064,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 408 + 406 @@ -4088,7 +4072,7 @@ 배당금 가져오기 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 133 + 131 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4096,7 +4080,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 422 + 420 @@ -4104,7 +4088,7 @@ 데이터 가져오는 중... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 170 @@ -4112,7 +4096,7 @@ 가져오기가 완료되었습니다. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 182 + 180 @@ -4128,7 +4112,7 @@ 데이터 유효성을 검사하는 중... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 293 + 291 @@ -4219,6 +4203,14 @@ 176 + + Do you really want to convert this asset profile to ()? + Do you really want to convert this asset profile to ()? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 723 + + Allocations 자산 배분 @@ -4444,27 +4436,19 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 libs/ui/src/lib/i18n.ts 43 - - annual interest rate - 연간 이자율 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 186 - - Deposit 보증금 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 410 + 423 @@ -4472,7 +4456,7 @@ 월간 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 94 + 95 @@ -4480,7 +4464,7 @@ 매년 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 95 + 96 @@ -4624,7 +4608,7 @@ 매시간 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 214 + 216 @@ -4776,11 +4760,11 @@ 자산 정보를 저장할 수 없습니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 655 + 675 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 658 + 678 @@ -4944,18 +4928,6 @@ 44 - - per month - 매월 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 95 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 173 - - Ghostfolio vs comparison table Ghostfolio와 비교표 @@ -4996,6 +4968,14 @@ 108 + + Coupon has been created + Coupon has been created + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 224 + + Available in 사용 가능 @@ -5289,7 +5269,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 436 + 434 @@ -5301,7 +5281,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 449 + 447 @@ -5317,7 +5297,7 @@ 클론 libs/ui/src/lib/activities-table/activities-table.component.html - 494 + 492 @@ -5325,7 +5305,7 @@ 초안을 달력 파일로 내보내기 libs/ui/src/lib/activities-table/activities-table.component.html - 504 + 502 @@ -5333,7 +5313,7 @@ 정말로 이 거래를 삭제하시겠습니까? libs/ui/src/lib/activities-table/activities-table.component.ts - 329 + 327 @@ -5372,14 +5352,6 @@ 76 - - , - , - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 146 - - Last All Time High 마지막 역대 최고치 @@ -5417,7 +5389,7 @@ {VAR_PLURAL, plural, =1 {프로필} other {프로필}} apps/client/src/app/components/admin-market-data/admin-market-data.html - 277 + 275 @@ -5465,7 +5437,7 @@ 예상총액 libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 66 + 62 @@ -5481,7 +5453,7 @@ libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 420 + 433 libs/ui/src/lib/i18n.ts @@ -5493,7 +5465,7 @@ 저금 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 430 + 443 @@ -5541,7 +5513,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 337 + 335 libs/ui/src/lib/i18n.ts @@ -5565,15 +5537,15 @@ 자산군 apps/client/src/app/components/admin-market-data/admin-market-data.html - 118 + 116 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 240 + 253 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 336 + 349 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5597,15 +5569,15 @@ 하위 자산군 apps/client/src/app/components/admin-market-data/admin-market-data.html - 136 + 134 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 249 + 262 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 352 + 365 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5721,7 +5693,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 449 + 460 @@ -5745,7 +5717,7 @@ 거래 내역 없음 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 147 + 145 @@ -5785,7 +5757,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 186 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -5869,7 +5841,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 263 + 261 libs/ui/src/lib/i18n.ts @@ -6145,15 +6117,15 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 462 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 465 + 476 libs/ui/src/lib/top-holdings/top-holdings.component.html - 186 + 181 @@ -6177,7 +6149,7 @@ 현재 시장가격은 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 770 + 766 @@ -6185,7 +6157,7 @@ 시험 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 606 @@ -6285,11 +6257,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 84 + 85 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 100 + 101 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6349,7 +6321,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 libs/ui/src/lib/assistant/assistant.component.ts @@ -6369,7 +6341,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -6417,7 +6389,7 @@ 년도 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6437,7 +6409,7 @@ 연령 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -6482,7 +6454,7 @@ 데이터 수집 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 616 + 629 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6522,7 +6494,7 @@ 매일 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 210 + 212 @@ -6706,7 +6678,7 @@ 포함 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 399 @@ -6722,7 +6694,7 @@ 더 보기 libs/ui/src/lib/top-holdings/top-holdings.component.html - 179 + 174 @@ -6730,7 +6702,7 @@ 벤치마크 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 125 @@ -6878,7 +6850,7 @@ 보유 종목 보기 libs/ui/src/lib/activities-table/activities-table.component.html - 475 + 473 @@ -6958,7 +6930,7 @@ 오류 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 761 + 757 @@ -6970,7 +6942,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 634 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7046,7 +7018,7 @@ 닫다 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 623 + 636 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7222,11 +7194,11 @@ - has been copied to the clipboard - 가 클립보드에 복사되었습니다. + has been copied to the clipboard + 가 클립보드에 복사되었습니다. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 395 + 223 libs/ui/src/lib/value/value.component.ts @@ -7273,14 +7245,6 @@ 10 - - , assuming a - , 가정 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 175 - - Financial Services 금융 서비스 @@ -7314,7 +7278,7 @@ 삭제 apps/client/src/app/components/admin-market-data/admin-market-data.html - 272 + 270 @@ -7636,7 +7600,7 @@ 구하다 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 645 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7736,7 +7700,7 @@ AI 프롬프트가 클립보드에 복사되었습니다. apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 217 + 218 @@ -7752,7 +7716,15 @@ 방법 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 543 + 556 + + + + Do you really want to convert the data source to ? + Do you really want to convert the data source to ? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 485 @@ -7760,7 +7732,7 @@ 기본 시장 가격 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 506 + 519 @@ -7768,7 +7740,7 @@ 선택자 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 559 + 572 @@ -7776,7 +7748,7 @@ 즉각적인 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7784,7 +7756,7 @@ 게으른 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7792,7 +7764,7 @@ HTTP 요청 헤더 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 532 @@ -7800,7 +7772,7 @@ 실시간 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7808,7 +7780,7 @@ 하루의 끝 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7816,7 +7788,7 @@ 오픈 Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 218 + 219 @@ -7824,7 +7796,7 @@ 만들다 libs/ui/src/lib/tags-selector/tags-selector.component.html - 66 + 64 @@ -7836,7 +7808,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 @@ -7868,11 +7840,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 404 + 427 @@ -8021,7 +7993,7 @@ ()은(는) 이미 사용 중입니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 702 + 718 @@ -8029,7 +8001,7 @@ ()로 업데이트하는 동안 오류가 발생했습니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 710 + 721 @@ -8117,7 +8089,7 @@ 계산은 지연된 시장 데이터를 기반으로 하며 실시간으로 표시되지 않을 수 있습니다. apps/client/src/app/components/home-market/home-market.html - 45 + 28 apps/client/src/app/components/markets/markets.html @@ -8158,7 +8130,7 @@ 데모 사용자 계정이 동기화되었습니다. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 316 + 323 @@ -8372,7 +8344,7 @@ 이번 달 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index cd37770500..b649993b5b 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -70,7 +70,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 185 + 183 @@ -114,7 +114,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 332 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -210,11 +210,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 286 + 284 libs/ui/src/lib/activities-table/activities-table.component.html - 322 + 320 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -238,7 +238,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 306 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -254,7 +254,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 485 + 483 @@ -262,7 +262,7 @@ Verwijderen apps/client/src/app/components/admin-market-data/admin-market-data.html - 329 + 327 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -294,7 +294,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 515 + 513 libs/ui/src/lib/benchmark/benchmark.component.html @@ -334,11 +334,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 109 + 107 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 184 + 197 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -414,7 +414,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 473 + 486 @@ -470,7 +470,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 194 + 192 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -490,7 +490,7 @@ Marktprijs apps/client/src/app/components/admin-market-data/admin-market-data.html - 154 + 152 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -506,11 +506,11 @@ Eerste activiteit apps/client/src/app/components/admin-market-data/admin-market-data.html - 169 + 167 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 222 + 235 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -526,7 +526,7 @@ Historische gegevens apps/client/src/app/components/admin-market-data/admin-market-data.html - 193 + 191 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -538,7 +538,7 @@ Wil je deze coupon echt verwijderen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 235 + 242 @@ -546,7 +546,7 @@ Wil je echt de cache legen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 272 + 279 @@ -554,7 +554,7 @@ Stel je systeemboodschap in: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 292 + 299 @@ -570,7 +570,7 @@ Verzamel profielgegevens apps/client/src/app/components/admin-market-data/admin-market-data.html - 262 + 260 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -808,10 +808,6 @@ Last Days Laatste Dagen - - apps/client/src/app/components/home-market/home-market.html - 7 - apps/client/src/app/components/markets/markets.html 17 @@ -848,6 +844,10 @@ or of + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 167 + apps/client/src/app/components/admin-settings/admin-settings.component.html 30 @@ -868,14 +868,6 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 100 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 84 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 162 - apps/client/src/app/pages/pricing/pricing-page.html 326 @@ -998,11 +990,11 @@ Sectoren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 301 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 407 + 420 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1018,11 +1010,11 @@ Landen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 298 + 311 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 418 + 431 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1106,7 +1098,7 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 libs/ui/src/lib/assistant/assistant.component.ts @@ -1118,7 +1110,7 @@ 1J apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 libs/ui/src/lib/assistant/assistant.component.ts @@ -1138,7 +1130,7 @@ 5J apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -1158,7 +1150,7 @@ Max apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 244 libs/ui/src/lib/assistant/assistant.component.ts @@ -1174,7 +1166,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 191 @@ -1284,14 +1276,6 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html 33 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 81 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 159 - apps/client/src/app/pages/pricing/pricing-page.html 265 @@ -1350,7 +1334,7 @@ Locatie apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 547 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1510,11 +1494,11 @@ Valuta apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 216 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 326 + 339 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1534,7 +1518,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 305 + 303 @@ -1818,7 +1802,7 @@ Markten apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 390 + 403 apps/client/src/app/components/footer/footer.component.html @@ -2046,7 +2030,7 @@ Huidige week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 @@ -2114,7 +2098,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 215 + 213 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2130,7 +2114,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 239 + 237 @@ -2138,7 +2122,7 @@ Opmerking apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 455 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2154,7 +2138,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 372 + 370 @@ -2170,7 +2154,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 231 + 244 apps/client/src/app/components/admin-overview/admin-overview.html @@ -2214,7 +2198,7 @@ Gegevens importeren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 170 @@ -2222,7 +2206,7 @@ Importeren is voltooid apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 182 + 180 @@ -2406,7 +2390,7 @@ Activiteiten importeren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 92 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2414,7 +2398,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 408 + 406 @@ -2426,7 +2410,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 436 + 434 @@ -2438,7 +2422,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 449 + 447 @@ -2446,7 +2430,7 @@ Kloon libs/ui/src/lib/activities-table/activities-table.component.html - 494 + 492 @@ -2454,7 +2438,7 @@ Concept exporteren als ICS libs/ui/src/lib/activities-table/activities-table.component.html - 504 + 502 @@ -2462,7 +2446,7 @@ Wil je deze activiteit echt verwijderen? libs/ui/src/lib/activities-table/activities-table.component.ts - 329 + 327 @@ -2494,7 +2478,7 @@ {VAR_PLURAL, plural, =1 {Profiel} other {Profielen}} apps/client/src/app/components/admin-market-data/admin-market-data.html - 277 + 275 @@ -2538,7 +2522,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 190 + 188 @@ -2554,7 +2538,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 190 @@ -2621,12 +2605,20 @@ 176 + + By , this is projected to increase to per year or per month, assuming a annual interest rate. + By , this is projected to increase to per year or per month, assuming a annual interest rate. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 132 + + Sector Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 280 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2638,7 +2630,7 @@ Land apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 282 + 295 apps/client/src/app/components/admin-users/admin-users.html @@ -2666,7 +2658,7 @@ Verwacht totaalbedrag libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 66 + 62 @@ -2674,7 +2666,7 @@ Besparingen libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 430 + 443 @@ -2690,27 +2682,19 @@ libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 420 + 433 libs/ui/src/lib/i18n.ts 45 - - annual interest rate - jaarlijkse rente - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 186 - - Deposit Storting libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 410 + 423 @@ -2718,7 +2702,7 @@ Maandelijks apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 94 + 95 @@ -2726,7 +2710,7 @@ Aantal sectoren apps/client/src/app/components/admin-market-data/admin-market-data.html - 202 + 200 @@ -2750,16 +2734,12 @@ Aantal landen apps/client/src/app/components/admin-market-data/admin-market-data.html - 211 + 209 Fear Angst - - apps/client/src/app/components/home-market/home-market.component.ts - 48 - apps/client/src/app/components/markets/markets.component.ts 46 @@ -2772,10 +2752,6 @@ Greed Hebzucht - - apps/client/src/app/components/home-market/home-market.component.ts - 49 - apps/client/src/app/components/markets/markets.component.ts 47 @@ -2790,7 +2766,7 @@ Filter op... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 367 + 365 @@ -2826,7 +2802,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 388 + 401 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -2838,11 +2814,11 @@ Het formulier kon niet worden gevalideerd. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 621 + 641 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 624 + 644 @@ -2966,7 +2942,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 337 + 335 libs/ui/src/lib/i18n.ts @@ -2982,15 +2958,15 @@ Asset klasse apps/client/src/app/components/admin-market-data/admin-market-data.html - 118 + 116 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 240 + 253 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 336 + 349 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3022,7 +2998,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 186 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -3194,7 +3170,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 449 + 460 @@ -3214,15 +3190,15 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 462 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 465 + 476 libs/ui/src/lib/top-holdings/top-holdings.component.html - 186 + 181 @@ -3317,12 +3293,20 @@ 176 + + Do you really want to convert this asset profile to ()? + Do you really want to convert this asset profile to ()? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 723 + + Data Gathering Frequency Frequentie van gegevensverzameling apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 454 + 467 @@ -3330,7 +3314,7 @@ Aantal activiteiten apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 182 @@ -3346,7 +3330,7 @@ Symbool toewijzen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 396 + 409 @@ -3382,7 +3366,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 libs/ui/src/lib/i18n.ts @@ -3402,15 +3386,15 @@ Asset subklasse apps/client/src/app/components/admin-market-data/admin-market-data.html - 136 + 134 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 249 + 262 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 352 + 365 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3438,7 +3422,7 @@ Gegevens valideren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 293 + 291 @@ -3526,7 +3510,7 @@ Jaarlijks apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 95 + 96 @@ -3534,7 +3518,7 @@ Importeer dividenden apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 133 + 131 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3542,7 +3526,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 422 + 420 @@ -3594,7 +3578,7 @@ Geen activiteiten apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 147 + 145 @@ -3778,7 +3762,7 @@ Elk uur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 214 + 216 @@ -3886,11 +3870,11 @@ Kon het assetprofiel niet opslaan apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 655 + 675 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 658 + 678 @@ -4074,7 +4058,7 @@ Weet je zeker dat je alle activiteiten wilt verwijderen? libs/ui/src/lib/activities-table/activities-table.component.ts - 319 + 317 @@ -4093,14 +4077,6 @@ 11 - - By - Tegen - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 140 - - Update platform Platform bijwerken @@ -4114,7 +4090,7 @@ Huidig jaar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 @@ -4130,11 +4106,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 429 + 442 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 588 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4150,7 +4126,7 @@ Het activaprofiel is opgeslagen. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 645 + 665 @@ -4542,7 +4518,7 @@ Scraper instellingen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 496 + 509 @@ -4605,6 +4581,14 @@ 108 + + Coupon has been created + Coupon has been created + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 224 + + Available in Beschikbaar in @@ -4810,7 +4794,7 @@ ETF’s zonder Landen apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 135 @@ -4818,7 +4802,15 @@ ETF’s zonder Sectoren apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 140 + + + + An error occurred while converting the data source to . + An error occurred while converting the data source to . + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 482 @@ -4941,14 +4933,6 @@ 49 - - this is projected to increase to - zal dit naar verwachting stijgen tot - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 148 - - Biometric Authentication Biometrische authenticatie @@ -5054,7 +5038,7 @@ Valuta apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 130 apps/client/src/app/pages/public/public-page.html @@ -5106,11 +5090,11 @@ De scraperconfiguratie kon niet worden geparseerd apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 569 + 589 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 572 + 592 @@ -5727,6 +5711,14 @@ 348 + + Convert to + Convert to + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 174 + + (Last 30 days) (Laatste 30 dagen) @@ -5796,7 +5788,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 263 + 261 libs/ui/src/lib/i18n.ts @@ -5971,14 +5963,6 @@ 5 - - , - , - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 146 - - Last All Time High Laatste Recordhoogte @@ -5987,18 +5971,6 @@ 105 - - per month - per maand - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 95 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 173 - - Ghostfolio vs comparison table Ghostfolio vs vergelijkingstabel @@ -6076,7 +6048,7 @@ Wilt u dit systeembericht echt verwijderen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 248 + 255 @@ -6144,7 +6116,7 @@ De huidige markt waarde is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 770 + 766 @@ -6152,7 +6124,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 606 @@ -6236,11 +6208,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 84 + 85 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 100 + 101 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6308,7 +6280,7 @@ Week tot nu toe apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -6328,7 +6300,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 libs/ui/src/lib/assistant/assistant.component.ts @@ -6392,7 +6364,7 @@ jaar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6412,7 +6384,7 @@ jaren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -6432,7 +6404,7 @@ Data Verzamelen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 616 + 629 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6497,7 +6469,7 @@ Dagelijks apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 210 + 212 @@ -6681,7 +6653,7 @@ Opnemen in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 399 @@ -6697,7 +6669,7 @@ Laat meer zien libs/ui/src/lib/top-holdings/top-holdings.component.html - 179 + 174 @@ -6705,7 +6677,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 125 @@ -6917,7 +6889,7 @@ Bekijk Holding libs/ui/src/lib/activities-table/activities-table.component.html - 475 + 473 @@ -6933,7 +6905,7 @@ Fout apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 761 + 757 @@ -6977,7 +6949,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 634 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7029,7 +7001,7 @@ Sluiten apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 623 + 636 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7181,11 +7153,11 @@ - has been copied to the clipboard - is naar het klembord gekopieerd + has been copied to the clipboard + is naar het klembord gekopieerd apps/client/src/app/components/admin-overview/admin-overview.component.ts - 395 + 223 libs/ui/src/lib/value/value.component.ts @@ -7248,14 +7220,6 @@ 207 - - , assuming a - , uitgaande van - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 175 - - Financial Services Financiële diensten @@ -7289,7 +7253,7 @@ Verwijder apps/client/src/app/components/admin-market-data/admin-market-data.html - 272 + 270 @@ -7611,7 +7575,7 @@ Opslaan apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 645 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7711,7 +7675,7 @@ AI-prompt is naar het klembord gekopieerd apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 217 + 218 @@ -7727,7 +7691,7 @@ Lui apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7735,7 +7699,7 @@ Direct apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7743,7 +7707,7 @@ Standaard Marktprijs apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 506 + 519 @@ -7751,7 +7715,15 @@ Modus apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 543 + 556 + + + + Do you really want to convert the data source to ? + Do you really want to convert the data source to ? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 485 @@ -7759,7 +7731,7 @@ Kiezer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 559 + 572 @@ -7767,7 +7739,7 @@ HTTP Verzoek Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 532 @@ -7775,7 +7747,7 @@ eind van de dag apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7783,7 +7755,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7791,7 +7763,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 218 + 219 @@ -7799,7 +7771,7 @@ Nieuw libs/ui/src/lib/tags-selector/tags-selector.component.html - 66 + 64 @@ -7811,7 +7783,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 @@ -7843,11 +7815,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 404 + 427 @@ -7996,7 +7968,7 @@ () is al in gebruik. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 702 + 718 @@ -8004,7 +7976,7 @@ Er is een fout opgetreden tijdens het updaten naar (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 710 + 721 @@ -8028,7 +8000,7 @@ Verzamel Recente Marktgegevens apps/client/src/app/components/admin-market-data/admin-market-data.html - 253 + 251 @@ -8036,7 +8008,7 @@ Verzamel Alle Marktgegevens apps/client/src/app/components/admin-market-data/admin-market-data.html - 258 + 256 @@ -8116,7 +8088,7 @@ Berekeningen zijn gebaseerd op vertraagde marktgegevens en worden mogelijk niet in realtime weergegeven. apps/client/src/app/components/home-market/home-market.html - 45 + 28 apps/client/src/app/components/markets/markets.html @@ -8149,7 +8121,7 @@ Demo-gebruikersaccount is gesynchroniseerd. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 316 + 323 @@ -8371,7 +8343,7 @@ Huidige maand apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 1068a7d573..62ec521012 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -271,7 +271,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 185 + 183 @@ -359,7 +359,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 332 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -435,11 +435,11 @@ Waluta apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 216 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 326 + 339 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -459,7 +459,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 305 + 303 @@ -495,11 +495,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 286 + 284 libs/ui/src/lib/activities-table/activities-table.component.html - 322 + 320 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -523,7 +523,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 306 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -539,7 +539,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 485 + 483 @@ -547,7 +547,7 @@ Usuń apps/client/src/app/components/admin-market-data/admin-market-data.html - 329 + 327 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -579,7 +579,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 515 + 513 libs/ui/src/lib/benchmark/benchmark.component.html @@ -619,7 +619,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 473 + 486 @@ -631,11 +631,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 109 + 107 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 184 + 197 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -751,7 +751,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 194 + 192 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -771,7 +771,7 @@ Cena Rynkowa apps/client/src/app/components/admin-market-data/admin-market-data.html - 154 + 152 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -787,7 +787,7 @@ Waluty apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 130 apps/client/src/app/pages/public/public-page.html @@ -807,7 +807,7 @@ ETF-y bez Krajów apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 135 @@ -815,7 +815,15 @@ ETF-y bez Sektorów apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 140 + + + + An error occurred while converting the data source to . + An error occurred while converting the data source to . + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 482 @@ -835,7 +843,7 @@ Filtruj według... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 367 + 365 @@ -843,11 +851,11 @@ Pierwsza Aktywność apps/client/src/app/components/admin-market-data/admin-market-data.html - 169 + 167 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 222 + 235 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -863,7 +871,7 @@ Data Gathering Frequency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 454 + 467 @@ -871,7 +879,7 @@ Liczba Aktywności apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 182 @@ -879,7 +887,7 @@ Dane Historyczne apps/client/src/app/components/admin-market-data/admin-market-data.html - 193 + 191 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -891,7 +899,7 @@ Liczba Sektorów apps/client/src/app/components/admin-market-data/admin-market-data.html - 202 + 200 @@ -915,7 +923,7 @@ Liczba Krajów apps/client/src/app/components/admin-market-data/admin-market-data.html - 211 + 209 @@ -923,7 +931,7 @@ Zbierz Dane Profilu apps/client/src/app/components/admin-market-data/admin-market-data.html - 262 + 260 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -970,12 +978,20 @@ 69 + + By , this is projected to increase to per year or per month, assuming a annual interest rate. + By , this is projected to increase to per year or per month, assuming a annual interest rate. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 132 + + Sector Sektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 280 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -987,7 +1003,7 @@ Kraj apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 282 + 295 apps/client/src/app/components/admin-users/admin-users.html @@ -1007,11 +1023,11 @@ Sektory apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 301 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 407 + 420 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1027,11 +1043,11 @@ Kraje apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 298 + 311 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 418 + 431 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1043,7 +1059,7 @@ Mapowanie Symboli apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 396 + 409 @@ -1083,7 +1099,7 @@ Konfiguracja Scrapera apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 496 + 509 @@ -1091,7 +1107,7 @@ Notatka apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 455 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1107,7 +1123,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 372 + 370 @@ -1175,7 +1191,7 @@ Czy naprawdę chcesz usunąć ten kupon? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 235 + 242 @@ -1183,7 +1199,7 @@ Czy naprawdę chcesz usunąć tę wiadomość systemową? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 248 + 255 @@ -1191,7 +1207,7 @@ Czy naprawdę chcesz wyczyścić pamięć podręczną? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 272 + 279 @@ -1199,7 +1215,7 @@ Proszę ustawić swoją wiadomość systemową: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 292 + 299 @@ -1307,11 +1323,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 429 + 442 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 588 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1327,7 +1343,7 @@ Profil zasobu został zapisany apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 645 + 665 @@ -1346,14 +1362,6 @@ 11 - - By - Przez - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 140 - - Update platform Aktualizuj platformę @@ -1367,7 +1375,7 @@ Obecny rok apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 @@ -1507,11 +1515,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 621 + 641 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 624 + 644 @@ -1559,7 +1567,7 @@ Poziom Odniesienia (Benchmark) apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 388 + 401 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1633,10 +1641,6 @@ Fear Zagrożenie - - apps/client/src/app/components/home-market/home-market.component.ts - 48 - apps/client/src/app/components/markets/markets.component.ts 46 @@ -1649,10 +1653,6 @@ Greed Zachłanność - - apps/client/src/app/components/home-market/home-market.component.ts - 49 - apps/client/src/app/components/markets/markets.component.ts 47 @@ -1665,10 +1665,6 @@ Last Days Ostatnie Dni - - apps/client/src/app/components/home-market/home-market.html - 7 - apps/client/src/app/components/markets/markets.html 17 @@ -1759,7 +1755,7 @@ Obecny tydzień apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 @@ -1829,6 +1825,10 @@ or lub + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 167 + apps/client/src/app/components/admin-settings/admin-settings.component.html 30 @@ -1849,14 +1849,6 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 100 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 84 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 162 - apps/client/src/app/pages/pricing/pricing-page.html 326 @@ -2043,7 +2035,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 215 + 213 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2243,7 +2235,7 @@ Liczony od początku roku (year-to-date) apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 libs/ui/src/lib/assistant/assistant.component.ts @@ -2255,7 +2247,7 @@ 1 rok apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 libs/ui/src/lib/assistant/assistant.component.ts @@ -2275,7 +2267,7 @@ 5 lat apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -2295,7 +2287,7 @@ Maksimum apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 244 libs/ui/src/lib/assistant/assistant.component.ts @@ -2385,14 +2377,6 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html 33 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 81 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 159 - apps/client/src/app/pages/pricing/pricing-page.html 265 @@ -2487,7 +2471,7 @@ Ustawienia Regionalne apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 547 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2566,14 +2550,6 @@ 221 - - this is projected to increase to - prognozuje się wzrost tej kwoty do - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 148 - - Biometric Authentication Uwierzytelnianie Biometryczne @@ -2651,7 +2627,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 190 @@ -2663,7 +2639,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 190 + 188 @@ -2675,7 +2651,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 191 @@ -3099,11 +3075,11 @@ Nie udało się przetworzyć konfiguracji scrapera apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 569 + 589 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 572 + 592 @@ -3387,7 +3363,7 @@ Rynki apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 390 + 403 apps/client/src/app/components/footer/footer.component.html @@ -3826,6 +3802,14 @@ 63 + + Convert to + Convert to + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 174 + + (Last 30 days) (Ostatnie 30 dni) @@ -3907,7 +3891,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 231 + 244 apps/client/src/app/components/admin-overview/admin-overview.html @@ -3951,7 +3935,7 @@ Czy na pewno chcesz usunąć te aktywności? libs/ui/src/lib/activities-table/activities-table.component.ts - 319 + 317 @@ -4031,7 +4015,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 239 + 237 @@ -4039,7 +4023,7 @@ Importuj Aktywności apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 92 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4047,7 +4031,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 408 + 406 @@ -4055,7 +4039,7 @@ Impotruj Dywidendy apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 133 + 131 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4063,7 +4047,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 422 + 420 @@ -4071,7 +4055,7 @@ Importowanie danych... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 170 @@ -4079,7 +4063,7 @@ Importowanie zakończone apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 182 + 180 @@ -4095,7 +4079,7 @@ Weryfikacja danych... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 293 + 291 @@ -4186,6 +4170,14 @@ 176 + + Do you really want to convert this asset profile to ()? + Do you really want to convert this asset profile to ()? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 723 + + Allocations Podziały @@ -4411,27 +4403,19 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 libs/ui/src/lib/i18n.ts 43 - - annual interest rate - rocznej stopy zwrotu - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 186 - - Deposit Depozyt libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 410 + 423 @@ -4439,7 +4423,7 @@ Miesięcznie apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 94 + 95 @@ -4447,7 +4431,7 @@ Rocznie apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 95 + 96 @@ -4591,7 +4575,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 214 + 216 @@ -4743,11 +4727,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 655 + 675 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 658 + 678 @@ -4911,18 +4895,6 @@ 44 - - per month - miesięcznie - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 95 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 173 - - Ghostfolio vs comparison table Ghostfolio vs - tabela porównawcza @@ -4963,6 +4935,14 @@ 108 + + Coupon has been created + Coupon has been created + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 224 + + Available in Dostępny w następujących językach @@ -5236,7 +5216,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 436 + 434 @@ -5248,7 +5228,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 449 + 447 @@ -5264,7 +5244,7 @@ Sklonuj libs/ui/src/lib/activities-table/activities-table.component.html - 494 + 492 @@ -5272,7 +5252,7 @@ Eksportuj Wersję Roboczą jako ICS libs/ui/src/lib/activities-table/activities-table.component.html - 504 + 502 @@ -5280,7 +5260,7 @@ Czy na pewno chcesz usunąć tę działalność? libs/ui/src/lib/activities-table/activities-table.component.ts - 329 + 327 @@ -5295,14 +5275,6 @@ 140 - - , - , - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 146 - - Last All Time High Ostatni Najwyższy Punkt w Historii @@ -5340,7 +5312,7 @@ {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} apps/client/src/app/components/admin-market-data/admin-market-data.html - 277 + 275 @@ -5388,7 +5360,7 @@ Przewidywana Łączna Kwota libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 66 + 62 @@ -5404,7 +5376,7 @@ libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 420 + 433 libs/ui/src/lib/i18n.ts @@ -5416,7 +5388,7 @@ Oszczędności libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 430 + 443 @@ -5464,7 +5436,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 337 + 335 libs/ui/src/lib/i18n.ts @@ -5488,15 +5460,15 @@ Rodzaj Aktywów apps/client/src/app/components/admin-market-data/admin-market-data.html - 118 + 116 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 240 + 253 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 336 + 349 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5520,15 +5492,15 @@ Podklasa Aktywów apps/client/src/app/components/admin-market-data/admin-market-data.html - 136 + 134 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 249 + 262 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 352 + 365 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5644,7 +5616,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 449 + 460 @@ -5668,7 +5640,7 @@ Brak transakcji apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 147 + 145 @@ -5708,7 +5680,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 186 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -5792,7 +5764,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 263 + 261 libs/ui/src/lib/i18n.ts @@ -6068,15 +6040,15 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 462 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 465 + 476 libs/ui/src/lib/top-holdings/top-holdings.component.html - 186 + 181 @@ -6144,7 +6116,7 @@ Obecna cena rynkowa wynosi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 770 + 766 @@ -6152,7 +6124,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 606 @@ -6236,11 +6208,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 84 + 85 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 100 + 101 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6308,7 +6280,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -6328,7 +6300,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 libs/ui/src/lib/assistant/assistant.component.ts @@ -6392,7 +6364,7 @@ rok apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6412,7 +6384,7 @@ lata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -6432,7 +6404,7 @@ Gromadzenie Danych apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 616 + 629 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6497,7 +6469,7 @@ Daily apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 210 + 212 @@ -6681,7 +6653,7 @@ Uwzględnij w apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 399 @@ -6697,7 +6669,7 @@ Pokaż więcej libs/ui/src/lib/top-holdings/top-holdings.component.html - 179 + 174 @@ -6705,7 +6677,7 @@ Punkty Odniesienia apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 125 @@ -6917,7 +6889,7 @@ Podgląd inwestycji libs/ui/src/lib/activities-table/activities-table.component.html - 475 + 473 @@ -6933,7 +6905,7 @@ Błąd apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 761 + 757 @@ -6977,7 +6949,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 634 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7029,7 +7001,7 @@ Zamknij apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 623 + 636 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7181,11 +7153,11 @@ - has been copied to the clipboard - has been copied to the clipboard + has been copied to the clipboard + has been copied to the clipboard apps/client/src/app/components/admin-overview/admin-overview.component.ts - 395 + 223 libs/ui/src/lib/value/value.component.ts @@ -7248,14 +7220,6 @@ 207 - - , assuming a - , przyjmując - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 175 - - Financial Services Financial Services @@ -7289,7 +7253,7 @@ Delete apps/client/src/app/components/admin-market-data/admin-market-data.html - 272 + 270 @@ -7611,7 +7575,7 @@ Zapisz apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 645 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7711,7 +7675,7 @@ Prompt AI został skopiowany do schowka apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 217 + 218 @@ -7727,7 +7691,7 @@ Leniwy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7735,7 +7699,7 @@ Natychmiastowy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7743,7 +7707,7 @@ Domyślna cena rynkowa apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 506 + 519 @@ -7751,7 +7715,15 @@ Tryb apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 543 + 556 + + + + Do you really want to convert the data source to ? + Do you really want to convert the data source to ? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 485 @@ -7759,7 +7731,7 @@ Selektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 559 + 572 @@ -7767,7 +7739,7 @@ Nagłówki żądań HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 532 @@ -7775,7 +7747,7 @@ koniec dnia apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7783,7 +7755,7 @@ w czasie rzeczywistym apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7791,7 +7763,7 @@ Otwórz Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 218 + 219 @@ -7799,7 +7771,7 @@ Stwórz libs/ui/src/lib/tags-selector/tags-selector.component.html - 66 + 64 @@ -7811,7 +7783,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 @@ -7843,11 +7815,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 404 + 427 @@ -7996,7 +7968,7 @@ () jest już w użyciu. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 702 + 718 @@ -8004,7 +7976,7 @@ Wystąpił błąd podczas aktualizacji do (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 710 + 721 @@ -8028,7 +8000,7 @@ Zbierz najnowsze historyczne dane rynkowe apps/client/src/app/components/admin-market-data/admin-market-data.html - 253 + 251 @@ -8036,7 +8008,7 @@ Zbierz wszystkie historyczne dane rynkowe apps/client/src/app/components/admin-market-data/admin-market-data.html - 258 + 256 @@ -8116,7 +8088,7 @@ Obliczenia opierają się na opóźnionych danych rynkowych i mogą nie być wyświetlane w czasie rzeczywistym. apps/client/src/app/components/home-market/home-market.html - 45 + 28 apps/client/src/app/components/markets/markets.html @@ -8149,7 +8121,7 @@ Konto użytkownika demonstracyjnego zostało zsynchronizowane. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 316 + 323 @@ -8371,7 +8343,7 @@ Bieżący miesiąc apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 751e813baf..dcfbed3e0b 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -62,7 +62,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 185 + 183 @@ -122,7 +122,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 332 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -198,11 +198,11 @@ Moeda apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 216 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 326 + 339 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -222,7 +222,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 305 + 303 @@ -274,11 +274,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 286 + 284 libs/ui/src/lib/activities-table/activities-table.component.html - 322 + 320 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -302,7 +302,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 306 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -318,7 +318,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 485 + 483 @@ -326,7 +326,7 @@ Eliminar apps/client/src/app/components/admin-market-data/admin-market-data.html - 329 + 327 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -358,7 +358,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 515 + 513 libs/ui/src/lib/benchmark/benchmark.component.html @@ -390,11 +390,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 109 + 107 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 184 + 197 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -478,7 +478,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 473 + 486 @@ -534,7 +534,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 194 + 192 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -554,7 +554,7 @@ Preço de Mercado apps/client/src/app/components/admin-market-data/admin-market-data.html - 154 + 152 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -570,7 +570,7 @@ Filtrar por... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 367 + 365 @@ -578,11 +578,11 @@ Primeira Atividade apps/client/src/app/components/admin-market-data/admin-market-data.html - 169 + 167 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 222 + 235 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -598,7 +598,7 @@ Dados Históricos apps/client/src/app/components/admin-market-data/admin-market-data.html - 193 + 191 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -610,7 +610,7 @@ Contagem de Países apps/client/src/app/components/admin-market-data/admin-market-data.html - 211 + 209 @@ -618,7 +618,7 @@ Contagem de Setores apps/client/src/app/components/admin-market-data/admin-market-data.html - 202 + 200 @@ -642,7 +642,7 @@ Recolher Dados de Perfíl apps/client/src/app/components/admin-market-data/admin-market-data.html - 262 + 260 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -654,7 +654,7 @@ Deseja realmente eliminar este cupão? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 235 + 242 @@ -662,7 +662,7 @@ Deseja realmente limpar a cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 272 + 279 @@ -670,7 +670,7 @@ Por favor, defina a sua mensagem do sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 292 + 299 @@ -806,11 +806,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 621 + 641 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 624 + 644 @@ -850,7 +850,7 @@ Referência apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 388 + 401 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -924,10 +924,6 @@ Fear Medo - - apps/client/src/app/components/home-market/home-market.component.ts - 48 - apps/client/src/app/components/markets/markets.component.ts 46 @@ -940,10 +936,6 @@ Greed Ganância - - apps/client/src/app/components/home-market/home-market.component.ts - 49 - apps/client/src/app/components/markets/markets.component.ts 47 @@ -956,29 +948,17 @@ Last Days Últimos Dias - - apps/client/src/app/components/home-market/home-market.html - 7 - apps/client/src/app/components/markets/markets.html 17 - - annual interest rate - annual interest rate - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 186 - - Deposit Depósito libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 410 + 423 @@ -1036,6 +1016,10 @@ or ou + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 167 + apps/client/src/app/components/admin-settings/admin-settings.component.html 30 @@ -1056,14 +1040,6 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 100 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 84 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 162 - apps/client/src/app/pages/pricing/pricing-page.html 326 @@ -1218,19 +1194,27 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 215 + 213 libs/ui/src/lib/holdings-table/holdings-table.component.html 74 + + By , this is projected to increase to per year or per month, assuming a annual interest rate. + By , this is projected to increase to per year or per month, assuming a annual interest rate. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 132 + + Sector Setor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 280 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1242,7 +1226,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 282 + 295 apps/client/src/app/components/admin-users/admin-users.html @@ -1262,11 +1246,11 @@ Setores apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 301 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 407 + 420 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1282,11 +1266,11 @@ Países apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 298 + 311 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 418 + 431 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1370,7 +1354,7 @@ AATD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 libs/ui/src/lib/assistant/assistant.component.ts @@ -1382,7 +1366,7 @@ 1A apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 libs/ui/src/lib/assistant/assistant.component.ts @@ -1402,7 +1386,7 @@ 5A apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -1422,7 +1406,7 @@ Máx apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 244 libs/ui/src/lib/assistant/assistant.component.ts @@ -1450,7 +1434,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 190 @@ -1462,7 +1446,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 190 + 188 @@ -1474,7 +1458,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 191 @@ -1596,14 +1580,6 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html 33 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 81 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 159 - apps/client/src/app/pages/pricing/pricing-page.html 265 @@ -1682,7 +1658,7 @@ Localidade apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 547 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2130,7 +2106,7 @@ Mercados apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 390 + 403 apps/client/src/app/components/footer/footer.component.html @@ -2186,7 +2162,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 231 + 244 apps/client/src/app/components/admin-overview/admin-overview.html @@ -2238,7 +2214,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 @@ -2302,7 +2278,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 239 + 237 @@ -2310,7 +2286,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 455 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2326,7 +2302,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 372 + 370 @@ -2334,7 +2310,7 @@ A importar dados... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 170 @@ -2342,7 +2318,7 @@ A importação foi concluída apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 182 + 180 @@ -2381,6 +2357,14 @@ 176 + + Do you really want to convert this asset profile to ()? + Do you really want to convert this asset profile to ()? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 723 + + Allocations Alocações @@ -2554,7 +2538,7 @@ Mensalmente apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 94 + 95 @@ -2854,7 +2838,7 @@ Importar Atividades apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 92 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2862,7 +2846,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 408 + 406 @@ -2874,7 +2858,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 436 + 434 @@ -2886,7 +2870,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 449 + 447 @@ -2894,7 +2878,7 @@ Clonar libs/ui/src/lib/activities-table/activities-table.component.html - 494 + 492 @@ -2902,7 +2886,7 @@ Exportar Rascunho como ICS libs/ui/src/lib/activities-table/activities-table.component.html - 504 + 502 @@ -2910,7 +2894,7 @@ Deseja realmente eliminar esta atividade? libs/ui/src/lib/activities-table/activities-table.component.ts - 329 + 327 @@ -2942,7 +2926,7 @@ {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} apps/client/src/app/components/admin-market-data/admin-market-data.html - 277 + 275 @@ -2958,7 +2942,7 @@ Montante Total Projetado libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 66 + 62 @@ -2974,7 +2958,7 @@ libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 420 + 433 libs/ui/src/lib/i18n.ts @@ -2986,7 +2970,7 @@ Poupanças libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 430 + 443 @@ -2998,7 +2982,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 337 + 335 libs/ui/src/lib/i18n.ts @@ -3014,15 +2998,15 @@ Classe de Ativo apps/client/src/app/components/admin-market-data/admin-market-data.html - 118 + 116 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 240 + 253 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 336 + 349 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3070,7 +3054,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 449 + 460 @@ -3086,7 +3070,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 186 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -3318,15 +3302,15 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 462 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 465 + 476 libs/ui/src/lib/top-holdings/top-holdings.component.html - 186 + 181 @@ -3334,7 +3318,7 @@ Data Gathering Frequency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 454 + 467 @@ -3342,7 +3326,7 @@ Nº de Atividades apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 182 @@ -3358,7 +3342,7 @@ Mapeamento de Símbolo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 396 + 409 @@ -3406,7 +3390,7 @@ A validar dados... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 293 + 291 @@ -3458,7 +3442,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 libs/ui/src/lib/i18n.ts @@ -3478,15 +3462,15 @@ Subclasse de Ativos apps/client/src/app/components/admin-market-data/admin-market-data.html - 136 + 134 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 249 + 262 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 352 + 365 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3526,7 +3510,7 @@ Anualmente apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 95 + 96 @@ -3534,7 +3518,7 @@ Importar Dividendos apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 133 + 131 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3542,7 +3526,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 422 + 420 @@ -3594,7 +3578,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 147 + 145 @@ -3778,7 +3762,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 214 + 216 @@ -3886,11 +3870,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 655 + 675 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 658 + 678 @@ -4074,7 +4058,7 @@ Deseja mesmo eliminar estas atividades? libs/ui/src/lib/activities-table/activities-table.component.ts - 319 + 317 @@ -4093,14 +4077,6 @@ 11 - - By - By - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 140 - - Update platform Atualizar plataforma @@ -4114,7 +4090,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 @@ -4130,11 +4106,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 429 + 442 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 588 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4150,7 +4126,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 645 + 665 @@ -4542,7 +4518,7 @@ Configuração do raspador apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 496 + 509 @@ -4605,6 +4581,14 @@ 108 + + Coupon has been created + Coupon has been created + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 224 + + Available in Disponível em @@ -4810,7 +4794,7 @@ ETFs sem países apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 135 @@ -4818,7 +4802,15 @@ ETFs sem setores apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 140 + + + + An error occurred while converting the data source to . + An error occurred while converting the data source to . + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 482 @@ -4941,14 +4933,6 @@ 49 - - this is projected to increase to - this is projected to increase to - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 148 - - Biometric Authentication Autenticação biométrica @@ -5054,7 +5038,7 @@ Moedas apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 130 apps/client/src/app/pages/public/public-page.html @@ -5106,11 +5090,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 569 + 589 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 572 + 592 @@ -5727,6 +5711,14 @@ 348 + + Convert to + Convert to + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 174 + + (Last 30 days) (Últimos 30 dias) @@ -5796,7 +5788,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 263 + 261 libs/ui/src/lib/i18n.ts @@ -5971,14 +5963,6 @@ 5 - - , - , - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 146 - - Last All Time High Última alta de todos os tempos @@ -5987,18 +5971,6 @@ 105 - - per month - per month - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 95 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 173 - - Ghostfolio vs comparison table Ghostfolio vs tabela de comparação @@ -6076,7 +6048,7 @@ Você realmente deseja excluir esta mensagem do sistema? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 248 + 255 @@ -6144,7 +6116,7 @@ O preço de mercado atual é apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 770 + 766 @@ -6152,7 +6124,7 @@ Teste apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 606 @@ -6236,11 +6208,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 84 + 85 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 100 + 101 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6308,7 +6280,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -6328,7 +6300,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 libs/ui/src/lib/assistant/assistant.component.ts @@ -6392,7 +6364,7 @@ ano apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6412,7 +6384,7 @@ anos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -6432,7 +6404,7 @@ Coleta de dados apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 616 + 629 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6497,7 +6469,7 @@ Daily apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 210 + 212 @@ -6681,7 +6653,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 399 @@ -6697,7 +6669,7 @@ Mostrar mais libs/ui/src/lib/top-holdings/top-holdings.component.html - 179 + 174 @@ -6705,7 +6677,7 @@ Referências apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 125 @@ -6917,7 +6889,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 475 + 473 @@ -6933,7 +6905,7 @@ Erro apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 761 + 757 @@ -6977,7 +6949,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 634 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7029,7 +7001,7 @@ Fechar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 623 + 636 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7181,11 +7153,11 @@ - has been copied to the clipboard - has been copied to the clipboard + has been copied to the clipboard + has been copied to the clipboard apps/client/src/app/components/admin-overview/admin-overview.component.ts - 395 + 223 libs/ui/src/lib/value/value.component.ts @@ -7248,14 +7220,6 @@ 207 - - , assuming a - , assuming a - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 175 - - Financial Services Financial Services @@ -7289,7 +7253,7 @@ Delete apps/client/src/app/components/admin-market-data/admin-market-data.html - 272 + 270 @@ -7611,7 +7575,7 @@ Guardar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 645 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7711,7 +7675,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 217 + 218 @@ -7727,7 +7691,7 @@ Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7735,7 +7699,7 @@ Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7743,7 +7707,7 @@ Preço de mercado padrão apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 506 + 519 @@ -7751,7 +7715,15 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 543 + 556 + + + + Do you really want to convert the data source to ? + Do you really want to convert the data source to ? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 485 @@ -7759,7 +7731,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 559 + 572 @@ -7767,7 +7739,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 532 @@ -7775,7 +7747,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7783,7 +7755,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7791,7 +7763,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 218 + 219 @@ -7799,7 +7771,7 @@ Criar libs/ui/src/lib/tags-selector/tags-selector.component.html - 66 + 64 @@ -7811,7 +7783,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 @@ -7843,11 +7815,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 404 + 427 @@ -7996,7 +7968,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 702 + 718 @@ -8004,7 +7976,7 @@ An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 710 + 721 @@ -8028,7 +8000,7 @@ Gather Recent Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 253 + 251 @@ -8036,7 +8008,7 @@ Gather All Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 258 + 256 @@ -8116,7 +8088,7 @@ Calculations are based on delayed market data and may not be displayed in real-time. apps/client/src/app/components/home-market/home-market.html - 45 + 28 apps/client/src/app/components/markets/markets.html @@ -8149,7 +8121,7 @@ Demo user account has been synced. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 316 + 323 @@ -8371,7 +8343,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 3f7086da71..11414702cf 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -243,7 +243,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 185 + 183 @@ -319,7 +319,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 332 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -395,11 +395,11 @@ Para Birimi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 216 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 326 + 339 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -419,7 +419,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 305 + 303 @@ -455,11 +455,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 286 + 284 libs/ui/src/lib/activities-table/activities-table.component.html - 322 + 320 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -483,7 +483,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 306 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -499,7 +499,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 485 + 483 @@ -507,7 +507,7 @@ Sil apps/client/src/app/components/admin-market-data/admin-market-data.html - 329 + 327 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -539,7 +539,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 515 + 513 libs/ui/src/lib/benchmark/benchmark.component.html @@ -571,11 +571,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 109 + 107 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 184 + 197 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -659,7 +659,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 473 + 486 @@ -715,7 +715,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 194 + 192 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -735,7 +735,7 @@ Piyasa Fiyatı apps/client/src/app/components/admin-market-data/admin-market-data.html - 154 + 152 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -751,7 +751,7 @@ Para Birimleri apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 130 apps/client/src/app/pages/public/public-page.html @@ -771,7 +771,7 @@ Ülkesi Olmayan ETF’ler apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 135 @@ -779,7 +779,15 @@ Sektörü Olmayan ETF’ler apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 140 + + + + An error occurred while converting the data source to . + An error occurred while converting the data source to . + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 482 @@ -787,7 +795,7 @@ Filtrele... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 367 + 365 @@ -795,11 +803,11 @@ İlk İşlem apps/client/src/app/components/admin-market-data/admin-market-data.html - 169 + 167 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 222 + 235 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -815,7 +823,7 @@ Data Gathering Frequency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 454 + 467 @@ -823,7 +831,7 @@ İşlem Sayısı apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 182 @@ -831,7 +839,7 @@ Tarihsel Veri apps/client/src/app/components/admin-market-data/admin-market-data.html - 193 + 191 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -843,7 +851,7 @@ Sektör Sayısı apps/client/src/app/components/admin-market-data/admin-market-data.html - 202 + 200 @@ -867,7 +875,7 @@ Ülke Sayısı apps/client/src/app/components/admin-market-data/admin-market-data.html - 211 + 209 @@ -875,7 +883,7 @@ Profil Verisini Getir apps/client/src/app/components/admin-market-data/admin-market-data.html - 262 + 260 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -890,12 +898,20 @@ 21 + + By , this is projected to increase to per year or per month, assuming a annual interest rate. + By , this is projected to increase to per year or per month, assuming a annual interest rate. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 132 + + Sector Sektör apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 280 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -907,7 +923,7 @@ Ülke apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 282 + 295 apps/client/src/app/components/admin-users/admin-users.html @@ -927,11 +943,11 @@ Sektörler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 301 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 407 + 420 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -947,11 +963,11 @@ Ülkeler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 298 + 311 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 418 + 431 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -963,7 +979,7 @@ Sembol Eşleştirme apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 396 + 409 @@ -1003,7 +1019,7 @@ Veri Toplayıcı Yapılandırması apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 496 + 509 @@ -1011,7 +1027,7 @@ Not apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 455 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1027,7 +1043,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 372 + 370 @@ -1071,7 +1087,7 @@ Bu kuponu gerçekten silmek istiyor musunuz? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 235 + 242 @@ -1079,7 +1095,7 @@ Önbelleği temizlemeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 272 + 279 @@ -1087,7 +1103,7 @@ Lütfen sistem mesajınızı belirleyin: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 292 + 299 @@ -1203,11 +1219,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 429 + 442 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 588 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1223,7 +1239,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 645 + 665 @@ -1242,14 +1258,6 @@ 11 - - By - By - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 140 - - Update platform Platformu Güncelle @@ -1263,7 +1271,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 @@ -1355,11 +1363,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 621 + 641 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 624 + 644 @@ -1407,7 +1415,7 @@ Karşılaştırma Ölçütü apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 388 + 401 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1481,10 +1489,6 @@ Fear Korku - - apps/client/src/app/components/home-market/home-market.component.ts - 48 - apps/client/src/app/components/markets/markets.component.ts 46 @@ -1497,10 +1501,6 @@ Greed Açgözlülük - - apps/client/src/app/components/home-market/home-market.component.ts - 49 - apps/client/src/app/components/markets/markets.component.ts 47 @@ -1513,10 +1513,6 @@ Last Days Son Gün - - apps/client/src/app/components/home-market/home-market.html - 7 - apps/client/src/app/components/markets/markets.html 17 @@ -1607,7 +1603,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 @@ -1677,6 +1673,10 @@ or veya + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 167 + apps/client/src/app/components/admin-settings/admin-settings.component.html 30 @@ -1697,14 +1697,6 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 100 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 84 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 162 - apps/client/src/app/pages/pricing/pricing-page.html 326 @@ -1879,7 +1871,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 215 + 213 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2091,7 +2083,7 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 libs/ui/src/lib/assistant/assistant.component.ts @@ -2103,7 +2095,7 @@ 1Y apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 libs/ui/src/lib/assistant/assistant.component.ts @@ -2123,7 +2115,7 @@ 5Y apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -2143,7 +2135,7 @@ Maks. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 244 libs/ui/src/lib/assistant/assistant.component.ts @@ -2171,7 +2163,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 190 @@ -2183,7 +2175,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 190 + 188 @@ -2195,7 +2187,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 191 @@ -2587,11 +2579,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 569 + 589 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 572 + 592 @@ -2887,7 +2879,7 @@ Piyasalar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 390 + 403 apps/client/src/app/components/footer/footer.component.html @@ -3331,7 +3323,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 231 + 244 apps/client/src/app/components/admin-overview/admin-overview.html @@ -3375,7 +3367,7 @@ Tüm işlemlerinizi silmeyi gerçekten istiyor musunuz? libs/ui/src/lib/activities-table/activities-table.component.ts - 319 + 317 @@ -3431,7 +3423,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 239 + 237 @@ -3439,7 +3431,7 @@ İşlemleri İçe Aktar apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 92 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3447,7 +3439,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 408 + 406 @@ -3455,7 +3447,7 @@ Temettüleri İçe Aktar apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 133 + 131 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3463,7 +3455,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 422 + 420 @@ -3471,7 +3463,7 @@ Veri içe aktarılıyor... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 170 @@ -3479,7 +3471,7 @@ İçe aktarma tamamlandı apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 182 + 180 @@ -3495,7 +3487,7 @@ Veri doğrulanıyor... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 293 + 291 @@ -3578,6 +3570,14 @@ 176 + + Do you really want to convert this asset profile to ()? + Do you really want to convert this asset profile to ()? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 723 + + Import İçe Aktar @@ -3819,27 +3819,19 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 libs/ui/src/lib/i18n.ts 43 - - annual interest rate - annual interest rate - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 186 - - Deposit Para Yatırma libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 410 + 423 @@ -3847,7 +3839,7 @@ Aylık apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 94 + 95 @@ -3855,7 +3847,7 @@ Yıllık apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 95 + 96 @@ -3999,7 +3991,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 214 + 216 @@ -4151,11 +4143,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 655 + 675 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 658 + 678 @@ -4371,6 +4363,14 @@ 108 + + Coupon has been created + Coupon has been created + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 224 + + Available in Mevcut @@ -4686,14 +4686,6 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html 33 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 81 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 159 - apps/client/src/app/pages/pricing/pricing-page.html 265 @@ -4768,7 +4760,7 @@ Yerel Ayarlar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 547 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -4835,14 +4827,6 @@ 221 - - this is projected to increase to - this is projected to increase to - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 148 - - Biometric Authentication Biyometrik Kimlik Doğrulama @@ -4940,7 +4924,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 436 + 434 @@ -4952,7 +4936,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 449 + 447 @@ -4968,7 +4952,7 @@ Klonla libs/ui/src/lib/activities-table/activities-table.component.html - 494 + 492 @@ -4976,7 +4960,7 @@ Taslakları ICS Olarak Dışa Aktar libs/ui/src/lib/activities-table/activities-table.component.html - 504 + 502 @@ -4984,7 +4968,7 @@ TBu işlemi silmeyi gerçekten istiyor musunuz? libs/ui/src/lib/activities-table/activities-table.component.ts - 329 + 327 @@ -5016,7 +5000,7 @@ {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} apps/client/src/app/components/admin-market-data/admin-market-data.html - 277 + 275 @@ -5064,7 +5048,7 @@ Hesaplanan Toplam Tutar libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 66 + 62 @@ -5080,7 +5064,7 @@ libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 420 + 433 libs/ui/src/lib/i18n.ts @@ -5092,7 +5076,7 @@ Tasarruflar libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 430 + 443 @@ -5140,7 +5124,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 337 + 335 libs/ui/src/lib/i18n.ts @@ -5164,15 +5148,15 @@ Varlık Sınıfı apps/client/src/app/components/admin-market-data/admin-market-data.html - 118 + 116 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 240 + 253 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 336 + 349 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5196,15 +5180,15 @@ AVarlık Alt Sınıfı apps/client/src/app/components/admin-market-data/admin-market-data.html - 136 + 134 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 249 + 262 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 352 + 365 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5320,7 +5304,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 449 + 460 @@ -5344,7 +5328,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 147 + 145 @@ -5384,7 +5368,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 186 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -5692,15 +5676,15 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 462 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 465 + 476 libs/ui/src/lib/top-holdings/top-holdings.component.html - 186 + 181 @@ -5735,6 +5719,14 @@ 348 + + Convert to + Convert to + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 174 + + (Last 30 days) (Son 30 gün) @@ -5804,7 +5796,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 263 + 261 libs/ui/src/lib/i18n.ts @@ -5971,14 +5963,6 @@ 5 - - , - , - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 146 - - Last All Time High Son, ATH @@ -5987,18 +5971,6 @@ 105 - - per month - per month - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 95 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 173 - - Ghostfolio vs comparison table Ghostfolio ve karşılatırma tablosu @@ -6076,7 +6048,7 @@ Bu sistem mesajını silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 248 + 255 @@ -6144,7 +6116,7 @@ Şu anki piyasa fiyatı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 770 + 766 @@ -6152,7 +6124,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 606 @@ -6236,11 +6208,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 84 + 85 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 100 + 101 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6308,7 +6280,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -6328,7 +6300,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 libs/ui/src/lib/assistant/assistant.component.ts @@ -6392,7 +6364,7 @@ Yıl apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6412,7 +6384,7 @@ Yıllar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -6432,7 +6404,7 @@ Veri Toplama apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 616 + 629 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6497,7 +6469,7 @@ Daily apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 210 + 212 @@ -6681,7 +6653,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 399 @@ -6697,7 +6669,7 @@ Daha fazla göster libs/ui/src/lib/top-holdings/top-holdings.component.html - 179 + 174 @@ -6705,7 +6677,7 @@ Kıyaslamalar apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 125 @@ -6917,7 +6889,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 475 + 473 @@ -6933,7 +6905,7 @@ Hata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 761 + 757 @@ -6977,7 +6949,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 634 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7029,7 +7001,7 @@ Kapat apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 623 + 636 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7181,11 +7153,11 @@ - has been copied to the clipboard - has been copied to the clipboard + has been copied to the clipboard + has been copied to the clipboard apps/client/src/app/components/admin-overview/admin-overview.component.ts - 395 + 223 libs/ui/src/lib/value/value.component.ts @@ -7248,14 +7220,6 @@ 207 - - , assuming a - , assuming a - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 175 - - Financial Services Financial Services @@ -7289,7 +7253,7 @@ Delete apps/client/src/app/components/admin-market-data/admin-market-data.html - 272 + 270 @@ -7611,7 +7575,7 @@ Kaydet apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 645 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7711,7 +7675,7 @@ Yapay zeka istemi panoya kopyalandı apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 217 + 218 @@ -7727,7 +7691,7 @@ Tembel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7735,7 +7699,7 @@ Anında apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7743,7 +7707,7 @@ Varsayılan Piyasa Fiyatı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 506 + 519 @@ -7751,7 +7715,15 @@ Mod apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 543 + 556 + + + + Do you really want to convert the data source to ? + Do you really want to convert the data source to ? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 485 @@ -7759,7 +7731,7 @@ Seçici apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 559 + 572 @@ -7767,7 +7739,7 @@ HTTP İstek Başlıkları apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 532 @@ -7775,7 +7747,7 @@ gün sonu apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7783,7 +7755,7 @@ gerçek zamanlı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7791,7 +7763,7 @@ Duck.ai’yi aç apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 218 + 219 @@ -7799,7 +7771,7 @@ Oluştur libs/ui/src/lib/tags-selector/tags-selector.component.html - 66 + 64 @@ -7811,7 +7783,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 @@ -7843,11 +7815,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 404 + 427 @@ -7996,7 +7968,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 702 + 718 @@ -8004,7 +7976,7 @@ Güncelleştirilirken bir hata oluştu (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 710 + 721 @@ -8028,7 +8000,7 @@ Yakın Geçmiş Piyasa Verilerini Topla apps/client/src/app/components/admin-market-data/admin-market-data.html - 253 + 251 @@ -8036,7 +8008,7 @@ Tüm Geçmiş Piyasa Verilerini Topla apps/client/src/app/components/admin-market-data/admin-market-data.html - 258 + 256 @@ -8116,7 +8088,7 @@ Hesaplamalar gecikmeli piyasa verilerine dayanmaktadır ve gerçek zamanlı olarak görüntülenemeyebilir. apps/client/src/app/components/home-market/home-market.html - 45 + 28 apps/client/src/app/components/markets/markets.html @@ -8149,7 +8121,7 @@ Demo kullanıcı hesabı senkronize edildi. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 316 + 323 @@ -8371,7 +8343,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index a3857d31dc..bf927affd3 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -455,7 +455,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 332 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -531,11 +531,11 @@ Валюта apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 216 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 326 + 339 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -555,7 +555,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 305 + 303 @@ -591,11 +591,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 286 + 284 libs/ui/src/lib/activities-table/activities-table.component.html - 322 + 320 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -619,7 +619,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 306 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -635,7 +635,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 485 + 483 @@ -643,7 +643,7 @@ Видалити apps/client/src/app/components/admin-market-data/admin-market-data.html - 329 + 327 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -675,7 +675,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 515 + 513 libs/ui/src/lib/benchmark/benchmark.component.html @@ -723,7 +723,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 185 + 183 @@ -743,7 +743,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 473 + 486 @@ -763,11 +763,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 109 + 107 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 184 + 197 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -875,7 +875,7 @@ Порівняльні показники apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 125 @@ -883,7 +883,7 @@ Валюти apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 130 apps/client/src/app/pages/public/public-page.html @@ -903,7 +903,7 @@ ETF без країн apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 135 @@ -911,7 +911,15 @@ ETF без секторів apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 140 + + + + An error occurred while converting the data source to . + An error occurred while converting the data source to . + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 482 @@ -919,7 +927,7 @@ Фільтрувати за... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 367 + 365 @@ -935,7 +943,7 @@ Ринкова ціна apps/client/src/app/components/admin-market-data/admin-market-data.html - 154 + 152 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -951,11 +959,11 @@ Перша активність apps/client/src/app/components/admin-market-data/admin-market-data.html - 169 + 167 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 222 + 235 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -971,7 +979,7 @@ Частота збору даних apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 454 + 467 @@ -979,7 +987,7 @@ Кількість активностей apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 182 @@ -987,7 +995,7 @@ Історичні дані apps/client/src/app/components/admin-market-data/admin-market-data.html - 193 + 191 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -999,7 +1007,7 @@ Кількість секторів apps/client/src/app/components/admin-market-data/admin-market-data.html - 202 + 200 @@ -1023,7 +1031,7 @@ Кількість країн apps/client/src/app/components/admin-market-data/admin-market-data.html - 211 + 209 @@ -1031,7 +1039,7 @@ Зібрати дані профілю apps/client/src/app/components/admin-market-data/admin-market-data.html - 262 + 260 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1063,7 +1071,7 @@ Помилка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 761 + 757 @@ -1071,7 +1079,7 @@ Поточна ринкова ціна apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 770 + 766 @@ -1082,12 +1090,20 @@ 21 + + By , this is projected to increase to per year or per month, assuming a annual interest rate. + By , this is projected to increase to per year or per month, assuming a annual interest rate. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 132 + + Sector Сектор apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 280 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1099,7 +1115,7 @@ Країна apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 282 + 295 apps/client/src/app/components/admin-users/admin-users.html @@ -1119,11 +1135,11 @@ Сектори apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 301 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 407 + 420 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1139,11 +1155,11 @@ Країни apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 298 + 311 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 418 + 431 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1155,7 +1171,7 @@ Зіставлення символів apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 396 + 409 @@ -1195,7 +1211,7 @@ Конфігурація скребка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 496 + 509 @@ -1203,7 +1219,7 @@ Тест apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 606 @@ -1211,11 +1227,11 @@ URL apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 429 + 442 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 588 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1231,7 +1247,7 @@ Профіль активу було збережено apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 645 + 665 @@ -1239,7 +1255,7 @@ Примітка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 455 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1255,7 +1271,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 372 + 370 @@ -1339,7 +1355,7 @@ Ви дійсно хочете видалити цей купон? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 235 + 242 @@ -1347,7 +1363,7 @@ Ви дійсно хочете видалити це системне повідомлення? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 248 + 255 @@ -1355,7 +1371,7 @@ Ви дійсно хочете очистити кеш? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 272 + 279 @@ -1363,7 +1379,7 @@ Будь ласка, встановіть ваше системне повідомлення: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 292 + 299 @@ -1403,7 +1419,7 @@ Збір даних apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 616 + 629 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1494,14 +1510,6 @@ 11 - - By - До - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 140 - - Update platform Оновити платформу @@ -1515,7 +1523,7 @@ Поточний рік apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 @@ -1629,6 +1637,10 @@ or або + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 167 + apps/client/src/app/components/admin-settings/admin-settings.component.html 30 @@ -1649,14 +1661,6 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 100 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 84 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 162 - apps/client/src/app/pages/pricing/pricing-page.html 326 @@ -1787,11 +1791,11 @@ Не вдалося перевірити форму apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 621 + 641 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 624 + 644 @@ -1839,7 +1843,7 @@ Порівняльний показник apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 388 + 401 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1979,7 +1983,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 215 + 213 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2065,10 +2069,6 @@ Fear Страх - - apps/client/src/app/components/home-market/home-market.component.ts - 48 - apps/client/src/app/components/markets/markets.component.ts 46 @@ -2081,10 +2081,6 @@ Greed Жадібність - - apps/client/src/app/components/home-market/home-market.component.ts - 49 - apps/client/src/app/components/markets/markets.component.ts 47 @@ -2097,10 +2093,6 @@ Last Days Останні днів - - apps/client/src/app/components/home-market/home-market.html - 7 - apps/client/src/app/components/markets/markets.html 17 @@ -2191,7 +2183,7 @@ Поточний тиждень apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 @@ -2411,7 +2403,7 @@ Зберегти apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 645 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2699,7 +2691,7 @@ З початку року apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 libs/ui/src/lib/assistant/assistant.component.ts @@ -2711,7 +2703,7 @@ 1 рік apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 libs/ui/src/lib/assistant/assistant.component.ts @@ -2731,7 +2723,7 @@ 5 років apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -2751,7 +2743,7 @@ Максимум apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 244 libs/ui/src/lib/assistant/assistant.component.ts @@ -2871,7 +2863,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 191 @@ -2945,14 +2937,6 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html 33 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 81 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 159 - apps/client/src/app/pages/pricing/pricing-page.html 265 @@ -3023,7 +3007,7 @@ Включити до apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 399 @@ -3095,7 +3079,7 @@ Локалізація apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 547 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -3174,14 +3158,6 @@ 221 - - this is projected to increase to - прогнозується, що збільшиться до - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 148 - - Biometric Authentication Біометрична аутентифікація @@ -3259,7 +3235,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 190 @@ -3279,7 +3255,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 190 + 188 @@ -3287,7 +3263,7 @@ Щодня apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 210 + 212 @@ -3739,11 +3715,11 @@ Не вдалося розібрати конфігурацію скрапера apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 569 + 589 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 572 + 592 @@ -4052,7 +4028,7 @@ Ринки apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 390 + 403 apps/client/src/app/components/footer/footer.component.html @@ -4507,6 +4483,14 @@ 63 + + Convert to + Convert to + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 174 + + (Last 30 days) (Останні 30 днів) @@ -4588,7 +4572,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 231 + 244 apps/client/src/app/components/admin-overview/admin-overview.html @@ -4716,7 +4700,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 194 + 192 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -4732,7 +4716,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 239 + 237 @@ -4740,7 +4724,7 @@ Імпортувати активності apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 92 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4748,7 +4732,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 408 + 406 @@ -4756,7 +4740,7 @@ Імпорт дивідендів apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 133 + 131 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4764,7 +4748,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 422 + 420 @@ -4772,7 +4756,7 @@ Імпортуються дані... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 170 @@ -4780,7 +4764,7 @@ Імпорт завершено apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 182 + 180 @@ -4796,7 +4780,7 @@ Перевірка даних... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 293 + 291 @@ -4887,6 +4871,14 @@ 176 + + Do you really want to convert this asset profile to ()? + Do you really want to convert this asset profile to ()? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 723 + + Import Імпорт @@ -5144,7 +5136,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 libs/ui/src/lib/i18n.ts @@ -5164,11 +5156,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 84 + 85 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 100 + 101 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5188,7 +5180,7 @@ Щомісячно apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 94 + 95 @@ -5196,7 +5188,7 @@ Щорічно apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 95 + 96 @@ -5412,7 +5404,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 214 + 216 @@ -5548,11 +5540,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 655 + 675 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 658 + 678 @@ -5580,11 +5572,11 @@ - has been copied to the clipboard - has been copied to the clipboard + has been copied to the clipboard + has been copied to the clipboard apps/client/src/app/components/admin-overview/admin-overview.component.ts - 395 + 223 libs/ui/src/lib/value/value.component.ts @@ -6018,18 +6010,6 @@ 44 - - per month - per month - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 95 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 173 - - Ghostfolio vs comparison table Порівняльна таблиця Ghostfolio проти @@ -6070,6 +6050,14 @@ 108 + + Coupon has been created + Coupon has been created + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 224 + + Available in Доступно в @@ -6190,14 +6178,6 @@ 215 - - , assuming a - , assuming a - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 175 - - Financial Services Financial Services @@ -6231,7 +6211,7 @@ Delete apps/client/src/app/components/admin-market-data/admin-market-data.html - 272 + 270 @@ -6495,7 +6475,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 436 + 434 @@ -6507,7 +6487,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 449 + 447 @@ -6531,7 +6511,7 @@ Клонувати libs/ui/src/lib/activities-table/activities-table.component.html - 494 + 492 @@ -6539,7 +6519,7 @@ Експортувати чернетку як ICS libs/ui/src/lib/activities-table/activities-table.component.html - 504 + 502 @@ -6547,7 +6527,7 @@ Ви дійсно хочете видалити ці дії? libs/ui/src/lib/activities-table/activities-table.component.ts - 319 + 317 @@ -6555,7 +6535,7 @@ Ви дійсно хочете видалити цю активність? libs/ui/src/lib/activities-table/activities-table.component.ts - 329 + 327 @@ -6571,7 +6551,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -6591,7 +6571,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 libs/ui/src/lib/assistant/assistant.component.ts @@ -6619,7 +6599,7 @@ рік apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6639,7 +6619,7 @@ роки apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -6706,14 +6686,6 @@ 76 - - , - , - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 146 - - Last All Time High Останній рекордний максимум @@ -6751,7 +6723,7 @@ {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} apps/client/src/app/components/admin-market-data/admin-market-data.html - 277 + 275 @@ -6799,15 +6771,7 @@ Прогнозована загальна сума libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 66 - - - - annual interest rate - annual interest rate - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 186 + 62 @@ -6815,7 +6779,7 @@ Депозит libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 410 + 423 @@ -6831,7 +6795,7 @@ libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 420 + 433 libs/ui/src/lib/i18n.ts @@ -6843,7 +6807,7 @@ Заощадження libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 430 + 443 @@ -6915,7 +6879,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 337 + 335 libs/ui/src/lib/i18n.ts @@ -6939,15 +6903,15 @@ Клас активів apps/client/src/app/components/admin-market-data/admin-market-data.html - 118 + 116 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 240 + 253 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 336 + 349 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -6971,15 +6935,15 @@ Підклас активів apps/client/src/app/components/admin-market-data/admin-market-data.html - 136 + 134 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 249 + 262 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 352 + 365 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -7011,7 +6975,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 634 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7071,7 +7035,7 @@ Закрити apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 623 + 636 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7211,7 +7175,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 449 + 460 @@ -7243,7 +7207,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 147 + 145 @@ -7283,7 +7247,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 186 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7383,7 +7347,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 263 + 261 libs/ui/src/lib/i18n.ts @@ -7611,7 +7575,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 475 + 473 @@ -7679,15 +7643,15 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 462 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 465 + 476 libs/ui/src/lib/top-holdings/top-holdings.component.html - 186 + 181 @@ -7703,7 +7667,7 @@ Показати більше libs/ui/src/lib/top-holdings/top-holdings.component.html - 179 + 174 @@ -7719,7 +7683,7 @@ Запит AI скопійовано в буфер обміну apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 217 + 218 @@ -7727,7 +7691,7 @@ Лінивий apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7735,7 +7699,7 @@ Миттєвий apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7743,7 +7707,7 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 506 + 519 @@ -7751,7 +7715,15 @@ Режим apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 543 + 556 + + + + Do you really want to convert the data source to ? + Do you really want to convert the data source to ? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 485 @@ -7759,7 +7731,7 @@ Селектор apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 559 + 572 @@ -7767,7 +7739,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 532 @@ -7775,7 +7747,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7783,7 +7755,7 @@ реальний час apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7791,7 +7763,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 218 + 219 @@ -7799,7 +7771,7 @@ Створити libs/ui/src/lib/tags-selector/tags-selector.component.html - 66 + 64 @@ -7811,7 +7783,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 @@ -7843,11 +7815,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 404 + 427 @@ -7996,7 +7968,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 702 + 718 @@ -8004,7 +7976,7 @@ An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 710 + 721 @@ -8028,7 +8000,7 @@ Gather Recent Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 253 + 251 @@ -8036,7 +8008,7 @@ Gather All Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 258 + 256 @@ -8116,7 +8088,7 @@ Calculations are based on delayed market data and may not be displayed in real-time. apps/client/src/app/components/home-market/home-market.html - 45 + 28 apps/client/src/app/components/markets/markets.html @@ -8149,7 +8121,7 @@ Demo user account has been synced. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 316 + 323 @@ -8371,7 +8343,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 208eff81b4..b6dea40be8 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -255,7 +255,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 185 + 183 @@ -342,7 +342,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 332 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -415,11 +415,11 @@ Currency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 216 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 326 + 339 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -439,7 +439,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 305 + 303 @@ -474,11 +474,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 286 + 284 libs/ui/src/lib/activities-table/activities-table.component.html - 322 + 320 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -501,7 +501,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 306 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -517,14 +517,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 485 + 483 Delete apps/client/src/app/components/admin-market-data/admin-market-data.html - 329 + 327 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -556,7 +556,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 515 + 513 libs/ui/src/lib/benchmark/benchmark.component.html @@ -592,7 +592,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 473 + 486 @@ -603,11 +603,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 109 + 107 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 184 + 197 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -711,7 +711,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 194 + 192 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -729,7 +729,7 @@ Market Price apps/client/src/app/components/admin-market-data/admin-market-data.html - 154 + 152 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -744,7 +744,7 @@ Currencies apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 130 apps/client/src/app/pages/public/public-page.html @@ -762,14 +762,21 @@ ETFs without Countries apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 135 ETFs without Sectors apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 140 + + + + An error occurred while converting the data source to . + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 482 @@ -787,18 +794,18 @@ Filter by... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 367 + 365 First Activity apps/client/src/app/components/admin-market-data/admin-market-data.html - 169 + 167 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 222 + 235 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -813,21 +820,21 @@ Data Gathering Frequency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 454 + 467 Activities Count apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 182 Historical Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 193 + 191 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -838,7 +845,7 @@ Sectors Count apps/client/src/app/components/admin-market-data/admin-market-data.html - 202 + 200 @@ -859,28 +866,28 @@ Countries Count apps/client/src/app/components/admin-market-data/admin-market-data.html - 211 + 209 Gather Recent Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 253 + 251 Gather All Historical Market Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 258 + 256 Gather Profile Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 262 + 260 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -930,11 +937,18 @@ 69 + + By , this is projected to increase to per year or per month, assuming a annual interest rate. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 132 + + Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 280 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -945,7 +959,7 @@ Country apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 282 + 295 apps/client/src/app/components/admin-users/admin-users.html @@ -964,11 +978,11 @@ Sectors apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 301 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 407 + 420 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -983,11 +997,11 @@ Countries apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 298 + 311 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 418 + 431 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -998,7 +1012,7 @@ Symbol Mapping apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 396 + 409 @@ -1033,14 +1047,14 @@ Scraper Configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 496 + 509 Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 455 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1056,7 +1070,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 372 + 370 @@ -1117,28 +1131,28 @@ Do you really want to delete this coupon? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 235 + 242 Do you really want to delete this system message? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 248 + 255 Do you really want to flush the cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 272 + 279 Please set your system message: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 292 + 299 @@ -1233,11 +1247,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 429 + 442 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 588 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1252,7 +1266,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 645 + 665 @@ -1269,13 +1283,6 @@ 11 - - By - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 140 - - Update platform @@ -1287,7 +1294,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 @@ -1412,11 +1419,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 621 + 641 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 624 + 644 @@ -1460,7 +1467,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 388 + 401 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1528,10 +1535,6 @@ Fear - - apps/client/src/app/components/home-market/home-market.component.ts - 48 - apps/client/src/app/components/markets/markets.component.ts 46 @@ -1543,10 +1546,6 @@ Greed - - apps/client/src/app/components/home-market/home-market.component.ts - 49 - apps/client/src/app/components/markets/markets.component.ts 47 @@ -1558,10 +1557,6 @@ Last Days - - apps/client/src/app/components/home-market/home-market.html - 7 - apps/client/src/app/components/markets/markets.html 17 @@ -1641,7 +1636,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 @@ -1705,6 +1700,10 @@ or + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 167 + apps/client/src/app/components/admin-settings/admin-settings.component.html 30 @@ -1725,14 +1724,6 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 100 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 84 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 162 - apps/client/src/app/pages/pricing/pricing-page.html 326 @@ -1900,7 +1891,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 215 + 213 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2086,7 +2077,7 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 libs/ui/src/lib/assistant/assistant.component.ts @@ -2097,7 +2088,7 @@ 1Y apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 libs/ui/src/lib/assistant/assistant.component.ts @@ -2115,7 +2106,7 @@ 5Y apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -2133,7 +2124,7 @@ Max apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 244 libs/ui/src/lib/assistant/assistant.component.ts @@ -2213,14 +2204,6 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html 33 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 81 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 159 - apps/client/src/app/pages/pricing/pricing-page.html 265 @@ -2304,7 +2287,7 @@ Locale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 547 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2375,13 +2358,6 @@ 221 - - this is projected to increase to - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 148 - - Biometric Authentication @@ -2451,7 +2427,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 190 @@ -2462,7 +2438,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 190 + 188 @@ -2473,7 +2449,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 191 @@ -2873,11 +2849,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 569 + 589 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 572 + 592 @@ -3135,7 +3111,7 @@ Markets apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 390 + 403 apps/client/src/app/components/footer/footer.component.html @@ -3533,6 +3509,13 @@ 63 + + Convert to + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 174 + + (Last 30 days) @@ -3605,7 +3588,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 231 + 244 apps/client/src/app/components/admin-overview/admin-overview.html @@ -3648,7 +3631,7 @@ Do you really want to delete these activities? libs/ui/src/lib/activities-table/activities-table.component.ts - 319 + 317 @@ -3719,14 +3702,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 239 + 237 Import Activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 92 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3734,14 +3717,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 408 + 406 Import Dividends apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 133 + 131 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3749,21 +3732,21 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 422 + 420 Importing data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 170 Import has been completed apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 182 + 180 @@ -3777,7 +3760,7 @@ Validating data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 293 + 291 @@ -3858,6 +3841,13 @@ 176 + + Do you really want to convert this asset profile to ()? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 723 + + Allocations @@ -4061,39 +4051,32 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 libs/ui/src/lib/i18n.ts 43 - - annual interest rate - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 186 - - Deposit libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 410 + 423 Monthly apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 94 + 95 Yearly apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 95 + 96 @@ -4222,7 +4205,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 214 + 216 @@ -4359,11 +4342,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 655 + 675 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 658 + 678 @@ -4509,17 +4492,6 @@ 44 - - per month - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 95 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 173 - - Ghostfolio vs comparison table @@ -4555,6 +4527,13 @@ 108 + + Coupon has been created + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 224 + + Available in @@ -4823,7 +4802,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 436 + 434 @@ -4834,7 +4813,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 449 + 447 @@ -4848,21 +4827,21 @@ Clone libs/ui/src/lib/activities-table/activities-table.component.html - 494 + 492 Export Draft as ICS libs/ui/src/lib/activities-table/activities-table.component.html - 504 + 502 Do you really want to delete this activity? libs/ui/src/lib/activities-table/activities-table.component.ts - 329 + 327 @@ -4897,13 +4876,6 @@ 76 - - , - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 146 - - Last All Time High @@ -4936,7 +4908,7 @@ {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} apps/client/src/app/components/admin-market-data/admin-market-data.html - 277 + 275 @@ -4978,7 +4950,7 @@ Projected Total Amount libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 66 + 62 @@ -4993,7 +4965,7 @@ libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 420 + 433 libs/ui/src/lib/i18n.ts @@ -5004,7 +4976,7 @@ Savings libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 430 + 443 @@ -5049,7 +5021,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 337 + 335 libs/ui/src/lib/i18n.ts @@ -5071,15 +5043,15 @@ Asset Class apps/client/src/app/components/admin-market-data/admin-market-data.html - 118 + 116 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 240 + 253 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 336 + 349 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5102,15 +5074,15 @@ Asset Sub Class apps/client/src/app/components/admin-market-data/admin-market-data.html - 136 + 134 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 249 + 262 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 352 + 365 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5215,7 +5187,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 449 + 460 @@ -5236,7 +5208,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 147 + 145 @@ -5265,7 +5237,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 186 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -5342,7 +5314,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 263 + 261 libs/ui/src/lib/i18n.ts @@ -5588,15 +5560,15 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 462 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 465 + 476 libs/ui/src/lib/top-holdings/top-holdings.component.html - 186 + 181 @@ -5617,14 +5589,14 @@ The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 770 + 766 Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 606 @@ -5714,11 +5686,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 84 + 85 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 100 + 101 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5771,7 +5743,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 libs/ui/src/lib/assistant/assistant.component.ts @@ -5789,7 +5761,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -5832,7 +5804,7 @@ year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -5851,7 +5823,7 @@ years apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -5892,7 +5864,7 @@ Data Gathering apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 616 + 629 apps/client/src/app/components/admin-overview/admin-overview.html @@ -5928,7 +5900,7 @@ Daily apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 210 + 212 @@ -6089,7 +6061,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 399 @@ -6103,14 +6075,14 @@ Show more libs/ui/src/lib/top-holdings/top-holdings.component.html - 179 + 174 Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 125 @@ -6246,7 +6218,7 @@ View Holding libs/ui/src/lib/activities-table/activities-table.component.html - 475 + 473 @@ -6317,7 +6289,7 @@ Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 761 + 757 @@ -6328,7 +6300,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 634 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6400,7 +6372,7 @@ Close apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 623 + 636 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6560,10 +6532,10 @@ - has been copied to the clipboard + has been copied to the clipboard apps/client/src/app/components/admin-overview/admin-overview.component.ts - 395 + 223 libs/ui/src/lib/value/value.component.ts @@ -6606,13 +6578,6 @@ 10 - - , assuming a - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 175 - - Financial Services @@ -6642,7 +6607,7 @@ Delete apps/client/src/app/components/admin-market-data/admin-market-data.html - 272 + 270 @@ -6930,7 +6895,7 @@ Save apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 645 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7023,7 +6988,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 217 + 218 @@ -7037,70 +7002,77 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 543 + 556 + + + + Do you really want to convert the data source to ? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 485 Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 506 + 519 Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 559 + 572 Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 532 real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 218 + 219 Create libs/ui/src/lib/tags-selector/tags-selector.component.html - 66 + 64 @@ -7111,7 +7083,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 @@ -7141,11 +7113,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 404 + 427 @@ -7277,14 +7249,14 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 702 + 718 An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 710 + 721 @@ -7362,7 +7334,7 @@ Calculations are based on delayed market data and may not be displayed in real-time. apps/client/src/app/components/home-market/home-market.html - 45 + 28 apps/client/src/app/components/markets/markets.html @@ -7399,7 +7371,7 @@ Demo user account has been synced. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 316 + 323 @@ -7590,7 +7562,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 6a3439d47f..8ecedf0e58 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -272,7 +272,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 185 + 183 @@ -368,7 +368,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 319 + 332 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -444,11 +444,11 @@ 货币 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 203 + 216 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 326 + 339 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -468,7 +468,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 305 + 303 @@ -504,11 +504,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 286 + 284 libs/ui/src/lib/activities-table/activities-table.component.html - 322 + 320 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -532,7 +532,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 306 + 304 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -548,7 +548,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 485 + 483 @@ -556,7 +556,7 @@ 删除 apps/client/src/app/components/admin-market-data/admin-market-data.html - 329 + 327 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -588,7 +588,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 515 + 513 libs/ui/src/lib/benchmark/benchmark.component.html @@ -628,7 +628,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 473 + 486 @@ -640,11 +640,11 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 109 + 107 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 184 + 197 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -760,7 +760,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 194 + 192 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -780,7 +780,7 @@ 市场价 apps/client/src/app/components/admin-market-data/admin-market-data.html - 154 + 152 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -796,7 +796,7 @@ 货币 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 130 apps/client/src/app/pages/public/public-page.html @@ -816,7 +816,7 @@ 没有国家的 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 135 @@ -824,7 +824,15 @@ 无行业类别的 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 140 + + + + An error occurred while converting the data source to . + An error occurred while converting the data source to . + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 482 @@ -844,7 +852,7 @@ 过滤... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 367 + 365 @@ -852,11 +860,11 @@ 首笔交易 apps/client/src/app/components/admin-market-data/admin-market-data.html - 169 + 167 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 222 + 235 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -872,7 +880,7 @@ Data Gathering Frequency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 454 + 467 @@ -880,7 +888,7 @@ 活动计数 apps/client/src/app/components/admin-market-data/admin-market-data.html - 184 + 182 @@ -888,7 +896,7 @@ 历史数据 apps/client/src/app/components/admin-market-data/admin-market-data.html - 193 + 191 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -900,7 +908,7 @@ 行业数 apps/client/src/app/components/admin-market-data/admin-market-data.html - 202 + 200 @@ -924,7 +932,7 @@ 国家数 apps/client/src/app/components/admin-market-data/admin-market-data.html - 211 + 209 @@ -932,7 +940,7 @@ 收集个人资料数据 apps/client/src/app/components/admin-market-data/admin-market-data.html - 262 + 260 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -979,12 +987,20 @@ 69 + + By , this is projected to increase to per year or per month, assuming a annual interest rate. + By , this is projected to increase to per year or per month, assuming a annual interest rate. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 132 + + Sector 行业 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 267 + 280 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -996,7 +1012,7 @@ 国家 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 282 + 295 apps/client/src/app/components/admin-users/admin-users.html @@ -1016,11 +1032,11 @@ 行业 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 288 + 301 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 407 + 420 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1036,11 +1052,11 @@ 国家 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 298 + 311 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 418 + 431 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1052,7 +1068,7 @@ 代码映射 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 396 + 409 @@ -1092,7 +1108,7 @@ 刮削配置 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 496 + 509 @@ -1100,7 +1116,7 @@ 笔记 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 442 + 455 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1116,7 +1132,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 372 + 370 @@ -1184,7 +1200,7 @@ 您确实要删除此优惠券吗? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 235 + 242 @@ -1192,7 +1208,7 @@ 您真的要删除这条系统消息吗? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 248 + 255 @@ -1200,7 +1216,7 @@ 您真的要刷新缓存吗? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 272 + 279 @@ -1208,7 +1224,7 @@ 请设置您的系统消息: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 292 + 299 @@ -1316,11 +1332,11 @@ 网址 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 429 + 442 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 575 + 588 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1336,7 +1352,7 @@ 资产概况已保存 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 645 + 665 @@ -1355,14 +1371,6 @@ 11 - - By - 预计到 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 140 - - Update platform 更新平台 @@ -1376,7 +1384,7 @@ 当前年份 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 @@ -1516,11 +1524,11 @@ 无法验证表单 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 621 + 641 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 624 + 644 @@ -1568,7 +1576,7 @@ 基准 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 388 + 401 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1642,10 +1650,6 @@ Fear 恐惧 - - apps/client/src/app/components/home-market/home-market.component.ts - 48 - apps/client/src/app/components/markets/markets.component.ts 46 @@ -1658,10 +1662,6 @@ Greed 贪婪 - - apps/client/src/app/components/home-market/home-market.component.ts - 49 - apps/client/src/app/components/markets/markets.component.ts 47 @@ -1674,10 +1674,6 @@ Last Days 最后的 - - apps/client/src/app/components/home-market/home-market.html - 7 - apps/client/src/app/components/markets/markets.html 17 @@ -1768,7 +1764,7 @@ 当前周 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 @@ -1838,6 +1834,10 @@ or + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 167 + apps/client/src/app/components/admin-settings/admin-settings.component.html 30 @@ -1858,14 +1858,6 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 100 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 84 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 162 - apps/client/src/app/pages/pricing/pricing-page.html 326 @@ -2052,7 +2044,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 215 + 213 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2252,7 +2244,7 @@ 年初至今 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 228 + 232 libs/ui/src/lib/assistant/assistant.component.ts @@ -2264,7 +2256,7 @@ 1年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 libs/ui/src/lib/assistant/assistant.component.ts @@ -2284,7 +2276,7 @@ 5年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -2304,7 +2296,7 @@ 最大限度 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 240 + 244 libs/ui/src/lib/assistant/assistant.component.ts @@ -2394,14 +2386,6 @@ apps/client/src/app/components/user-account-membership/user-account-membership.html 33 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 81 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 159 - apps/client/src/app/pages/pricing/pricing-page.html 265 @@ -2496,7 +2480,7 @@ 语言环境 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 547 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2575,14 +2559,6 @@ 221 - - this is projected to increase to - 预计将增至 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 148 - - Biometric Authentication 生物识别认证 @@ -2660,7 +2636,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 190 @@ -2672,7 +2648,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 190 + 188 @@ -2684,7 +2660,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 193 + 191 @@ -3108,11 +3084,11 @@ 无法解析抓取器配置 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 569 + 589 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 572 + 592 @@ -3396,7 +3372,7 @@ 市场 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 390 + 403 apps/client/src/app/components/footer/footer.component.html @@ -3843,6 +3819,14 @@ 63 + + Convert to + Convert to + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 174 + + (Last 30 days) (最近 30 天) @@ -3924,7 +3908,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 231 + 244 apps/client/src/app/components/admin-overview/admin-overview.html @@ -3968,7 +3952,7 @@ 您确定要删除这些活动吗? libs/ui/src/lib/activities-table/activities-table.component.ts - 319 + 317 @@ -4048,7 +4032,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 239 + 237 @@ -4056,7 +4040,7 @@ 导入活动记录 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 94 + 92 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4064,7 +4048,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 408 + 406 @@ -4072,7 +4056,7 @@ 导入股息 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 133 + 131 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4080,7 +4064,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 422 + 420 @@ -4088,7 +4072,7 @@ 正在导入数据... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 172 + 170 @@ -4096,7 +4080,7 @@ 导入已完成 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 182 + 180 @@ -4112,7 +4096,7 @@ 验证数据... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 293 + 291 @@ -4203,6 +4187,14 @@ 176 + + Do you really want to convert this asset profile to ()? + Do you really want to convert this asset profile to ()? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 723 + + Allocations 分配 @@ -4428,27 +4420,19 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 libs/ui/src/lib/i18n.ts 43 - - annual interest rate - 年利率 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 186 - - Deposit 存款 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 410 + 423 @@ -4456,7 +4440,7 @@ 每月 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 94 + 95 @@ -4464,7 +4448,7 @@ 每年 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 95 + 96 @@ -4608,7 +4592,7 @@ Hourly apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 214 + 216 @@ -4760,11 +4744,11 @@ 无法保存资产概况 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 655 + 675 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 658 + 678 @@ -4928,18 +4912,6 @@ 44 - - per month - 每月 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 95 - - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 173 - - Ghostfolio vs comparison table Ghostfolio vs比较表 @@ -4980,6 +4952,14 @@ 108 + + Coupon has been created + Coupon has been created + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 224 + + Available in 可用于 @@ -5273,7 +5253,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 436 + 434 @@ -5285,7 +5265,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 449 + 447 @@ -5301,7 +5281,7 @@ 克隆 libs/ui/src/lib/activities-table/activities-table.component.html - 494 + 492 @@ -5309,7 +5289,7 @@ 将汇票导出为 ICS libs/ui/src/lib/activities-table/activities-table.component.html - 504 + 502 @@ -5317,7 +5297,7 @@ 您确实要删除此活动吗? libs/ui/src/lib/activities-table/activities-table.component.ts - 329 + 327 @@ -5356,14 +5336,6 @@ 76 - - , - , - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 146 - - Last All Time High 上次历史最高纪录 @@ -5401,7 +5373,7 @@ {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} apps/client/src/app/components/admin-market-data/admin-market-data.html - 277 + 275 @@ -5449,7 +5421,7 @@ 预计总额 libs/ui/src/lib/fire-calculator/fire-calculator.component.html - 66 + 62 @@ -5465,7 +5437,7 @@ libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 420 + 433 libs/ui/src/lib/i18n.ts @@ -5477,7 +5449,7 @@ 储蓄 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 430 + 443 @@ -5525,7 +5497,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 337 + 335 libs/ui/src/lib/i18n.ts @@ -5549,15 +5521,15 @@ 资产类别 apps/client/src/app/components/admin-market-data/admin-market-data.html - 118 + 116 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 240 + 253 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 336 + 349 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5581,15 +5553,15 @@ 资产子类别 apps/client/src/app/components/admin-market-data/admin-market-data.html - 136 + 134 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 249 + 262 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 352 + 365 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5705,7 +5677,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 449 + 460 @@ -5729,7 +5701,7 @@ 暂无活动 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 147 + 145 @@ -5761,7 +5733,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 173 + 186 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -5845,7 +5817,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 263 + 261 libs/ui/src/lib/i18n.ts @@ -6121,15 +6093,15 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 462 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 465 + 476 libs/ui/src/lib/top-holdings/top-holdings.component.html - 186 + 181 @@ -6153,7 +6125,7 @@ 当前市场价格为 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 770 + 766 @@ -6161,7 +6133,7 @@ 测试 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 606 @@ -6261,11 +6233,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 84 + 85 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 100 + 101 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6325,7 +6297,7 @@ 本月至今 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 libs/ui/src/lib/assistant/assistant.component.ts @@ -6345,7 +6317,7 @@ 本周至今 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 220 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -6393,7 +6365,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 236 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6413,7 +6385,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 236 + 240 libs/ui/src/lib/assistant/assistant.component.ts @@ -6458,7 +6430,7 @@ 数据收集 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 616 + 629 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6498,7 +6470,7 @@ Daily apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 210 + 212 @@ -6682,7 +6654,7 @@ 包含在 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 399 @@ -6698,7 +6670,7 @@ 显示更多 libs/ui/src/lib/top-holdings/top-holdings.component.html - 179 + 174 @@ -6706,7 +6678,7 @@ 基准 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 125 @@ -6918,7 +6890,7 @@ 查看持仓 libs/ui/src/lib/activities-table/activities-table.component.html - 475 + 473 @@ -6934,7 +6906,7 @@ 错误 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 761 + 757 @@ -6978,7 +6950,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 621 + 634 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7030,7 +7002,7 @@ 关闭 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 623 + 636 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7182,11 +7154,11 @@ - has been copied to the clipboard - 已复制到剪贴板 + has been copied to the clipboard + 已复制到剪贴板 apps/client/src/app/components/admin-overview/admin-overview.component.ts - 395 + 223 libs/ui/src/lib/value/value.component.ts @@ -7249,14 +7221,6 @@ 207 - - , assuming a - , 假设一个 - - apps/client/src/app/pages/portfolio/fire/fire-page.html - 175 - - Financial Services Financial Services @@ -7290,7 +7254,7 @@ Delete apps/client/src/app/components/admin-market-data/admin-market-data.html - 272 + 270 @@ -7612,7 +7576,7 @@ 保存 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 632 + 645 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7712,7 +7676,7 @@ AI 提示已复制到剪贴板 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 217 + 218 @@ -7728,7 +7692,7 @@ 延迟 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7736,7 +7700,7 @@ 即时 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7744,7 +7708,7 @@ 默认市场价格 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 506 + 519 @@ -7752,7 +7716,15 @@ 模式 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 543 + 556 + + + + Do you really want to convert the data source to ? + Do you really want to convert the data source to ? + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 485 @@ -7760,7 +7732,7 @@ 选择器 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 559 + 572 @@ -7768,7 +7740,7 @@ HTTP 请求标头 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 532 @@ -7776,7 +7748,7 @@ 收盘 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 255 + 259 @@ -7784,7 +7756,7 @@ 实时 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 259 + 263 @@ -7792,7 +7764,7 @@ 打开 Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 218 + 219 @@ -7800,7 +7772,7 @@ 创建 libs/ui/src/lib/tags-selector/tags-selector.component.html - 66 + 64 @@ -7812,7 +7784,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 @@ -7844,11 +7816,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 391 + 414 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 404 + 427 @@ -7997,7 +7969,7 @@ () 已在使用中。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 702 + 718 @@ -8005,7 +7977,7 @@ 在更新到 () 时发生错误。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 710 + 721 @@ -8029,7 +8001,7 @@ 收集近期历史市场数据 apps/client/src/app/components/admin-market-data/admin-market-data.html - 253 + 251 @@ -8037,7 +8009,7 @@ 收集所有历史市场数据 apps/client/src/app/components/admin-market-data/admin-market-data.html - 258 + 256 @@ -8117,7 +8089,7 @@ 计算基于延迟的市场数据,可能无法实时显示。 apps/client/src/app/components/home-market/home-market.html - 45 + 28 apps/client/src/app/components/markets/markets.html @@ -8150,7 +8122,7 @@ 演示用户账户已同步。 apps/client/src/app/components/admin-overview/admin-overview.component.ts - 316 + 323 @@ -8372,7 +8344,7 @@ 当前月份 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 224 + 228 From 7bd6ca6d48a2b88d454218dc1497536708e38c57 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 23 Jul 2026 21:16:33 +0200 Subject: [PATCH 47/54] Task/improve language localization (20260723) (#7404) Update translations --- apps/client/src/locales/messages.ca.xlf | 2 +- apps/client/src/locales/messages.de.xlf | 14 +++++++------- apps/client/src/locales/messages.es.xlf | 2 +- apps/client/src/locales/messages.fr.xlf | 2 +- apps/client/src/locales/messages.it.xlf | 2 +- apps/client/src/locales/messages.ja.xlf | 2 +- apps/client/src/locales/messages.ko.xlf | 2 +- apps/client/src/locales/messages.nl.xlf | 2 +- apps/client/src/locales/messages.pl.xlf | 2 +- apps/client/src/locales/messages.pt.xlf | 2 +- apps/client/src/locales/messages.tr.xlf | 2 +- apps/client/src/locales/messages.uk.xlf | 2 +- apps/client/src/locales/messages.zh.xlf | 2 +- 13 files changed, 19 insertions(+), 19 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 9343aaf745..54138e98da 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -1112,7 +1112,7 @@ By , this is projected to increase to per year or per month, assuming a annual interest rate. - By , this is projected to increase to per year or per month, assuming a annual interest rate. + Per , es preveu que això augmenti fins a per any o per mes, assumint un tipus d'interès anual del . apps/client/src/app/pages/portfolio/fire/fire-page.html 132 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 9cda8237ba..771b49244e 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -2575,7 +2575,7 @@ By , this is projected to increase to per year or per month, assuming a annual interest rate. - By , this is projected to increase to per year or per month, assuming a annual interest rate. + Bis wird dies voraussichtlich auf pro Jahr oder pro Monat ansteigen, bei einem angenommenen jährlichen Zinssatz von . apps/client/src/app/pages/portfolio/fire/fire-page.html 132 @@ -3311,7 +3311,7 @@ Do you really want to convert this asset profile to ()? - Do you really want to convert this asset profile to ()? + Möchtest du dieses Anlageprofil wirklich in () umwandeln? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 723 @@ -4607,7 +4607,7 @@ Coupon has been created - Coupon has been created + Gutschein wurde erstellt apps/client/src/app/components/admin-overview/admin-overview.component.ts 224 @@ -4831,7 +4831,7 @@ An error occurred while converting the data source to . - An error occurred while converting the data source to . + Beim Umwandeln der Datenquelle in ist ein Fehler aufgetreten. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 482 @@ -5737,7 +5737,7 @@ Convert to - Convert to + In umwandeln apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 174 @@ -7178,7 +7178,7 @@ has been copied to the clipboard - wurde in die Zwischenablage kopiert + wurde in die Zwischenablage kopiert apps/client/src/app/components/admin-overview/admin-overview.component.ts 223 @@ -7744,7 +7744,7 @@ Do you really want to convert the data source to ? - Do you really want to convert the data source to ? + Möchtest du die Datenquelle wirklich in umwandeln? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 485 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 1711b8aa1f..575501ea2d 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -2608,7 +2608,7 @@ By , this is projected to increase to per year or per month, assuming a annual interest rate. - By , this is projected to increase to per year or per month, assuming a annual interest rate. + Para , se prevé que esto aumente a por año o por mes, asumiendo una tasa de interés anual del . apps/client/src/app/pages/portfolio/fire/fire-page.html 132 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 5282f74c9b..6f58b60789 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -675,7 +675,7 @@ By , this is projected to increase to per year or per month, assuming a annual interest rate. - By , this is projected to increase to per year or per month, assuming a annual interest rate. + D’ici , ce montant devrait atteindre par an ou par mois, en supposant un taux d’intérêt annuel de . apps/client/src/app/pages/portfolio/fire/fire-page.html 132 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index b6193cf4d4..ae53de51da 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -2608,7 +2608,7 @@ By , this is projected to increase to per year or per month, assuming a annual interest rate. - By , this is projected to increase to per year or per month, assuming a annual interest rate. + Entro , si prevede che aumenti a per anno oppure per mese, ipotizzando un tasso di interesse annuo del . apps/client/src/app/pages/portfolio/fire/fire-page.html 132 diff --git a/apps/client/src/locales/messages.ja.xlf b/apps/client/src/locales/messages.ja.xlf index bb7bfc08b2..833a580125 100644 --- a/apps/client/src/locales/messages.ja.xlf +++ b/apps/client/src/locales/messages.ja.xlf @@ -1013,7 +1013,7 @@ By , this is projected to increase to per year or per month, assuming a annual interest rate. - By , this is projected to increase to per year or per month, assuming a annual interest rate. + までに、これは年あたり、または月あたりに増加すると予測されます(年利と仮定)。 apps/client/src/app/pages/portfolio/fire/fire-page.html 132 diff --git a/apps/client/src/locales/messages.ko.xlf b/apps/client/src/locales/messages.ko.xlf index f97a1610be..cd896a6bb7 100644 --- a/apps/client/src/locales/messages.ko.xlf +++ b/apps/client/src/locales/messages.ko.xlf @@ -1013,7 +1013,7 @@ By , this is projected to increase to per year or per month, assuming a annual interest rate. - By , this is projected to increase to per year or per month, assuming a annual interest rate. + 까지 이 금액은 연간 또는 매월 (으)로 증가할 것으로 예상되며, 연이율 을(를) 가정합니다. apps/client/src/app/pages/portfolio/fire/fire-page.html 132 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index b649993b5b..e0cc6cdba1 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -2607,7 +2607,7 @@ By , this is projected to increase to per year or per month, assuming a annual interest rate. - By , this is projected to increase to per year or per month, assuming a annual interest rate. + Tegen zal dit naar verwachting stijgen naar per jaar of per maand, uitgaande van een jaarlijkse rente van . apps/client/src/app/pages/portfolio/fire/fire-page.html 132 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 62ec521012..1a7f4b8a93 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -980,7 +980,7 @@ By , this is projected to increase to per year or per month, assuming a annual interest rate. - By , this is projected to increase to per year or per month, assuming a annual interest rate. + Do ma to wzrosnąć do rocznie lub miesięcznie, przy założeniu rocznej stopy procentowej wynoszącej . apps/client/src/app/pages/portfolio/fire/fire-page.html 132 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index dcfbed3e0b..6dd486d978 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -1203,7 +1203,7 @@ By , this is projected to increase to per year or per month, assuming a annual interest rate. - By , this is projected to increase to per year or per month, assuming a annual interest rate. + Até , prevê-se que este valor aumente para por ano ou por mês, assumindo uma taxa de juro anual de . apps/client/src/app/pages/portfolio/fire/fire-page.html 132 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 11414702cf..fb754c0f4c 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -900,7 +900,7 @@ By , this is projected to increase to per year or per month, assuming a annual interest rate. - By , this is projected to increase to per year or per month, assuming a annual interest rate. + tarihine kadar bunun yıllık veya aylık değerine yükselmesi öngörülüyor; yıllık faiz oranı olarak varsayılmaktadır. apps/client/src/app/pages/portfolio/fire/fire-page.html 132 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index bf927affd3..34bd6b8aa6 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -1092,7 +1092,7 @@ By , this is projected to increase to per year or per month, assuming a annual interest rate. - By , this is projected to increase to per year or per month, assuming a annual interest rate. + До очікується, що це зросте до на рік або на місяць, за умови річної відсоткової ставки . apps/client/src/app/pages/portfolio/fire/fire-page.html 132 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 8ecedf0e58..6f4b8551a7 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -989,7 +989,7 @@ By , this is projected to increase to per year or per month, assuming a annual interest rate. - By , this is projected to increase to per year or per month, assuming a annual interest rate. + ,预计这将增长至每年或每月,假设年利率为 apps/client/src/app/pages/portfolio/fire/fire-page.html 132 From 7bfd4f6eff98ace18f74e64efba3084e445b1af9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 25 Jul 2026 10:00:49 +0200 Subject: [PATCH 48/54] Task/update locales (#7405) Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.ca.xlf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 54138e98da..2fe2c86227 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -1112,7 +1112,7 @@ By , this is projected to increase to per year or per month, assuming a annual interest rate. - Per , es preveu que això augmenti fins a per any o per mes, assumint un tipus d'interès anual del . + Per , es preveu que això augmenti fins a per any o per mes, assumint un tipus d'interès anual del . apps/client/src/app/pages/portfolio/fire/fire-page.html 132 From 697e6c0f77a4c9bcf34f0ce59ce00de050d66061 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 25 Jul 2026 10:01:46 +0200 Subject: [PATCH 49/54] Task/move support to create custom tags to general availability (#7410) * Move support to create custom tags from experimental to general availability * Update changelog --- CHANGELOG.md | 1 + .../holding-detail-dialog.component.ts | 7 ++++--- .../create-or-update-account-dialog.component.ts | 9 +++++---- .../create-or-update-activity-dialog.component.ts | 9 +++++---- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cdf6e47181..38883d40ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Moved the support to create custom tags from experimental to general availability - Recomputed the portfolio snapshot calculation in the background on a portfolio change - Improved the deduplication of the portfolio snapshot calculation jobs by considering the filters - Refactored the deprecated animation providers (`provideAnimations()` and `provideNoopAnimations()`) diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts index 944b1cb1d3..8263a4787c 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts @@ -581,9 +581,10 @@ export class GfHoldingDetailDialogComponent implements OnInit { if (state?.user) { this.user = state.user; - this.hasPermissionToCreateOwnTag = - hasPermission(this.user.permissions, permissions.createOwnTag) && - (this.user?.settings?.isExperimentalFeatures ?? false); + this.hasPermissionToCreateOwnTag = hasPermission( + this.user?.permissions, + permissions.createOwnTag + ); this.tagsAvailable = this.user?.tags?.map((tag) => { 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 d27b5ceae7..de0172eace 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 @@ -65,7 +65,7 @@ export class GfCreateOrUpdateAccountDialogComponent { protected accountForm: FormGroup; protected currencies: string[] = []; protected filteredPlatforms: Observable | undefined; - protected hasPermissionToCreateOwnTag: boolean | undefined; + protected hasPermissionToCreateOwnTag: boolean; protected platforms: Platform[] = []; protected tagsAvailable: Tag[] = []; @@ -82,9 +82,10 @@ export class GfCreateOrUpdateAccountDialogComponent { const { currencies } = this.dataService.fetchInfo(); this.currencies = currencies; - this.hasPermissionToCreateOwnTag = - this.data.user?.settings?.isExperimentalFeatures && - hasPermission(this.data.user?.permissions, permissions.createOwnTag); + this.hasPermissionToCreateOwnTag = hasPermission( + this.data.user?.permissions, + permissions.createOwnTag + ); this.tagsAvailable = [ ...(this.data.user?.tags ?? []), 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 10bc7ccc83..79e1e8983d 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 @@ -92,7 +92,7 @@ export class GfCreateOrUpdateActivityDialogComponent { protected currentMarketPrice: number | null = null; protected defaultDateFormat: string; protected defaultLookupItems: LookupItem[] = []; - protected hasPermissionToCreateOwnTag: boolean | undefined; + protected hasPermissionToCreateOwnTag: boolean; protected isLoading = false; protected readonly isToday = isToday; protected mode: 'create' | 'update'; @@ -120,9 +120,10 @@ export class GfCreateOrUpdateActivityDialogComponent { public ngOnInit() { this.currencyOfAssetProfile = this.data.activity?.assetProfile?.currency; - this.hasPermissionToCreateOwnTag = - this.data.user?.settings?.isExperimentalFeatures && - hasPermission(this.data.user?.permissions, permissions.createOwnTag); + this.hasPermissionToCreateOwnTag = hasPermission( + this.data.user?.permissions, + permissions.createOwnTag + ); this.locale = this.data.user.settings.locale ?? DEFAULT_LOCALE; this.mode = this.data.activity?.id ? 'update' : 'create'; From 469db5db6a24661938fa02a890e975db6c2b8560 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 25 Jul 2026 10:03:19 +0200 Subject: [PATCH 50/54] Release 3.33.0 (#7413) --- 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 38883d40ad..9c31cef39a 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 +## 3.33.0 - 2026-07-25 ### Added diff --git a/package-lock.json b/package-lock.json index 2e2445d49d..4b94ed39fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "3.32.0", + "version": "3.33.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "3.32.0", + "version": "3.33.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 2dd6deeb83..93e76af0bc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "3.32.0", + "version": "3.33.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From d6d8ed9c11627164eb215b5c88243d5a51d9ed63 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 25 Jul 2026 13:12:36 +0200 Subject: [PATCH 51/54] Task/upgrade fuse.js to version 7.5.0 (#7411) * Update fuse.js to version 7.5.0 * Update changelog --- CHANGELOG.md | 6 ++++++ package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c31cef39a..f9de4cb5a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Changed + +- Upgraded `fuse.js` from version `7.3.0` to `7.5.0` + ## 3.33.0 - 2026-07-25 ### Added diff --git a/package-lock.json b/package-lock.json index 4b94ed39fa..b70fcbbe52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -70,7 +70,7 @@ "dotenv-expand": "12.0.3", "envalid": "8.2.0", "fast-redact": "3.5.0", - "fuse.js": "7.3.0", + "fuse.js": "7.5.0", "google-spreadsheet": "3.2.0", "helmet": "8.2.0", "http-status-codes": "2.3.0", @@ -21313,9 +21313,9 @@ } }, "node_modules/fuse.js": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.3.0.tgz", - "integrity": "sha512-plz8RVjfcDedTGfVngWH1jmJvBvAwi1v2jecfDerbEnMcmOYUEEwKFTHbNoCiYyzaK2Ws8lABkTCcRSqCY1q4w==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.5.0.tgz", + "integrity": "sha512-sQtrEfA+ez/3G0cCZecF70oqpCRttCexYUG4mUrtWL49ULUzUyxokt5kyqwtKzj1270RaKih+hcP3qLcumccow==", "license": "Apache-2.0", "engines": { "node": ">=10" diff --git a/package.json b/package.json index 93e76af0bc..8013662854 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,7 @@ "dotenv-expand": "12.0.3", "envalid": "8.2.0", "fast-redact": "3.5.0", - "fuse.js": "7.3.0", + "fuse.js": "7.5.0", "google-spreadsheet": "3.2.0", "helmet": "8.2.0", "http-status-codes": "2.3.0", From b77f40a0ffcd8ea839d6e9bd0a10e59a1c032534 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 25 Jul 2026 13:56:27 +0200 Subject: [PATCH 52/54] Bugfix/update account balance of activity without account (#7402) * Fix update account balance of activity without account * Update changelog --- CHANGELOG.md | 4 ++ apps/api/src/app/account/account.service.ts | 21 ++++++-- .../src/app/activities/activities.service.ts | 2 +- ...ate-or-update-activity-dialog.component.ts | 54 +++++++++---------- 4 files changed, 49 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9de4cb5a8..109beacbbf 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 - Upgraded `fuse.js` from version `7.3.0` to `7.5.0` +### Fixed + +- Resolved an exception in the `POST api/v1/activities` endpoint when creating an activity with the update account balance option but without an account + ## 3.33.0 - 2026-07-25 ### Added diff --git a/apps/api/src/app/account/account.service.ts b/apps/api/src/app/account/account.service.ts index f84f085a35..2098062340 100644 --- a/apps/api/src/app/account/account.service.ts +++ b/apps/api/src/app/account/account.service.ts @@ -37,11 +37,26 @@ export class AccountService { public async account({ id_userId }: Prisma.AccountWhereUniqueInput): Promise { - const [account] = await this.accounts({ - where: id_userId + const account = await this.prismaService.account.findUnique({ + include: { + balances: { + orderBy: { date: 'desc' }, + take: 1 + } + }, + where: { id_userId } }); - return account; + if (!account) { + return null; + } + + const { balances, ...accountData } = account; + + return { + ...accountData, + balance: balances[0]?.value ?? 0 + }; } public async accountWithActivities( diff --git a/apps/api/src/app/activities/activities.service.ts b/apps/api/src/app/activities/activities.service.ts index 459293abdd..fbe93d9a07 100644 --- a/apps/api/src/app/activities/activities.service.ts +++ b/apps/api/src/app/activities/activities.service.ts @@ -275,7 +275,7 @@ export class ActivitiesService { include: { SymbolProfile: true } }); - if (updateAccountBalance === true) { + if (accountId && updateAccountBalance === true) { let amount = new Big(data.unitPrice).mul(data.quantity); if (['BUY', 'FEE'].includes(data.type)) { 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 79e1e8983d..632db1cd41 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 @@ -266,16 +266,9 @@ export class GfCreateOrUpdateActivityDialogComponent { 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(); - } else { - this.activityForm.get('updateAccountBalance')?.disable(); - this.activityForm.get('updateAccountBalance')?.setValue(false); - } - } } + + this.syncUpdateAccountBalanceControl(); }); this.activityForm @@ -299,12 +292,7 @@ export class GfCreateOrUpdateActivityDialogComponent { }); 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.syncUpdateAccountBalanceControl(); this.changeDetectorRef.markForCheck(); }); @@ -384,8 +372,6 @@ export class GfCreateOrUpdateActivityDialogComponent { .get('searchSymbol') ?.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 }) => { @@ -421,16 +407,6 @@ export class GfCreateOrUpdateActivityDialogComponent { if (type === 'FEE') { this.activityForm.get('unitPrice')?.setValue(0); } - - if ( - ['FEE', 'INTEREST'].includes(type) && - this.activityForm.get('accountId')?.value - ) { - this.activityForm.get('updateAccountBalance')?.enable(); - } else { - this.activityForm.get('updateAccountBalance')?.disable(); - this.activityForm.get('updateAccountBalance')?.setValue(false); - } } else { this.activityForm .get('dataSource') @@ -442,9 +418,10 @@ export class GfCreateOrUpdateActivityDialogComponent { .get('searchSymbol') ?.setValidators(Validators.required); this.activityForm.get('searchSymbol')?.updateValueAndValidity(); - this.activityForm.get('updateAccountBalance')?.enable(); } + this.syncUpdateAccountBalanceControl(); + this.changeDetectorRef.markForCheck(); }); @@ -559,6 +536,27 @@ export class GfCreateOrUpdateActivityDialogComponent { } } + private syncUpdateAccountBalanceControl() { + const accountBalanceControl = this.activityForm.get('updateAccountBalance'); + const accountId = this.activityForm.get('accountId')?.value; + const dataSource = this.activityForm.get('dataSource')?.value; + const date = this.activityForm.get('date')?.value; + const type = this.activityForm.get('type')?.value; + + const isEligible = + !!accountId && + isToday(date) && + !['LIABILITY', 'VALUABLE'].includes(type) && + !(dataSource === 'MANUAL' && type === 'BUY'); + + if (isEligible) { + accountBalanceControl?.enable(); + } else { + accountBalanceControl?.disable(); + accountBalanceControl?.setValue(false); + } + } + private updateAssetProfile() { this.isLoading = true; this.changeDetectorRef.markForCheck(); From 10c01ec630294d79ae1dcfb78197bebe8ce5a394 Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Sat, 25 Jul 2026 18:58:37 +0700 Subject: [PATCH 53/54] Task/improve type safety in access and account balance services (#7416) * fix(common): update Access interface and type definitions * fix(api): resolve type errors in access controller * feat(api): default to user currency in account balance service --- apps/api/src/app/access/access.controller.ts | 4 ++-- apps/api/src/app/account-balance/account-balance.service.ts | 2 +- libs/common/src/lib/interfaces/access.interface.ts | 2 +- libs/common/src/lib/types/access-with-grantee-user.type.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/api/src/app/access/access.controller.ts b/apps/api/src/app/access/access.controller.ts index d692f358df..3bad0e171e 100644 --- a/apps/api/src/app/access/access.controller.ts +++ b/apps/api/src/app/access/access.controller.ts @@ -78,7 +78,7 @@ export class AccessController { ): Promise { if ( this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && - this.request.user.subscription.type === SubscriptionType.Basic + this.request.user.subscription?.type === SubscriptionType.Basic ) { throw new HttpException( getReasonPhrase(StatusCodes.FORBIDDEN), @@ -134,7 +134,7 @@ export class AccessController { ): Promise { if ( this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && - this.request.user.subscription.type === SubscriptionType.Basic + this.request.user.subscription?.type === SubscriptionType.Basic ) { throw new HttpException( getReasonPhrase(StatusCodes.FORBIDDEN), diff --git a/apps/api/src/app/account-balance/account-balance.service.ts b/apps/api/src/app/account-balance/account-balance.service.ts index 656fc2f630..84932f4295 100644 --- a/apps/api/src/app/account-balance/account-balance.service.ts +++ b/apps/api/src/app/account-balance/account-balance.service.ts @@ -178,7 +178,7 @@ export class AccountBalanceService { accountId: balance.account.id, valueInBaseCurrency: this.exchangeRateDataService.toCurrency( balance.value, - balance.account.currency, + balance.account.currency ?? userCurrency, userCurrency ) }; diff --git a/libs/common/src/lib/interfaces/access.interface.ts b/libs/common/src/lib/interfaces/access.interface.ts index f3e74e7565..6b361d0b94 100644 --- a/libs/common/src/lib/interfaces/access.interface.ts +++ b/libs/common/src/lib/interfaces/access.interface.ts @@ -5,7 +5,7 @@ import { AccessPermission } from '@prisma/client'; import { AccessSettings } from './access-settings.interface'; export interface Access { - alias?: string; + alias: string | null; grantee?: string; id: string; permissions: AccessPermission[]; diff --git a/libs/common/src/lib/types/access-with-grantee-user.type.ts b/libs/common/src/lib/types/access-with-grantee-user.type.ts index 98551e0fdf..2fc2488eec 100644 --- a/libs/common/src/lib/types/access-with-grantee-user.type.ts +++ b/libs/common/src/lib/types/access-with-grantee-user.type.ts @@ -1,3 +1,3 @@ import { Access, User } from '@prisma/client'; -export type AccessWithGranteeUser = Access & { granteeUser?: User }; +export type AccessWithGranteeUser = Access & { granteeUser?: User | null }; From 7d338c2c6734f8b78b2482e49512712f44628397 Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Sat, 25 Jul 2026 19:01:15 +0700 Subject: [PATCH 54/54] Task/improve type safety across API services and controllers (#7417) * fix(api): resolve subscription undefined type errors * fix(api): resolve session metadata null type errors * feat(api): add type declaration on promises * fix(api): resolve price undefined type errors * fix(api): resolve type errors in benchmark service --- .../app/endpoints/public/public.controller.ts | 6 +++--- apps/api/src/app/import/import.controller.ts | 4 ++-- .../src/app/portfolio/portfolio.controller.ts | 10 +++++----- .../app/subscription/subscription.service.ts | 2 +- .../src/services/benchmark/benchmark.service.ts | 17 ++++++++--------- .../yahoo-finance/yahoo-finance.service.ts | 10 +++++----- .../data-provider/data-provider.service.ts | 8 ++++---- 7 files changed, 28 insertions(+), 29 deletions(-) diff --git a/apps/api/src/app/endpoints/public/public.controller.ts b/apps/api/src/app/endpoints/public/public.controller.ts index 9bd2a78a84..67bed71ef3 100644 --- a/apps/api/src/app/endpoints/public/public.controller.ts +++ b/apps/api/src/app/endpoints/public/public.controller.ts @@ -65,7 +65,7 @@ export class PublicController { }); if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { - hasDetails = user.subscription.type === SubscriptionType.Premium; + hasDetails = user?.subscription?.type === SubscriptionType.Premium; } const { filters } = (access.settings ?? {}) as AccessSettings; @@ -98,7 +98,7 @@ export class PublicController { sortDirection: 'desc', take: 10, types: [ActivityType.BUY, ActivityType.SELL], - userCurrency: user.settings?.settings.baseCurrency ?? DEFAULT_CURRENCY, + userCurrency: user?.settings?.settings.baseCurrency ?? DEFAULT_CURRENCY, userId: user.id, withExcludedAccountsAndActivities: false }); @@ -167,7 +167,7 @@ export class PublicController { this.exchangeRateDataService.toCurrency( quantity * marketPrice, assetProfile.currency, - user.settings?.settings.baseCurrency ?? DEFAULT_CURRENCY + user?.settings?.settings.baseCurrency ?? DEFAULT_CURRENCY ) ); }) diff --git a/apps/api/src/app/import/import.controller.ts b/apps/api/src/app/import/import.controller.ts index c3e79a29f9..c2d53e3cb3 100644 --- a/apps/api/src/app/import/import.controller.ts +++ b/apps/api/src/app/import/import.controller.ts @@ -65,7 +65,7 @@ export class ImportController { if ( this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && - this.request.user.subscription.type === SubscriptionType.Premium + this.request.user.subscription?.type === SubscriptionType.Premium ) { maxActivitiesToImport = Number.MAX_SAFE_INTEGER; } @@ -109,7 +109,7 @@ export class ImportController { if ( this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && - this.request.user.subscription.type === SubscriptionType.Premium + this.request.user.subscription?.type === SubscriptionType.Premium ) { maxActivitiesToImport = Number.MAX_SAFE_INTEGER; } diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index 13cc0eae7c..175532cadc 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -97,7 +97,7 @@ export class PortfolioController { if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { hasDetails = - this.request.user.subscription.type === SubscriptionType.Premium; + this.request.user.subscription?.type === SubscriptionType.Premium; } const filters = this.apiService.buildFiltersFromQueryParams({ @@ -383,7 +383,7 @@ export class PortfolioController { if ( this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && - this.request.user.subscription.type === SubscriptionType.Basic + this.request.user.subscription?.type === SubscriptionType.Basic ) { dividends = dividends.map((item) => { return nullifyValuesInObject(item, ['investment']); @@ -511,7 +511,7 @@ export class PortfolioController { if ( this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && - this.request.user.subscription.type === SubscriptionType.Basic + this.request.user.subscription?.type === SubscriptionType.Basic ) { investments = investments.map((item) => { return nullifyValuesInObject(item, ['investment']); @@ -623,7 +623,7 @@ export class PortfolioController { if ( this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && - this.request.user.subscription.type === SubscriptionType.Basic + this.request.user.subscription?.type === SubscriptionType.Basic ) { performanceInformation.chart = performanceInformation.chart.map( (item) => { @@ -651,7 +651,7 @@ export class PortfolioController { if ( this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && - this.request.user.subscription.type === SubscriptionType.Basic + this.request.user.subscription?.type === SubscriptionType.Basic ) { for (const category of report.xRay.categories) { category.rules = null; diff --git a/apps/api/src/app/subscription/subscription.service.ts b/apps/api/src/app/subscription/subscription.service.ts index 83aee7c8e7..1dba93d472 100644 --- a/apps/api/src/app/subscription/subscription.service.ts +++ b/apps/api/src/app/subscription/subscription.service.ts @@ -149,7 +149,7 @@ export class SubscriptionService { } const subscriptionOffer: SubscriptionOffer = JSON.parse( - session.metadata.subscriptionOffer ?? '{}' + session.metadata?.subscriptionOffer ?? '{}' ); const durationExtension = subscriptionOffer?.durationExtension; diff --git a/apps/api/src/services/benchmark/benchmark.service.ts b/apps/api/src/services/benchmark/benchmark.service.ts index affb0da08f..17e729f9f4 100644 --- a/apps/api/src/services/benchmark/benchmark.service.ts +++ b/apps/api/src/services/benchmark/benchmark.service.ts @@ -18,7 +18,6 @@ import { BenchmarkProperty, BenchmarkResponse } from '@ghostfolio/common/interfaces'; -import { BenchmarkTrend } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; import { SymbolProfile } from '@prisma/client'; @@ -146,7 +145,7 @@ export class BenchmarkService { public async addBenchmark({ dataSource, symbol - }: AssetProfileIdentifier): Promise> { + }: AssetProfileIdentifier): Promise | undefined> { const assetProfile = await this.prismaService.symbolProfile.findFirst({ where: { dataSource, @@ -183,7 +182,7 @@ export class BenchmarkService { public async deleteBenchmark({ dataSource, symbol - }: AssetProfileIdentifier): Promise> { + }: AssetProfileIdentifier): Promise | null> { const assetProfile = await this.prismaService.symbolProfile.findFirst({ where: { dataSource, @@ -240,12 +239,12 @@ export class BenchmarkService { enableSharing }); - const promisesAllTimeHighs: Promise<{ date: Date; marketPrice: number }>[] = - []; - const promisesBenchmarkTrends: Promise<{ - trend50d: BenchmarkTrend; - trend200d: BenchmarkTrend; - }>[] = []; + const promisesAllTimeHighs: ReturnType< + typeof this.marketDataService.getMax + >[] = []; + const promisesBenchmarkTrends: ReturnType< + typeof this.getBenchmarkTrends + >[] = []; const quotes = await this.dataProviderService.getQuotes({ items: benchmarkAssetProfiles.map(({ dataSource, symbol }) => { diff --git a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts index 85ec6c020e..749f10c127 100644 --- a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts +++ b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts @@ -200,13 +200,13 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { response.assetClass = assetClass; response.assetSubClass = assetSubClass; - response.currency = assetProfile.price.currency; + response.currency = assetProfile.price?.currency; response.dataSource = this.getName(); response.name = this.formatName({ - longName: assetProfile.price.longName, - quoteType: assetProfile.price.quoteType, - shortName: assetProfile.price.shortName, - symbol: assetProfile.price.symbol + longName: assetProfile.price?.longName, + quoteType: assetProfile.price?.quoteType, + shortName: assetProfile.price?.shortName, + symbol: assetProfile.price?.symbol }); response.symbol = this.convertFromYahooFinanceSymbol( assetProfile.price.symbol 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 49f5f68f44..e8d5f5030b 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -99,7 +99,7 @@ export class DataProviderService implements OnModuleInit { return dataSource; }); - const promises = []; + const promises: Promise[] = []; for (const [dataSource, assetProfileIdentifiers] of Object.entries( itemsGroupedByDataSource @@ -248,7 +248,7 @@ export class DataProviderService implements OnModuleInit { if ( this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && - user.subscription.type === SubscriptionType.Basic + user.subscription?.type === SubscriptionType.Basic ) { const dataProvider = this.getDataProvider(DataSource[dataSource]); @@ -660,7 +660,7 @@ export class DataProviderService implements OnModuleInit { } else if ( dataProvider.getDataProviderInfo().isPremium && this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && - user?.subscription.type === SubscriptionType.Basic + user?.subscription?.type === SubscriptionType.Basic ) { // Skip symbols of Premium data providers for users without subscription return false; @@ -876,7 +876,7 @@ export class DataProviderService implements OnModuleInit { }) .map((lookupItem) => { if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { - if (user.subscription.type === SubscriptionType.Premium) { + if (user.subscription?.type === SubscriptionType.Premium) { lookupItem.dataProviderInfo.isPremium = false; }