-
+
Name
@@ -102,7 +114,12 @@
-
+
Asset Profiles
@@ -193,13 +210,13 @@
diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.ts b/apps/client/src/app/components/admin-settings/admin-settings.component.ts
index 446221058..d030abb82 100644
--- a/apps/client/src/app/components/admin-settings/admin-settings.component.ts
+++ b/apps/client/src/app/components/admin-settings/admin-settings.component.ts
@@ -22,20 +22,24 @@ import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
- OnDestroy,
- OnInit
+ DestroyRef,
+ OnInit,
+ ViewChild
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { MatMenuModule } from '@angular/material/menu';
import { MatProgressBarModule } from '@angular/material/progress-bar';
+import { MatSort, MatSortModule } from '@angular/material/sort';
import { MatTableDataSource, MatTableModule } from '@angular/material/table';
import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { ellipsisHorizontal, trashOutline } from 'ionicons/icons';
+import { get } from 'lodash';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
-import { catchError, filter, of, Subject, takeUntil } from 'rxjs';
+import { catchError, filter, of } from 'rxjs';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
@@ -52,6 +56,7 @@ import { catchError, filter, of, Subject, takeUntil } from 'rxjs';
MatCardModule,
MatMenuModule,
MatProgressBarModule,
+ MatSortModule,
MatTableModule,
NgxSkeletonLoaderModule,
RouterModule
@@ -60,7 +65,9 @@ import { catchError, filter, of, Subject, takeUntil } from 'rxjs';
styleUrls: ['./admin-settings.component.scss'],
templateUrl: './admin-settings.component.html'
})
-export class GfAdminSettingsComponent implements OnDestroy, OnInit {
+export class GfAdminSettingsComponent implements OnInit {
+ @ViewChild(MatSort) sort: MatSort;
+
public dataSource = new MatTableDataSource();
public defaultDateFormat: string;
public displayedColumns = [
@@ -74,14 +81,13 @@ export class GfAdminSettingsComponent implements OnDestroy, OnInit {
public isGhostfolioApiKeyValid: boolean;
public isLoading = false;
public pricingUrl: string;
-
- private unsubscribeSubject = new Subject();
- private user: User;
+ public user: User;
public constructor(
private adminService: AdminService,
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private notificationService: NotificationService,
private userService: UserService
) {
@@ -90,7 +96,7 @@ export class GfAdminSettingsComponent implements OnDestroy, OnInit {
public ngOnInit() {
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -147,11 +153,6 @@ export class GfAdminSettingsComponent implements OnDestroy, OnInit {
});
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private initialize() {
this.isLoading = true;
@@ -159,13 +160,15 @@ export class GfAdminSettingsComponent implements OnDestroy, OnInit {
this.adminService
.fetchAdminData()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ dataProviders, settings }) => {
const filteredProviders = dataProviders.filter(({ dataSource }) => {
return dataSource !== 'MANUAL';
});
this.dataSource = new MatTableDataSource(filteredProviders);
+ this.dataSource.sort = this.sort;
+ this.dataSource.sortingDataAccessor = get;
const ghostfolioApiKey = settings[
PROPERTY_API_KEY_GHOSTFOLIO
@@ -185,7 +188,7 @@ export class GfAdminSettingsComponent implements OnDestroy, OnInit {
filter((status) => {
return status !== null;
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
)
.subscribe((status) => {
this.ghostfolioApiStatus = status;
diff --git a/apps/client/src/app/components/admin-tag/admin-tag.component.html b/apps/client/src/app/components/admin-tag/admin-tag.component.html
index 98919abd8..463a817ff 100644
--- a/apps/client/src/app/components/admin-tag/admin-tag.component.html
+++ b/apps/client/src/app/components/admin-tag/admin-tag.component.html
@@ -45,7 +45,11 @@
Activities
- {{ element.activityCount }}
+
diff --git a/apps/client/src/app/components/admin-tag/admin-tag.component.ts b/apps/client/src/app/components/admin-tag/admin-tag.component.ts
index ca7950291..506736156 100644
--- a/apps/client/src/app/components/admin-tag/admin-tag.component.ts
+++ b/apps/client/src/app/components/admin-tag/admin-tag.component.ts
@@ -1,17 +1,21 @@
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { CreateTagDto, UpdateTagDto } from '@ghostfolio/common/dtos';
import { ConfirmationDialogType } from '@ghostfolio/common/enums';
+import { getLocale } from '@ghostfolio/common/helper';
import { NotificationService } from '@ghostfolio/ui/notifications';
import { DataService } from '@ghostfolio/ui/services';
+import { GfValueComponent } from '@ghostfolio/ui/value';
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
- OnDestroy,
+ DestroyRef,
+ Input,
OnInit,
ViewChild
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MatDialog } from '@angular/material/dialog';
import { MatMenuModule } from '@angular/material/menu';
@@ -28,7 +32,6 @@ import {
} from 'ionicons/icons';
import { get } from 'lodash';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject, takeUntil } from 'rxjs';
import { GfCreateOrUpdateTagDialogComponent } from './create-or-update-tag-dialog/create-or-update-tag-dialog.component';
import { CreateOrUpdateTagDialogParams } from './create-or-update-tag-dialog/interfaces/interfaces';
@@ -36,6 +39,7 @@ import { CreateOrUpdateTagDialogParams } from './create-or-update-tag-dialog/int
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [
+ GfValueComponent,
IonIcon,
MatButtonModule,
MatMenuModule,
@@ -47,7 +51,9 @@ import { CreateOrUpdateTagDialogParams } from './create-or-update-tag-dialog/int
styleUrls: ['./admin-tag.component.scss'],
templateUrl: './admin-tag.component.html'
})
-export class GfAdminTagComponent implements OnDestroy, OnInit {
+export class GfAdminTagComponent implements OnInit {
+ @Input() locale = getLocale();
+
@ViewChild(MatSort) sort: MatSort;
public dataSource = new MatTableDataSource();
@@ -55,11 +61,10 @@ export class GfAdminTagComponent implements OnDestroy, OnInit {
public displayedColumns = ['name', 'userId', 'activities', 'actions'];
public tags: Tag[];
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private dialog: MatDialog,
private notificationService: NotificationService,
@@ -68,7 +73,7 @@ export class GfAdminTagComponent implements OnDestroy, OnInit {
private userService: UserService
) {
this.route.queryParams
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((params) => {
if (params['createTagDialog']) {
this.openCreateTagDialog();
@@ -110,20 +115,15 @@ export class GfAdminTagComponent implements OnDestroy, OnInit {
});
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private deleteTag(aId: string) {
this.dataService
.deleteTag(aId)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe({
next: () => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe();
this.fetchTags();
@@ -134,7 +134,7 @@ export class GfAdminTagComponent implements OnDestroy, OnInit {
private fetchTags() {
this.dataService
.fetchTags()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((tags) => {
this.tags = tags;
@@ -165,17 +165,17 @@ export class GfAdminTagComponent implements OnDestroy, OnInit {
dialogRef
.afterClosed()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((tag: CreateTagDto | null) => {
if (tag) {
this.dataService
.postTag(tag)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe({
next: () => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe();
this.fetchTags();
@@ -204,17 +204,17 @@ export class GfAdminTagComponent implements OnDestroy, OnInit {
dialogRef
.afterClosed()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((tag: UpdateTagDto | null) => {
if (tag) {
this.dataService
.putTag(tag)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe({
next: () => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe();
this.fetchTags();
diff --git a/apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.component.ts b/apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.component.ts
index 323609a48..e22c73478 100644
--- a/apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.component.ts
+++ b/apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.component.ts
@@ -1,12 +1,7 @@
import { CreateTagDto, UpdateTagDto } from '@ghostfolio/common/dtos';
import { validateObjectForForm } from '@ghostfolio/common/utils';
-import {
- ChangeDetectionStrategy,
- Component,
- Inject,
- OnDestroy
-} from '@angular/core';
+import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
import {
FormBuilder,
FormGroup,
@@ -21,7 +16,6 @@ import {
} from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
-import { Subject } from 'rxjs';
import { CreateOrUpdateTagDialogParams } from './interfaces/interfaces';
@@ -40,11 +34,9 @@ import { CreateOrUpdateTagDialogParams } from './interfaces/interfaces';
styleUrls: ['./create-or-update-tag-dialog.scss'],
templateUrl: 'create-or-update-tag-dialog.html'
})
-export class GfCreateOrUpdateTagDialogComponent implements OnDestroy {
+export class GfCreateOrUpdateTagDialogComponent {
public tagForm: FormGroup;
- private unsubscribeSubject = new Subject();
-
public constructor(
@Inject(MAT_DIALOG_DATA) public data: CreateOrUpdateTagDialogParams,
public dialogRef: MatDialogRef,
@@ -85,9 +77,4 @@ export class GfCreateOrUpdateTagDialogComponent implements OnDestroy {
console.error(error);
}
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/components/admin-users/admin-users.component.ts b/apps/client/src/app/components/admin-users/admin-users.component.ts
index d479f2037..3b57ba1c8 100644
--- a/apps/client/src/app/components/admin-users/admin-users.component.ts
+++ b/apps/client/src/app/components/admin-users/admin-users.component.ts
@@ -1,7 +1,6 @@
import { UserDetailDialogParams } from '@ghostfolio/client/components/user-detail-dialog/interfaces/interfaces';
import { GfUserDetailDialogComponent } from '@ghostfolio/client/components/user-detail-dialog/user-detail-dialog.component';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
-import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config';
import { ConfirmationDialogType } from '@ghostfolio/common/enums';
@@ -26,10 +25,11 @@ import { CommonModule } from '@angular/common';
import {
ChangeDetectorRef,
Component,
- OnDestroy,
+ DestroyRef,
OnInit,
ViewChild
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MatDialog } from '@angular/material/dialog';
import { MatMenuModule } from '@angular/material/menu';
@@ -56,8 +56,7 @@ import {
} from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
-import { Subject } from 'rxjs';
-import { switchMap, takeUntil, tap } from 'rxjs/operators';
+import { switchMap, tap } from 'rxjs/operators';
@Component({
imports: [
@@ -76,7 +75,7 @@ import { switchMap, takeUntil, tap } from 'rxjs/operators';
styleUrls: ['./admin-users.scss'],
templateUrl: './admin-users.html'
})
-export class GfAdminUsersComponent implements OnDestroy, OnInit {
+export class GfAdminUsersComponent implements OnInit {
@ViewChild(MatPaginator) paginator: MatPaginator;
public dataSource = new MatTableDataSource();
@@ -90,23 +89,21 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit {
public isLoading = false;
public pageSize = DEFAULT_PAGE_SIZE;
public routerLinkAdminControlUsers =
- internalRoutes.adminControl.subRoutes.users.routerLink;
+ internalRoutes.adminControl.subRoutes?.users.routerLink;
public totalItems = 0;
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private adminService: AdminService,
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private dialog: MatDialog,
private impersonationStorageService: ImpersonationStorageService,
private notificationService: NotificationService,
private route: ActivatedRoute,
private router: Router,
- private tokenStorageService: TokenStorageService,
private userService: UserService
) {
this.deviceType = this.deviceService.getDeviceInfo().deviceType;
@@ -141,7 +138,7 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit {
this.userService.stateChanged
.pipe(
- takeUntil(this.unsubscribeSubject),
+ takeUntilDestroyed(this.destroyRef),
tap((state) => {
if (state?.user) {
this.user = state.user;
@@ -206,7 +203,7 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit {
confirmFn: () => {
this.dataService
.deleteUser(aId)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.router.navigate(['..'], { relativeTo: this.route });
});
@@ -224,13 +221,12 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit {
confirmFn: () => {
this.dataService
.updateUserAccessToken(aUserId)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ accessToken }) => {
this.notificationService.alert({
discardFn: () => {
if (aUserId === this.user.id) {
- this.tokenStorageService.signOut();
- this.userService.remove();
+ this.userService.signOut();
document.location.href = `/${document.documentElement.lang}`;
}
@@ -261,11 +257,6 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit {
);
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private fetchUsers({ pageIndex }: { pageIndex: number } = { pageIndex: 0 }) {
this.isLoading = true;
@@ -278,7 +269,7 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit {
skip: pageIndex * this.pageSize,
take: this.pageSize
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ count, users }) => {
this.dataSource = new MatTableDataSource(users);
this.totalItems = count;
@@ -308,7 +299,7 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit {
dialogRef
.afterClosed()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((data) => {
if (data?.action === 'delete' && data?.userId) {
this.onDeleteUser(data.userId);
diff --git a/apps/client/src/app/components/data-provider-status/data-provider-status.component.ts b/apps/client/src/app/components/data-provider-status/data-provider-status.component.ts
index e44e81be9..a77d65961 100644
--- a/apps/client/src/app/components/data-provider-status/data-provider-status.component.ts
+++ b/apps/client/src/app/components/data-provider-status/data-provider-status.component.ts
@@ -4,13 +4,14 @@ import { CommonModule } from '@angular/common';
import {
ChangeDetectionStrategy,
Component,
+ DestroyRef,
Input,
- OnDestroy,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import type { DataSource } from '@prisma/client';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
-import { catchError, map, type Observable, of, Subject, takeUntil } from 'rxjs';
+import { catchError, map, type Observable, of } from 'rxjs';
import { DataProviderStatus } from './interfaces/interfaces';
@@ -20,14 +21,15 @@ import { DataProviderStatus } from './interfaces/interfaces';
selector: 'gf-data-provider-status',
templateUrl: './data-provider-status.component.html'
})
-export class GfDataProviderStatusComponent implements OnDestroy, OnInit {
+export class GfDataProviderStatusComponent implements OnInit {
@Input() dataSource: DataSource;
public status$: Observable;
- private unsubscribeSubject = new Subject();
-
- public constructor(private dataService: DataService) {}
+ public constructor(
+ private dataService: DataService,
+ private destroyRef: DestroyRef
+ ) {}
public ngOnInit() {
this.status$ = this.dataService
@@ -39,12 +41,7 @@ export class GfDataProviderStatusComponent implements OnDestroy, OnInit {
catchError(() => {
return of({ isHealthy: false });
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
);
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/components/footer/footer.component.ts b/apps/client/src/app/components/footer/footer.component.ts
index 48f010565..d06e711b9 100644
--- a/apps/client/src/app/components/footer/footer.component.ts
+++ b/apps/client/src/app/components/footer/footer.component.ts
@@ -33,13 +33,13 @@ export class GfFooterComponent implements OnChanges {
public hasPermissionToAccessFearAndGreedIndex: boolean;
public routerLinkAbout = publicRoutes.about.routerLink;
public routerLinkAboutChangelog =
- publicRoutes.about.subRoutes.changelog.routerLink;
+ publicRoutes.about.subRoutes?.changelog.routerLink;
public routerLinkAboutLicense =
- publicRoutes.about.subRoutes.license.routerLink;
+ publicRoutes.about.subRoutes?.license.routerLink;
public routerLinkAboutPrivacyPolicy =
- publicRoutes.about.subRoutes.privacyPolicy.routerLink;
+ publicRoutes.about.subRoutes?.privacyPolicy.routerLink;
public routerLinkAboutTermsOfService =
- publicRoutes.about.subRoutes.termsOfService.routerLink;
+ publicRoutes.about.subRoutes?.termsOfService.routerLink;
public routerLinkBlog = publicRoutes.blog.routerLink;
public routerLinkFaq = publicRoutes.faq.routerLink;
public routerLinkFeatures = publicRoutes.features.routerLink;
diff --git a/apps/client/src/app/components/header/header.component.ts b/apps/client/src/app/components/header/header.component.ts
index 9b003a590..ab329251f 100644
--- a/apps/client/src/app/components/header/header.component.ts
+++ b/apps/client/src/app/components/header/header.component.ts
@@ -24,6 +24,7 @@ import {
ChangeDetectionStrategy,
Component,
CUSTOM_ELEMENTS_SCHEMA,
+ DestroyRef,
EventEmitter,
HostListener,
Input,
@@ -31,6 +32,7 @@ import {
Output,
ViewChild
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatBadgeModule } from '@angular/material/badge';
import { MatButtonModule } from '@angular/material/button';
import { MatDialog } from '@angular/material/dialog';
@@ -48,8 +50,8 @@ import {
radioButtonOffOutline,
radioButtonOnOutline
} from 'ionicons/icons';
-import { EMPTY, Subject } from 'rxjs';
-import { catchError, takeUntil } from 'rxjs/operators';
+import { EMPTY } from 'rxjs';
+import { catchError } from 'rxjs/operators';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
@@ -131,10 +133,9 @@ export class GfHeaderComponent implements OnChanges {
public routerLinkRegister = publicRoutes.register.routerLink;
public routerLinkResources = publicRoutes.resources.routerLink;
- private unsubscribeSubject = new Subject();
-
public constructor(
private dataService: DataService,
+ private destroyRef: DestroyRef,
private dialog: MatDialog,
private impersonationStorageService: ImpersonationStorageService,
private layoutService: LayoutService,
@@ -146,7 +147,7 @@ export class GfHeaderComponent implements OnChanges {
) {
this.impersonationStorageService
.onChangeHasImpersonation()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((impersonationId) => {
this.hasImpersonationId = !!impersonationId;
this.impersonationId = impersonationId;
@@ -224,11 +225,11 @@ export class GfHeaderComponent implements OnChanges {
public onDateRangeChange(dateRange: DateRange) {
this.dataService
.putUserSetting({ dateRange })
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe();
});
}
@@ -252,11 +253,11 @@ export class GfHeaderComponent implements OnChanges {
this.dataService
.putUserSetting(userSetting)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe();
});
}
@@ -301,7 +302,7 @@ export class GfHeaderComponent implements OnChanges {
dialogRef
.afterClosed()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((data) => {
if (data?.accessToken) {
this.dataService
@@ -314,7 +315,7 @@ export class GfHeaderComponent implements OnChanges {
return EMPTY;
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
)
.subscribe(({ authToken }) => {
this.setToken(authToken);
@@ -331,7 +332,7 @@ export class GfHeaderComponent implements OnChanges {
this.userService
.get()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((user) => {
const userLanguage = user?.settings?.language;
@@ -342,9 +343,4 @@ export class GfHeaderComponent implements OnChanges {
}
});
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
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 427386796..13ded73eb 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
@@ -35,10 +35,11 @@ import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
+ DestroyRef,
Inject,
- OnDestroy,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatChipsModule } from '@angular/material/chips';
@@ -67,8 +68,7 @@ import {
walletOutline
} from 'ionicons/icons';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
-import { Subject } from 'rxjs';
-import { switchMap, takeUntil } from 'rxjs/operators';
+import { switchMap } from 'rxjs/operators';
import { HoldingDetailDialogParams } from './interfaces/interfaces';
@@ -102,7 +102,7 @@ import { HoldingDetailDialogParams } from './interfaces/interfaces';
styleUrls: ['./holding-detail-dialog.component.scss'],
templateUrl: 'holding-detail-dialog.html'
})
-export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
+export class GfHoldingDetailDialogComponent implements OnInit {
public activitiesCount: number;
public accounts: Account[];
public assetClass: string;
@@ -158,11 +158,10 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
public user: User;
public value: number;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
public dialogRef: MatDialogRef,
@Inject(MAT_DIALOG_DATA) public data: HoldingDetailDialogParams,
private formBuilder: FormBuilder,
@@ -192,7 +191,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
this.holdingForm
.get('tags')
- .valueChanges.pipe(takeUntil(this.unsubscribeSubject))
+ .valueChanges.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((tags: Tag[]) => {
const newTag = tags.find(({ id }) => {
return id === undefined;
@@ -217,7 +216,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
switchMap(() => {
return this.userService.get(true);
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
)
.subscribe();
} else {
@@ -227,7 +226,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
dataSource: this.data.dataSource,
symbol: this.data.symbol
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe();
}
});
@@ -236,7 +235,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
.fetchAccounts({
filters
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ accounts }) => {
this.accounts = accounts;
@@ -249,7 +248,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
sortColumn: this.sortColumn,
sortDirection: this.sortDirection
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ activities }) => {
this.dataSource = new MatTableDataSource(activities);
@@ -261,7 +260,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
dataSource: this.data.dataSource,
symbol: this.data.symbol
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(
({
activitiesCount,
@@ -524,7 +523,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
);
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -581,8 +580,8 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
};
this.dataService
- .postOrder(activity)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .postActivity(activity)
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.router.navigate(
internalRoutes.portfolio.subRoutes.activities.routerLink
@@ -599,7 +598,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
this.dataService
.fetchExport({ activityIds })
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((data) => {
downloadAsFile({
content: data,
@@ -629,18 +628,13 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
this.dialogRef.close();
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private fetchMarketData() {
this.dataService
.fetchMarketDataBySymbol({
dataSource: this.data.dataSource,
symbol: this.data.symbol
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ marketData }) => {
this.marketDataItems = marketData;
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 86f4676f3..b8cb8dda2 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
@@ -310,6 +310,9 @@
Symbol
ISIN
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 aab854384..527b13636 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
@@ -11,7 +11,7 @@ export interface HoldingDetailDialogParams {
hasPermissionToAccessAdminControl: boolean;
hasPermissionToCreateActivity: boolean;
hasPermissionToReportDataGlitch: boolean;
- hasPermissionToUpdateOrder: boolean;
+ hasPermissionToUpdateActivity: boolean;
locale: string;
symbol: string;
}
diff --git a/apps/client/src/app/components/home-holdings/home-holdings.component.ts b/apps/client/src/app/components/home-holdings/home-holdings.component.ts
index dc444977d..19a48ccd8 100644
--- a/apps/client/src/app/components/home-holdings/home-holdings.component.ts
+++ b/apps/client/src/app/components/home-holdings/home-holdings.component.ts
@@ -19,9 +19,10 @@ import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
- OnDestroy,
+ DestroyRef,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatButtonToggleModule } from '@angular/material/button-toggle';
@@ -30,8 +31,6 @@ import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { gridOutline, reorderFourOutline } from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
@Component({
imports: [
@@ -51,7 +50,7 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./home-holdings.scss'],
templateUrl: './home-holdings.html'
})
-export class GfHomeHoldingsComponent implements OnDestroy, OnInit {
+export class GfHomeHoldingsComponent implements OnInit {
public static DEFAULT_HOLDINGS_VIEW_MODE: HoldingsViewMode = 'TABLE';
public deviceType: string;
@@ -71,11 +70,10 @@ export class GfHomeHoldingsComponent implements OnDestroy, OnInit {
GfHomeHoldingsComponent.DEFAULT_HOLDINGS_VIEW_MODE
);
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private impersonationStorageService: ImpersonationStorageService,
private router: Router,
@@ -89,13 +87,13 @@ export class GfHomeHoldingsComponent implements OnDestroy, OnInit {
this.impersonationStorageService
.onChangeHasImpersonation()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((impersonationId) => {
this.hasImpersonationId = !!impersonationId;
});
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -107,7 +105,7 @@ export class GfHomeHoldingsComponent implements OnDestroy, OnInit {
this.hasPermissionToCreateActivity = hasPermission(
this.user.permissions,
- permissions.createOrder
+ permissions.createActivity
);
this.initialize();
@@ -117,15 +115,15 @@ export class GfHomeHoldingsComponent implements OnDestroy, OnInit {
});
this.viewModeFormControl.valueChanges
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((holdingsViewMode) => {
this.dataService
.putUserSetting({ holdingsViewMode })
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((user) => {
this.user = user;
@@ -149,11 +147,6 @@ export class GfHomeHoldingsComponent implements OnDestroy, OnInit {
}
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private fetchHoldings() {
const filters = this.userService.getFilters();
@@ -193,7 +186,7 @@ export class GfHomeHoldingsComponent implements OnDestroy, OnInit {
this.holdings = undefined;
this.fetchHoldings()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ holdings }) => {
this.holdings = holdings;
diff --git a/apps/client/src/app/components/home-holdings/home-holdings.html b/apps/client/src/app/components/home-holdings/home-holdings.html
index ec131cd39..175c88606 100644
--- a/apps/client/src/app/components/home-holdings/home-holdings.html
+++ b/apps/client/src/app/components/home-holdings/home-holdings.html
@@ -46,7 +46,6 @@
}
();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private userService: UserService
) {
@@ -59,7 +57,7 @@ export class GfHomeMarketComponent implements OnDestroy, OnInit {
this.info = this.dataService.fetchInfo();
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -82,7 +80,7 @@ export class GfHomeMarketComponent implements OnDestroy, OnInit {
includeHistoricalData: this.numberOfDays,
symbol: ghostfolioFearAndGreedIndexSymbol
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ historicalData, marketPrice }) => {
this.fearAndGreedIndex = marketPrice;
this.historicalDataItems = [
@@ -99,16 +97,11 @@ export class GfHomeMarketComponent implements OnDestroy, OnInit {
this.dataService
.fetchBenchmarks()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ benchmarks }) => {
this.benchmarks = benchmarks;
this.changeDetectorRef.markForCheck();
});
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/components/home-overview/home-overview.component.ts b/apps/client/src/app/components/home-overview/home-overview.component.ts
index 0d5020904..9b4f646c3 100644
--- a/apps/client/src/app/components/home-overview/home-overview.component.ts
+++ b/apps/client/src/app/components/home-overview/home-overview.component.ts
@@ -19,14 +19,13 @@ import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
- OnDestroy,
+ DestroyRef,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { RouterModule } from '@angular/router';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
@Component({
imports: [
@@ -41,7 +40,7 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./home-overview.scss'],
templateUrl: './home-overview.html'
})
-export class GfHomeOverviewComponent implements OnDestroy, OnInit {
+export class GfHomeOverviewComponent implements OnInit {
public deviceType: string;
public errors: AssetProfileIdentifier[];
public hasError: boolean;
@@ -57,30 +56,29 @@ export class GfHomeOverviewComponent implements OnDestroy, OnInit {
public routerLinkAccounts = internalRoutes.accounts.routerLink;
public routerLinkPortfolio = internalRoutes.portfolio.routerLink;
public routerLinkPortfolioActivities =
- internalRoutes.portfolio.subRoutes.activities.routerLink;
+ internalRoutes.portfolio.subRoutes?.activities.routerLink;
public showDetails = false;
public unit: string;
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private impersonationStorageService: ImpersonationStorageService,
private layoutService: LayoutService,
private userService: UserService
) {
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
this.hasPermissionToCreateActivity = hasPermission(
this.user.permissions,
- permissions.createOrder
+ permissions.createActivity
);
this.update();
@@ -99,7 +97,7 @@ export class GfHomeOverviewComponent implements OnDestroy, OnInit {
this.impersonationStorageService
.onChangeHasImpersonation()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((impersonationId) => {
this.hasImpersonationId = !!impersonationId;
@@ -107,17 +105,12 @@ export class GfHomeOverviewComponent implements OnDestroy, OnInit {
});
this.layoutService.shouldReloadContent$
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.update();
});
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private update() {
this.historicalDataItems = null;
this.isLoadingPerformance = true;
@@ -126,7 +119,7 @@ export class GfHomeOverviewComponent implements OnDestroy, OnInit {
.fetchPortfolioPerformance({
range: this.user?.settings?.dateRange
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ chart, errors, performance }) => {
this.errors = errors;
this.performance = performance;
diff --git a/apps/client/src/app/components/home-summary/home-summary.component.ts b/apps/client/src/app/components/home-summary/home-summary.component.ts
index 454d05689..719cfbd29 100644
--- a/apps/client/src/app/components/home-summary/home-summary.component.ts
+++ b/apps/client/src/app/components/home-summary/home-summary.component.ts
@@ -13,14 +13,13 @@ import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
- OnDestroy,
+ DestroyRef,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatCardModule } from '@angular/material/card';
import { MatSnackBarRef, TextOnlySnackBar } from '@angular/material/snack-bar';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
@Component({
imports: [GfPortfolioSummaryComponent, MatCardModule],
@@ -29,7 +28,7 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./home-summary.scss'],
templateUrl: './home-summary.html'
})
-export class GfHomeSummaryComponent implements OnDestroy, OnInit {
+export class GfHomeSummaryComponent implements OnInit {
public deviceType: string;
public hasImpersonationId: boolean;
public hasPermissionForSubscription: boolean;
@@ -40,11 +39,10 @@ export class GfHomeSummaryComponent implements OnDestroy, OnInit {
public summary: PortfolioSummary;
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private impersonationStorageService: ImpersonationStorageService,
private userService: UserService
@@ -57,7 +55,7 @@ export class GfHomeSummaryComponent implements OnDestroy, OnInit {
);
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -77,7 +75,7 @@ export class GfHomeSummaryComponent implements OnDestroy, OnInit {
this.impersonationStorageService
.onChangeHasImpersonation()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((impersonationId) => {
this.hasImpersonationId = !!impersonationId;
});
@@ -86,11 +84,11 @@ export class GfHomeSummaryComponent implements OnDestroy, OnInit {
public onChangeEmergencyFund(emergencyFund: number) {
this.dataService
.putUserSetting({ emergencyFund })
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((user) => {
this.user = user;
@@ -99,17 +97,12 @@ export class GfHomeSummaryComponent implements OnDestroy, OnInit {
});
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private update() {
this.isLoading = true;
this.dataService
.fetchPortfolioDetails()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ summary }) => {
this.summary = summary;
this.isLoading = false;
diff --git a/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts
index 60d74be92..4669a827d 100644
--- a/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts
+++ b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts
@@ -1,11 +1,6 @@
import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete';
-import {
- ChangeDetectionStrategy,
- Component,
- OnDestroy,
- OnInit
-} from '@angular/core';
+import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
import {
AbstractControl,
FormBuilder,
@@ -19,7 +14,6 @@ import {
import { MatButtonModule } from '@angular/material/button';
import { MatDialogModule, MatDialogRef } from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field';
-import { Subject } from 'rxjs';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
@@ -36,11 +30,9 @@ import { Subject } from 'rxjs';
styleUrls: ['./create-watchlist-item-dialog.component.scss'],
templateUrl: 'create-watchlist-item-dialog.html'
})
-export class GfCreateWatchlistItemDialogComponent implements OnDestroy, OnInit {
+export class GfCreateWatchlistItemDialogComponent implements OnInit {
public createWatchlistItemForm: FormGroup;
- private unsubscribeSubject = new Subject();
-
public constructor(
public readonly dialogRef: MatDialogRef,
public readonly formBuilder: FormBuilder
@@ -69,11 +61,6 @@ export class GfCreateWatchlistItemDialogComponent implements OnDestroy, OnInit {
});
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private validator(control: AbstractControl): ValidationErrors {
const searchSymbolControl = control.get('searchSymbol');
diff --git a/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts b/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts
index 4adb4e54f..e6f366351 100644
--- a/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts
+++ b/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts
@@ -15,9 +15,10 @@ import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
- OnDestroy,
+ DestroyRef,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MatDialog } from '@angular/material/dialog';
import { ActivatedRoute, Router, RouterModule } from '@angular/router';
@@ -25,8 +26,6 @@ import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { addOutline } from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
import { GfCreateWatchlistItemDialogComponent } from './create-watchlist-item-dialog/create-watchlist-item-dialog.component';
import { CreateWatchlistItemDialogParams } from './create-watchlist-item-dialog/interfaces/interfaces';
@@ -45,7 +44,7 @@ import { CreateWatchlistItemDialogParams } from './create-watchlist-item-dialog/
styleUrls: ['./home-watchlist.scss'],
templateUrl: './home-watchlist.html'
})
-export class GfHomeWatchlistComponent implements OnDestroy, OnInit {
+export class GfHomeWatchlistComponent implements OnInit {
public deviceType: string;
public hasImpersonationId: boolean;
public hasPermissionToCreateWatchlistItem: boolean;
@@ -53,11 +52,10 @@ export class GfHomeWatchlistComponent implements OnDestroy, OnInit {
public user: User;
public watchlist: Benchmark[];
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private dialog: MatDialog,
private impersonationStorageService: ImpersonationStorageService,
@@ -69,13 +67,13 @@ export class GfHomeWatchlistComponent implements OnDestroy, OnInit {
this.impersonationStorageService
.onChangeHasImpersonation()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((impersonationId) => {
this.hasImpersonationId = !!impersonationId;
});
this.route.queryParams
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((params) => {
if (params['createWatchlistItemDialog']) {
this.openCreateWatchlistItemDialog();
@@ -83,7 +81,7 @@ export class GfHomeWatchlistComponent implements OnDestroy, OnInit {
});
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -118,7 +116,7 @@ export class GfHomeWatchlistComponent implements OnDestroy, OnInit {
}: AssetProfileIdentifier) {
this.dataService
.deleteWatchlistItem({ dataSource, symbol })
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe({
next: () => {
return this.loadWatchlistData();
@@ -126,15 +124,10 @@ export class GfHomeWatchlistComponent implements OnDestroy, OnInit {
});
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private loadWatchlistData() {
this.dataService
.fetchWatchlist()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ watchlist }) => {
this.watchlist = watchlist;
@@ -145,7 +138,7 @@ export class GfHomeWatchlistComponent implements OnDestroy, OnInit {
private openCreateWatchlistItemDialog() {
this.userService
.get()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((user) => {
this.user = user;
@@ -163,12 +156,12 @@ export class GfHomeWatchlistComponent implements OnDestroy, OnInit {
dialogRef
.afterClosed()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ dataSource, symbol } = {}) => {
if (dataSource && symbol) {
this.dataService
.postWatchlistItem({ dataSource, symbol })
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe({
next: () => this.loadWatchlistData()
});
diff --git a/apps/client/src/app/components/markets/markets.component.ts b/apps/client/src/app/components/markets/markets.component.ts
index 4b83e897f..4214ee989 100644
--- a/apps/client/src/app/components/markets/markets.component.ts
+++ b/apps/client/src/app/components/markets/markets.component.ts
@@ -19,12 +19,11 @@ import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
- OnDestroy,
+ DestroyRef,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
@@ -39,7 +38,7 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./markets.scss'],
templateUrl: './markets.html'
})
-export class GfMarketsComponent implements OnDestroy, OnInit {
+export class GfMarketsComponent implements OnInit {
public benchmarks: Benchmark[];
public deviceType: string;
public fearAndGreedIndex: number;
@@ -55,18 +54,17 @@ export class GfMarketsComponent implements OnDestroy, OnInit {
public readonly numberOfDays = 365;
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private userService: UserService
) {
this.deviceType = this.deviceService.getDeviceInfo().deviceType;
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -79,7 +77,7 @@ export class GfMarketsComponent implements OnDestroy, OnInit {
public ngOnInit() {
this.dataService
.fetchMarketDataOfMarkets({ includeHistoricalData: this.numberOfDays })
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ fearAndGreedIndex }) => {
this.fearAndGreedIndexData = fearAndGreedIndex;
@@ -90,7 +88,7 @@ export class GfMarketsComponent implements OnDestroy, OnInit {
this.dataService
.fetchBenchmarks()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ benchmarks }) => {
this.benchmarks = benchmarks;
@@ -119,9 +117,4 @@ export class GfMarketsComponent implements OnDestroy, OnInit {
this.initialize();
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/components/rule/rule.component.ts b/apps/client/src/app/components/rule/rule.component.ts
index e2ffc1cf6..23f870ff3 100644
--- a/apps/client/src/app/components/rule/rule.component.ts
+++ b/apps/client/src/app/components/rule/rule.component.ts
@@ -9,11 +9,13 @@ import { CommonModule } from '@angular/common';
import {
ChangeDetectionStrategy,
Component,
+ DestroyRef,
EventEmitter,
Input,
OnInit,
Output
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MatDialog } from '@angular/material/dialog';
import { MatMenuModule } from '@angular/material/menu';
@@ -29,7 +31,6 @@ import {
} from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
-import { Subject, takeUntil } from 'rxjs';
import { RuleSettingsDialogParams } from './rule-settings-dialog/interfaces/interfaces';
import { GfRuleSettingsDialogComponent } from './rule-settings-dialog/rule-settings-dialog.component';
@@ -58,9 +59,8 @@ export class GfRuleComponent implements OnInit {
@Output() ruleUpdated = new EventEmitter();
private deviceType: string;
- private unsubscribeSubject = new Subject();
-
public constructor(
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private dialog: MatDialog
) {
@@ -94,7 +94,7 @@ export class GfRuleComponent implements OnInit {
dialogRef
.afterClosed()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((settings: RuleSettings) => {
if (settings) {
this.ruleUpdated.emit({
@@ -115,9 +115,4 @@ export class GfRuleComponent implements OnInit {
this.ruleUpdated.emit(settings);
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts
index 0d616b92e..d10be10bd 100644
--- a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts
+++ b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts
@@ -7,9 +7,11 @@ import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
+ DestroyRef,
Inject,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import {
MAT_DIALOG_DATA,
@@ -21,8 +23,8 @@ import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { arrowForwardOutline, checkmarkCircleOutline } from 'ionicons/icons';
import ms from 'ms';
-import { interval, Subject } from 'rxjs';
-import { take, takeUntil, tap } from 'rxjs/operators';
+import { interval } from 'rxjs';
+import { take, tap } from 'rxjs/operators';
import { SubscriptionInterstitialDialogParams } from './interfaces/interfaces';
@@ -51,11 +53,10 @@ export class GfSubscriptionInterstitialDialogComponent implements OnInit {
public routerLinkPricing = publicRoutes.pricing.routerLink;
public variantIndex: number;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
@Inject(MAT_DIALOG_DATA) public data: SubscriptionInterstitialDialogParams,
+ private destroyRef: DestroyRef,
public dialogRef: MatDialogRef
) {
this.variantIndex = Math.floor(
@@ -76,7 +77,7 @@ export class GfSubscriptionInterstitialDialogComponent implements OnInit {
this.changeDetectorRef.markForCheck();
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
)
.subscribe();
}
@@ -84,9 +85,4 @@ export class GfSubscriptionInterstitialDialogComponent implements OnInit {
public closeDialog() {
this.dialogRef.close({});
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts
index 5c87b2f63..a4fadeecf 100644
--- a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts
+++ b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts
@@ -7,10 +7,11 @@ import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
+ DestroyRef,
Inject,
- OnDestroy,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import {
FormBuilder,
FormGroup,
@@ -28,7 +29,7 @@ import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select';
import { StatusCodes } from 'http-status-codes';
-import { EMPTY, Subject, catchError, takeUntil } from 'rxjs';
+import { EMPTY, catchError } from 'rxjs';
import { CreateOrUpdateAccessDialogParams } from './interfaces/interfaces';
@@ -48,19 +49,16 @@ import { CreateOrUpdateAccessDialogParams } from './interfaces/interfaces';
styleUrls: ['./create-or-update-access-dialog.scss'],
templateUrl: 'create-or-update-access-dialog.html'
})
-export class GfCreateOrUpdateAccessDialogComponent
- implements OnDestroy, OnInit
-{
+export class GfCreateOrUpdateAccessDialogComponent implements OnInit {
public accessForm: FormGroup;
public mode: 'create' | 'update';
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
@Inject(MAT_DIALOG_DATA) private data: CreateOrUpdateAccessDialogParams,
public dialogRef: MatDialogRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private formBuilder: FormBuilder,
private notificationService: NotificationService
) {
@@ -113,11 +111,6 @@ export class GfCreateOrUpdateAccessDialogComponent
}
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private async createAccess() {
const access: CreateAccessDto = {
alias: this.accessForm.get('alias').value,
@@ -144,7 +137,7 @@ export class GfCreateOrUpdateAccessDialogComponent
return EMPTY;
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
)
.subscribe(() => {
this.dialogRef.close(access);
@@ -181,7 +174,7 @@ export class GfCreateOrUpdateAccessDialogComponent
return EMPTY;
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
)
.subscribe(() => {
this.dialogRef.close(access);
diff --git a/apps/client/src/app/components/user-account-access/user-account-access.component.ts b/apps/client/src/app/components/user-account-access/user-account-access.component.ts
index ef78cccff..4ca088775 100644
--- a/apps/client/src/app/components/user-account-access/user-account-access.component.ts
+++ b/apps/client/src/app/components/user-account-access/user-account-access.component.ts
@@ -1,5 +1,4 @@
import { GfAccessTableComponent } from '@ghostfolio/client/components/access-table/access-table.component';
-import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { CreateAccessDto } from '@ghostfolio/common/dtos';
import { ConfirmationDialogType } from '@ghostfolio/common/enums';
@@ -14,9 +13,10 @@ import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
- OnDestroy,
+ DestroyRef,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatDialog, MatDialogModule } from '@angular/material/dialog';
@@ -27,8 +27,8 @@ import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { addOutline, eyeOffOutline, eyeOutline } from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { EMPTY, Subject } from 'rxjs';
-import { catchError, takeUntil } from 'rxjs/operators';
+import { EMPTY } from 'rxjs';
+import { catchError } from 'rxjs/operators';
import { GfCreateOrUpdateAccessDialogComponent } from './create-or-update-access-dialog/create-or-update-access-dialog.component';
import { CreateOrUpdateAccessDialogParams } from './create-or-update-access-dialog/interfaces/interfaces';
@@ -52,7 +52,7 @@ import { CreateOrUpdateAccessDialogParams } from './create-or-update-access-dial
styleUrls: ['./user-account-access.scss'],
templateUrl: './user-account-access.html'
})
-export class GfUserAccountAccessComponent implements OnDestroy, OnInit {
+export class GfUserAccountAccessComponent implements OnInit {
public accessesGet: Access[];
public accessesGive: Access[];
public deviceType: string;
@@ -65,18 +65,16 @@ export class GfUserAccountAccessComponent implements OnDestroy, OnInit {
});
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private dialog: MatDialog,
private formBuilder: FormBuilder,
private notificationService: NotificationService,
private route: ActivatedRoute,
private router: Router,
- private tokenStorageService: TokenStorageService,
private userService: UserService
) {
const { globalPermissions } = this.dataService.fetchInfo();
@@ -87,7 +85,7 @@ export class GfUserAccountAccessComponent implements OnDestroy, OnInit {
);
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -112,7 +110,7 @@ export class GfUserAccountAccessComponent implements OnDestroy, OnInit {
});
this.route.queryParams
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((params) => {
if (params['createDialog']) {
this.openCreateAccessDialog();
@@ -133,7 +131,7 @@ export class GfUserAccountAccessComponent implements OnDestroy, OnInit {
public onDeleteAccess(aId: string) {
this.dataService
.deleteAccess(aId)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe({
next: () => {
this.update();
@@ -156,13 +154,12 @@ export class GfUserAccountAccessComponent implements OnDestroy, OnInit {
return EMPTY;
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
)
.subscribe(({ accessToken }) => {
this.notificationService.alert({
discardFn: () => {
- this.tokenStorageService.signOut();
- this.userService.remove();
+ this.userService.signOut();
document.location.href = `/${document.documentElement.lang}`;
},
@@ -182,11 +179,6 @@ export class GfUserAccountAccessComponent implements OnDestroy, OnInit {
});
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private openCreateAccessDialog() {
const dialogRef = this.dialog.open<
GfCreateOrUpdateAccessDialogComponent,
@@ -264,7 +256,7 @@ export class GfUserAccountAccessComponent implements OnDestroy, OnInit {
this.dataService
.fetchAccesses()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((accesses) => {
this.accessesGive = accesses;
diff --git a/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts b/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
index 92fd0d590..b13a983fc 100644
--- a/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
+++ b/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
@@ -14,15 +14,16 @@ import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
- OnDestroy
+ DestroyRef
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { MatSnackBar } from '@angular/material/snack-bar';
import { RouterModule } from '@angular/router';
import ms, { StringValue } from 'ms';
-import { EMPTY, Subject } from 'rxjs';
-import { catchError, takeUntil } from 'rxjs/operators';
+import { EMPTY } from 'rxjs';
+import { catchError } from 'rxjs/operators';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
@@ -38,7 +39,7 @@ import { catchError, takeUntil } from 'rxjs/operators';
styleUrls: ['./user-account-membership.scss'],
templateUrl: './user-account-membership.html'
})
-export class GfUserAccountMembershipComponent implements OnDestroy {
+export class GfUserAccountMembershipComponent {
public baseCurrency: string;
public coupon: number;
public couponId: string;
@@ -54,11 +55,10 @@ export class GfUserAccountMembershipComponent implements OnDestroy {
'mailto:hi@ghostfol.io?Subject=Ghostfolio Premium Trial&body=Hello%0D%0DI am interested in Ghostfolio Premium. Can you please send me a coupon code to try it for some time?%0D%0DKind regards';
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private notificationService: NotificationService,
private snackBar: MatSnackBar,
private userService: UserService
@@ -73,7 +73,7 @@ export class GfUserAccountMembershipComponent implements OnDestroy {
);
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -118,7 +118,7 @@ export class GfUserAccountMembershipComponent implements OnDestroy {
return EMPTY;
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
)
.subscribe(({ sessionUrl }) => {
window.location.href = sessionUrl;
@@ -142,7 +142,7 @@ export class GfUserAccountMembershipComponent implements OnDestroy {
return EMPTY;
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
)
.subscribe(({ apiKey }) => {
this.notificationService.alert({
@@ -180,7 +180,7 @@ export class GfUserAccountMembershipComponent implements OnDestroy {
return EMPTY;
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
)
.subscribe(() => {
const snackBarRef = this.snackBar.open(
@@ -193,14 +193,14 @@ export class GfUserAccountMembershipComponent implements OnDestroy {
snackBarRef
.afterDismissed()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
window.location.reload();
});
snackBarRef
.onAction()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
window.location.reload();
});
@@ -210,9 +210,4 @@ export class GfUserAccountMembershipComponent implements OnDestroy {
title: $localize`Please enter your coupon code.`
});
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/components/user-account-settings/user-account-settings.component.ts b/apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
index 44be30b9a..72bbfc2c6 100644
--- a/apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
+++ b/apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
@@ -3,7 +3,6 @@ import {
KEY_TOKEN,
SettingsStorageService
} from '@ghostfolio/client/services/settings-storage.service';
-import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { WebAuthnService } from '@ghostfolio/client/services/web-authn.service';
import { ConfirmationDialogType } from '@ghostfolio/common/enums';
@@ -19,9 +18,10 @@ import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
- OnDestroy,
+ DestroyRef,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import {
FormBuilder,
FormsModule,
@@ -44,8 +44,8 @@ import { format, parseISO } from 'date-fns';
import { addIcons } from 'ionicons';
import { eyeOffOutline, eyeOutline } from 'ionicons/icons';
import ms from 'ms';
-import { EMPTY, Subject, throwError } from 'rxjs';
-import { catchError, takeUntil } from 'rxjs/operators';
+import { EMPTY, throwError } from 'rxjs';
+import { catchError } from 'rxjs/operators';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
@@ -66,7 +66,7 @@ import { catchError, takeUntil } from 'rxjs/operators';
styleUrls: ['./user-account-settings.scss'],
templateUrl: './user-account-settings.html'
})
-export class GfUserAccountSettingsComponent implements OnDestroy, OnInit {
+export class GfUserAccountSettingsComponent implements OnInit {
public appearancePlaceholder = $localize`Auto`;
public baseCurrency: string;
public currencies: string[] = [];
@@ -99,16 +99,14 @@ export class GfUserAccountSettingsComponent implements OnDestroy, OnInit {
];
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private formBuilder: FormBuilder,
private notificationService: NotificationService,
private settingsStorageService: SettingsStorageService,
private snackBar: MatSnackBar,
- private tokenStorageService: TokenStorageService,
private userService: UserService,
public webAuthnService: WebAuthnService
) {
@@ -118,7 +116,7 @@ export class GfUserAccountSettingsComponent implements OnDestroy, OnInit {
this.currencies = currencies;
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -159,11 +157,11 @@ export class GfUserAccountSettingsComponent implements OnDestroy, OnInit {
public onChangeUserSetting(aKey: string, aValue: string) {
this.dataService
.putUserSetting({ [aKey]: aValue })
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((user) => {
this.user = user;
@@ -195,11 +193,10 @@ export class GfUserAccountSettingsComponent implements OnDestroy, OnInit {
return EMPTY;
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
)
.subscribe(() => {
- this.tokenStorageService.signOut();
- this.userService.remove();
+ this.userService.signOut();
document.location.href = `/${document.documentElement.lang}`;
});
@@ -212,11 +209,11 @@ export class GfUserAccountSettingsComponent implements OnDestroy, OnInit {
public onExperimentalFeaturesChange(aEvent: MatSlideToggleChange) {
this.dataService
.putUserSetting({ isExperimentalFeatures: aEvent.checked })
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((user) => {
this.user = user;
@@ -228,7 +225,7 @@ export class GfUserAccountSettingsComponent implements OnDestroy, OnInit {
public onExport() {
this.dataService
.fetchExport()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((data) => {
for (const activity of data.activities) {
delete activity.id;
@@ -248,11 +245,11 @@ export class GfUserAccountSettingsComponent implements OnDestroy, OnInit {
public onRestrictedViewChange(aEvent: MatSlideToggleChange) {
this.dataService
.putUserSetting({ isRestrictedView: aEvent.checked })
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((user) => {
this.user = user;
@@ -287,11 +284,11 @@ export class GfUserAccountSettingsComponent implements OnDestroy, OnInit {
public onViewModeChange(aEvent: MatSlideToggleChange) {
this.dataService
.putUserSetting({ viewMode: aEvent.checked === true ? 'ZEN' : 'DEFAULT' })
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((user) => {
this.user = user;
@@ -300,11 +297,6 @@ export class GfUserAccountSettingsComponent implements OnDestroy, OnInit {
});
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private deregisterDevice() {
this.webAuthnService
.deregister()
@@ -314,7 +306,7 @@ export class GfUserAccountSettingsComponent implements OnDestroy, OnInit {
return EMPTY;
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
)
.subscribe(() => {
this.update();
@@ -344,7 +336,7 @@ export class GfUserAccountSettingsComponent implements OnDestroy, OnInit {
return error;
});
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
)
.subscribe({
next: () => {
diff --git a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
index 570dcf4d6..e9af86942 100644
--- a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
+++ b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -27,7 +27,13 @@
- User ID
+ User ID
Role
diff --git a/apps/client/src/app/core/auth.guard.ts b/apps/client/src/app/core/auth.guard.ts
index 123a6169a..3292f0ff7 100644
--- a/apps/client/src/app/core/auth.guard.ts
+++ b/apps/client/src/app/core/auth.guard.ts
@@ -68,7 +68,7 @@ export class AuthGuard {
this.dataService
.putUserSetting({ language: document.documentElement.lang })
.subscribe(() => {
- this.userService.remove();
+ this.userService.reset();
setTimeout(() => {
window.location.reload();
diff --git a/apps/client/src/app/core/http-response.interceptor.ts b/apps/client/src/app/core/http-response.interceptor.ts
index ab99b440f..315e9d64e 100644
--- a/apps/client/src/app/core/http-response.interceptor.ts
+++ b/apps/client/src/app/core/http-response.interceptor.ts
@@ -1,4 +1,4 @@
-import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
+import { UserService } from '@ghostfolio/client/services/user/user.service';
import { WebAuthnService } from '@ghostfolio/client/services/web-authn.service';
import { InfoItem } from '@ghostfolio/common/interfaces';
import { internalRoutes, publicRoutes } from '@ghostfolio/common/routes/routes';
@@ -32,8 +32,8 @@ export class HttpResponseInterceptor implements HttpInterceptor {
public constructor(
private dataService: DataService,
private router: Router,
- private tokenStorageService: TokenStorageService,
private snackBar: MatSnackBar,
+ private userService: UserService,
private webAuthnService: WebAuthnService
) {
this.info = this.dataService.fetchInfo();
@@ -115,7 +115,7 @@ export class HttpResponseInterceptor implements HttpInterceptor {
if (this.webAuthnService.isEnabled()) {
this.router.navigate(internalRoutes.webauthn.routerLink);
} else {
- this.tokenStorageService.signOut();
+ this.userService.signOut();
}
}
}
diff --git a/apps/client/src/app/interfaces/interfaces.ts b/apps/client/src/app/interfaces/interfaces.ts
new file mode 100644
index 000000000..493eff4ab
--- /dev/null
+++ b/apps/client/src/app/interfaces/interfaces.ts
@@ -0,0 +1,8 @@
+import type { Params } from '@angular/router';
+import type { DataSource } from '@prisma/client';
+
+export interface GfAppQueryParams extends Params {
+ dataSource?: DataSource;
+ holdingDetailDialog?: string;
+ symbol?: string;
+}
diff --git a/apps/client/src/app/pages/about/about-page.component.ts b/apps/client/src/app/pages/about/about-page.component.ts
index 5ddb6b2e0..1e749d1cd 100644
--- a/apps/client/src/app/pages/about/about-page.component.ts
+++ b/apps/client/src/app/pages/about/about-page.component.ts
@@ -8,9 +8,10 @@ import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
- OnDestroy,
+ DestroyRef,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatTabsModule } from '@angular/material/tabs';
import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
@@ -24,8 +25,6 @@ import {
sparklesOutline
} from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
@Component({
host: { class: 'page has-tabs' },
@@ -35,17 +34,16 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./about-page.scss'],
templateUrl: './about-page.html'
})
-export class AboutPageComponent implements OnDestroy, OnInit {
+export class AboutPageComponent implements OnInit {
public deviceType: string;
public hasPermissionForSubscription: boolean;
public tabs: TabConfiguration[] = [];
public user: User;
- private unsubscribeSubject = new Subject
();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private userService: UserService
) {
@@ -57,7 +55,7 @@ export class AboutPageComponent implements OnDestroy, OnInit {
);
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
this.tabs = [
{
@@ -118,9 +116,4 @@ export class AboutPageComponent implements OnDestroy, OnInit {
public ngOnInit() {
this.deviceType = this.deviceService.getDeviceInfo().deviceType;
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/pages/about/about-page.routes.ts b/apps/client/src/app/pages/about/about-page.routes.ts
index 4cb13280a..b4466fbab 100644
--- a/apps/client/src/app/pages/about/about-page.routes.ts
+++ b/apps/client/src/app/pages/about/about-page.routes.ts
@@ -15,29 +15,29 @@ export const routes: Routes = [
import('./overview/about-overview-page.routes').then((m) => m.routes)
},
{
- path: publicRoutes.about.subRoutes.changelog.path,
+ path: publicRoutes.about.subRoutes?.changelog.path,
loadChildren: () =>
import('./changelog/changelog-page.routes').then((m) => m.routes)
},
{
- path: publicRoutes.about.subRoutes.license.path,
+ path: publicRoutes.about.subRoutes?.license.path,
loadChildren: () =>
import('./license/license-page.routes').then((m) => m.routes)
},
{
- path: publicRoutes.about.subRoutes.ossFriends.path,
+ path: publicRoutes.about.subRoutes?.ossFriends.path,
loadChildren: () =>
import('./oss-friends/oss-friends-page.routes').then((m) => m.routes)
},
{
- path: publicRoutes.about.subRoutes.privacyPolicy.path,
+ path: publicRoutes.about.subRoutes?.privacyPolicy.path,
loadChildren: () =>
import('./privacy-policy/privacy-policy-page.routes').then(
(m) => m.routes
)
},
{
- path: publicRoutes.about.subRoutes.termsOfService.path,
+ path: publicRoutes.about.subRoutes?.termsOfService.path,
loadChildren: () =>
import('./terms-of-service/terms-of-service-page.routes').then(
(m) => m.routes
diff --git a/apps/client/src/app/pages/about/changelog/changelog-page.routes.ts b/apps/client/src/app/pages/about/changelog/changelog-page.routes.ts
index 523218acc..7b67283e9 100644
--- a/apps/client/src/app/pages/about/changelog/changelog-page.routes.ts
+++ b/apps/client/src/app/pages/about/changelog/changelog-page.routes.ts
@@ -10,6 +10,6 @@ export const routes: Routes = [
canActivate: [AuthGuard],
component: GfChangelogPageComponent,
path: '',
- title: publicRoutes.about.subRoutes.changelog.title
+ title: publicRoutes.about.subRoutes?.changelog.title
}
];
diff --git a/apps/client/src/app/pages/about/license/license-page.routes.ts b/apps/client/src/app/pages/about/license/license-page.routes.ts
index 1684bb0c5..45de6aaa2 100644
--- a/apps/client/src/app/pages/about/license/license-page.routes.ts
+++ b/apps/client/src/app/pages/about/license/license-page.routes.ts
@@ -10,6 +10,6 @@ export const routes: Routes = [
canActivate: [AuthGuard],
component: GfLicensePageComponent,
path: '',
- title: publicRoutes.about.subRoutes.license.title
+ title: publicRoutes.about.subRoutes?.license.title
}
];
diff --git a/apps/client/src/app/pages/about/oss-friends/oss-friends-page.routes.ts b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.routes.ts
index 8dbb9d52a..dfe65d962 100644
--- a/apps/client/src/app/pages/about/oss-friends/oss-friends-page.routes.ts
+++ b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.routes.ts
@@ -10,6 +10,6 @@ export const routes: Routes = [
canActivate: [AuthGuard],
component: GfOpenSourceSoftwareFriendsPageComponent,
path: '',
- title: publicRoutes.about.subRoutes.ossFriends.title
+ title: publicRoutes.about.subRoutes?.ossFriends.title
}
];
diff --git a/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.component.ts b/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.component.ts
index 78881cd2c..50e4e3e2f 100644
--- a/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.component.ts
+++ b/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.component.ts
@@ -1,6 +1,5 @@
-import { Component, OnDestroy } from '@angular/core';
+import { Component } from '@angular/core';
import { MarkdownModule } from 'ngx-markdown';
-import { Subject } from 'rxjs';
@Component({
imports: [MarkdownModule],
@@ -8,11 +7,4 @@ import { Subject } from 'rxjs';
styleUrls: ['./privacy-policy-page.scss'],
templateUrl: './privacy-policy-page.html'
})
-export class GfPrivacyPolicyPageComponent implements OnDestroy {
- private unsubscribeSubject = new Subject();
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-}
+export class GfPrivacyPolicyPageComponent {}
diff --git a/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.routes.ts b/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.routes.ts
index e87436c17..934e06289 100644
--- a/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.routes.ts
+++ b/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.routes.ts
@@ -10,6 +10,6 @@ export const routes: Routes = [
canActivate: [AuthGuard],
component: GfPrivacyPolicyPageComponent,
path: '',
- title: publicRoutes.about.subRoutes.privacyPolicy.title
+ title: publicRoutes.about.subRoutes?.privacyPolicy.title
}
];
diff --git a/apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.component.ts b/apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.component.ts
index dbf07ef19..7899f0187 100644
--- a/apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.component.ts
+++ b/apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.component.ts
@@ -1,6 +1,5 @@
-import { Component, OnDestroy } from '@angular/core';
+import { Component } from '@angular/core';
import { MarkdownModule } from 'ngx-markdown';
-import { Subject } from 'rxjs';
@Component({
imports: [MarkdownModule],
@@ -8,11 +7,4 @@ import { Subject } from 'rxjs';
styleUrls: ['./terms-of-service-page.scss'],
templateUrl: './terms-of-service-page.html'
})
-export class GfTermsOfServicePageComponent implements OnDestroy {
- private unsubscribeSubject = new Subject();
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-}
+export class GfTermsOfServicePageComponent {}
diff --git a/apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.routes.ts b/apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.routes.ts
index 34d7a72d0..caf8751f1 100644
--- a/apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.routes.ts
+++ b/apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.routes.ts
@@ -10,6 +10,6 @@ export const routes: Routes = [
canActivate: [AuthGuard],
component: GfTermsOfServicePageComponent,
path: '',
- title: publicRoutes.about.subRoutes.termsOfService.title
+ title: publicRoutes.about.subRoutes?.termsOfService.title
}
];
diff --git a/apps/client/src/app/pages/accounts/accounts-page.component.ts b/apps/client/src/app/pages/accounts/accounts-page.component.ts
index f7e6541b5..fdc78a8c4 100644
--- a/apps/client/src/app/pages/accounts/accounts-page.component.ts
+++ b/apps/client/src/app/pages/accounts/accounts-page.component.ts
@@ -13,7 +13,13 @@ import { GfAccountsTableComponent } from '@ghostfolio/ui/accounts-table';
import { NotificationService } from '@ghostfolio/ui/notifications';
import { DataService } from '@ghostfolio/ui/services';
-import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
+import {
+ ChangeDetectorRef,
+ Component,
+ DestroyRef,
+ OnInit
+} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MatDialog } from '@angular/material/dialog';
import { ActivatedRoute, Router, RouterModule } from '@angular/router';
@@ -21,8 +27,8 @@ import { Account as AccountModel } from '@prisma/client';
import { addIcons } from 'ionicons';
import { addOutline } from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { EMPTY, Subject, Subscription } from 'rxjs';
-import { catchError, takeUntil } from 'rxjs/operators';
+import { EMPTY, Subscription } from 'rxjs';
+import { catchError } from 'rxjs/operators';
import { GfCreateOrUpdateAccountDialogComponent } from './create-or-update-account-dialog/create-or-update-account-dialog.component';
import { CreateOrUpdateAccountDialogParams } from './create-or-update-account-dialog/interfaces/interfaces';
@@ -36,7 +42,7 @@ import { GfTransferBalanceDialogComponent } from './transfer-balance/transfer-ba
styleUrls: ['./accounts-page.scss'],
templateUrl: './accounts-page.html'
})
-export class GfAccountsPageComponent implements OnDestroy, OnInit {
+export class GfAccountsPageComponent implements OnInit {
public accounts: AccountModel[];
public activitiesCount = 0;
public deviceType: string;
@@ -48,11 +54,10 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit {
public totalValueInBaseCurrency = 0;
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private dialog: MatDialog,
private impersonationStorageService: ImpersonationStorageService,
@@ -62,7 +67,7 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit {
private userService: UserService
) {
this.route.queryParams
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((params) => {
if (params['accountId'] && params['accountDetailDialog']) {
this.openAccountDetailDialog(params['accountId']);
@@ -94,13 +99,13 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit {
this.impersonationStorageService
.onChangeHasImpersonation()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((impersonationId) => {
this.hasImpersonationId = !!impersonationId;
});
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -124,7 +129,7 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit {
public fetchAccounts() {
this.dataService
.fetchAccounts()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(
({
accounts,
@@ -151,11 +156,11 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit {
this.dataService
.deleteAccount(aId)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe();
this.fetchAccounts();
@@ -204,18 +209,18 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit {
dialogRef
.afterClosed()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((account: UpdateAccountDto | null) => {
if (account) {
this.reset();
this.dataService
.putAccount(account)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe();
this.fetchAccounts();
@@ -228,11 +233,6 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit {
});
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private openAccountDetailDialog(aAccountId: string) {
const dialogRef = this.dialog.open<
GfAccountDetailDialogComponent,
@@ -245,7 +245,7 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit {
hasImpersonationId: this.hasImpersonationId,
hasPermissionToCreateActivity:
!this.hasImpersonationId &&
- hasPermission(this.user?.permissions, permissions.createOrder) &&
+ hasPermission(this.user?.permissions, permissions.createActivity) &&
!this.user?.settings?.isRestrictedView
},
height: this.deviceType === 'mobile' ? '98vh' : '80vh',
@@ -254,7 +254,7 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit {
dialogRef
.afterClosed()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.fetchAccounts();
@@ -284,18 +284,18 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit {
dialogRef
.afterClosed()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((account: CreateAccountDto | null) => {
if (account) {
this.reset();
this.dataService
.postAccount(account)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe();
this.fetchAccounts();
@@ -321,7 +321,7 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit {
dialogRef
.afterClosed()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((data: any) => {
if (data) {
this.reset();
@@ -343,7 +343,7 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit {
return EMPTY;
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
)
.subscribe(() => {
this.fetchAccounts();
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 f4c68e70f..6cdd18251 100644
--- a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts
+++ b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts
@@ -5,12 +5,7 @@ import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo';
import { DataService } from '@ghostfolio/ui/services';
import { CommonModule, NgClass } from '@angular/common';
-import {
- ChangeDetectionStrategy,
- Component,
- Inject,
- OnDestroy
-} from '@angular/core';
+import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
import {
AbstractControl,
FormBuilder,
@@ -30,7 +25,7 @@ import {
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { Platform } from '@prisma/client';
-import { Observable, Subject } from 'rxjs';
+import { Observable } from 'rxjs';
import { map, startWith } from 'rxjs/operators';
import { CreateOrUpdateAccountDialogParams } from './interfaces/interfaces';
@@ -55,14 +50,12 @@ import { CreateOrUpdateAccountDialogParams } from './interfaces/interfaces';
styleUrls: ['./create-or-update-account-dialog.scss'],
templateUrl: 'create-or-update-account-dialog.html'
})
-export class GfCreateOrUpdateAccountDialogComponent implements OnDestroy {
+export class GfCreateOrUpdateAccountDialogComponent {
public accountForm: FormGroup;
public currencies: string[] = [];
public filteredPlatforms: Observable;
public platforms: Platform[] = [];
- private unsubscribeSubject = new Subject();
-
public constructor(
@Inject(MAT_DIALOG_DATA) public data: CreateOrUpdateAccountDialogParams,
private dataService: DataService,
@@ -170,11 +163,6 @@ export class GfCreateOrUpdateAccountDialogComponent implements OnDestroy {
}
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private autocompleteObjectValidator(): ValidatorFn {
return (control: AbstractControl) => {
if (control.value && typeof control.value === 'string') {
diff --git a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts
index 85d2e60bf..34a66b156 100644
--- a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts
+++ b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts
@@ -1,12 +1,7 @@
import { TransferBalanceDto } from '@ghostfolio/common/dtos';
import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo';
-import {
- ChangeDetectionStrategy,
- Component,
- Inject,
- OnDestroy
-} from '@angular/core';
+import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
import {
AbstractControl,
FormBuilder,
@@ -25,7 +20,6 @@ import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select';
import { Account } from '@prisma/client';
-import { Subject } from 'rxjs';
import { TransferBalanceDialogParams } from './interfaces/interfaces';
@@ -45,13 +39,11 @@ import { TransferBalanceDialogParams } from './interfaces/interfaces';
styleUrls: ['./transfer-balance-dialog.scss'],
templateUrl: 'transfer-balance-dialog.html'
})
-export class GfTransferBalanceDialogComponent implements OnDestroy {
+export class GfTransferBalanceDialogComponent {
public accounts: Account[] = [];
public currency: string;
public transferBalanceForm: FormGroup;
- private unsubscribeSubject = new Subject();
-
public constructor(
@Inject(MAT_DIALOG_DATA) public data: TransferBalanceDialogParams,
public dialogRef: MatDialogRef,
@@ -93,11 +85,6 @@ export class GfTransferBalanceDialogComponent implements OnDestroy {
this.dialogRef.close({ account });
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private compareAccounts(control: AbstractControl): ValidationErrors {
const accountFrom = control.get('fromAccount');
const accountTo = control.get('toAccount');
diff --git a/apps/client/src/app/pages/admin/admin-page.routes.ts b/apps/client/src/app/pages/admin/admin-page.routes.ts
index c5309edbb..08fce248c 100644
--- a/apps/client/src/app/pages/admin/admin-page.routes.ts
+++ b/apps/client/src/app/pages/admin/admin-page.routes.ts
@@ -20,29 +20,29 @@ export const routes: Routes = [
title: internalRoutes.adminControl.title
},
{
- path: internalRoutes.adminControl.subRoutes.jobs.path,
+ path: internalRoutes.adminControl.subRoutes?.jobs.path,
component: GfAdminJobsComponent,
- title: internalRoutes.adminControl.subRoutes.jobs.title
+ title: internalRoutes.adminControl.subRoutes?.jobs.title
},
{
- path: internalRoutes.adminControl.subRoutes.marketData.path,
+ path: internalRoutes.adminControl.subRoutes?.marketData.path,
component: GfAdminMarketDataComponent,
- title: internalRoutes.adminControl.subRoutes.marketData.title
+ title: internalRoutes.adminControl.subRoutes?.marketData.title
},
{
- path: internalRoutes.adminControl.subRoutes.settings.path,
+ path: internalRoutes.adminControl.subRoutes?.settings.path,
component: GfAdminSettingsComponent,
- title: internalRoutes.adminControl.subRoutes.settings.title
+ title: internalRoutes.adminControl.subRoutes?.settings.title
},
{
- path: internalRoutes.adminControl.subRoutes.users.path,
+ path: internalRoutes.adminControl.subRoutes?.users.path,
component: GfAdminUsersComponent,
- title: internalRoutes.adminControl.subRoutes.users.title
+ title: internalRoutes.adminControl.subRoutes?.users.title
},
{
- path: `${internalRoutes.adminControl.subRoutes.users.path}/:userId`,
+ path: `${internalRoutes.adminControl.subRoutes?.users.path}/:userId`,
component: GfAdminUsersComponent,
- title: internalRoutes.adminControl.subRoutes.users.title
+ title: internalRoutes.adminControl.subRoutes?.users.title
}
],
component: AdminPageComponent,
diff --git a/apps/client/src/app/pages/api/api-page.component.ts b/apps/client/src/app/pages/api/api-page.component.ts
index 353605380..357a08bbd 100644
--- a/apps/client/src/app/pages/api/api-page.component.ts
+++ b/apps/client/src/app/pages/api/api-page.component.ts
@@ -14,9 +14,10 @@ import {
import { CommonModule } from '@angular/common';
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
-import { Component, OnInit } from '@angular/core';
+import { Component, DestroyRef, OnInit } from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { format, startOfYear } from 'date-fns';
-import { map, Observable, Subject, takeUntil } from 'rxjs';
+import { map, Observable } from 'rxjs';
@Component({
host: { class: 'page' },
@@ -35,9 +36,11 @@ export class GfApiPageComponent implements OnInit {
public status$: Observable;
private apiKey: string;
- private unsubscribeSubject = new Subject();
- public constructor(private http: HttpClient) {}
+ public constructor(
+ private destroyRef: DestroyRef,
+ private http: HttpClient
+ ) {}
public ngOnInit() {
this.apiKey = prompt($localize`Please enter your Ghostfolio API key:`);
@@ -51,18 +54,13 @@ export class GfApiPageComponent implements OnInit {
this.status$ = this.fetchStatus();
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private fetchAssetProfile({ symbol }: { symbol: string }) {
return this.http
.get(
`/api/v1/data-providers/ghostfolio/asset-profile/${symbol}`,
{ headers: this.getHeaders() }
)
- .pipe(takeUntil(this.unsubscribeSubject));
+ .pipe(takeUntilDestroyed(this.destroyRef));
}
private fetchDividends({ symbol }: { symbol: string }) {
@@ -82,7 +80,7 @@ export class GfApiPageComponent implements OnInit {
map(({ dividends }) => {
return dividends;
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
);
}
@@ -103,7 +101,7 @@ export class GfApiPageComponent implements OnInit {
map(({ historicalData }) => {
return historicalData;
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
);
}
@@ -129,7 +127,7 @@ export class GfApiPageComponent implements OnInit {
map(({ items }) => {
return items;
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
);
}
@@ -145,7 +143,7 @@ export class GfApiPageComponent implements OnInit {
map(({ quotes }) => {
return quotes;
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
);
}
@@ -155,7 +153,7 @@ export class GfApiPageComponent implements OnInit {
'/api/v2/data-providers/ghostfolio/status',
{ headers: this.getHeaders() }
)
- .pipe(takeUntil(this.unsubscribeSubject));
+ .pipe(takeUntilDestroyed(this.destroyRef));
}
private getHeaders() {
diff --git a/apps/client/src/app/pages/auth/auth-page.component.ts b/apps/client/src/app/pages/auth/auth-page.component.ts
index 082401d6d..1b0b4a67c 100644
--- a/apps/client/src/app/pages/auth/auth-page.component.ts
+++ b/apps/client/src/app/pages/auth/auth-page.component.ts
@@ -4,20 +4,18 @@ import {
} from '@ghostfolio/client/services/settings-storage.service';
import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
-import { Component, OnDestroy, OnInit } from '@angular/core';
+import { Component, DestroyRef, OnInit } from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { ActivatedRoute, Router } from '@angular/router';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
@Component({
selector: 'gf-auth-page',
styleUrls: ['./auth-page.scss'],
templateUrl: './auth-page.html'
})
-export class GfAuthPageComponent implements OnDestroy, OnInit {
- private unsubscribeSubject = new Subject();
-
+export class GfAuthPageComponent implements OnInit {
public constructor(
+ private destroyRef: DestroyRef,
private route: ActivatedRoute,
private router: Router,
private settingsStorageService: SettingsStorageService,
@@ -26,7 +24,7 @@ export class GfAuthPageComponent implements OnDestroy, OnInit {
public ngOnInit() {
this.route.params
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((params) => {
const jwt = params['jwt'];
@@ -38,9 +36,4 @@ export class GfAuthPageComponent implements OnDestroy, OnInit {
this.router.navigate(['/']);
});
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts b/apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts
index c5a9cf178..4b62e4449 100644
--- a/apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts
+++ b/apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts
@@ -12,6 +12,6 @@ import { RouterModule } from '@angular/router';
})
export class GhostfolioJoinsOssFriendsPageComponent {
public routerLinkAboutOssFriends =
- publicRoutes.about.subRoutes.ossFriends.routerLink;
+ publicRoutes.about.subRoutes?.ossFriends.routerLink;
public routerLinkBlog = publicRoutes.blog.routerLink;
}
diff --git a/apps/client/src/app/pages/blog/blog-page.component.ts b/apps/client/src/app/pages/blog/blog-page.component.ts
index 8a379a7e4..7f2c56d2d 100644
--- a/apps/client/src/app/pages/blog/blog-page.component.ts
+++ b/apps/client/src/app/pages/blog/blog-page.component.ts
@@ -1,13 +1,12 @@
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { DataService } from '@ghostfolio/ui/services';
-import { Component, CUSTOM_ELEMENTS_SCHEMA, OnDestroy } from '@angular/core';
+import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { MatCardModule } from '@angular/material/card';
import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { chevronForwardOutline } from 'ionicons/icons';
-import { Subject } from 'rxjs';
@Component({
host: { class: 'page' },
@@ -17,11 +16,9 @@ import { Subject } from 'rxjs';
styleUrls: ['./blog-page.scss'],
templateUrl: './blog-page.html'
})
-export class GfBlogPageComponent implements OnDestroy {
+export class GfBlogPageComponent {
public hasPermissionForSubscription: boolean;
- private unsubscribeSubject = new Subject();
-
public constructor(private dataService: DataService) {
const info = this.dataService.fetchInfo();
@@ -32,9 +29,4 @@ export class GfBlogPageComponent implements OnDestroy {
addIcons({ chevronForwardOutline });
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/pages/faq/faq-page.component.ts b/apps/client/src/app/pages/faq/faq-page.component.ts
index caf4217ca..83171254a 100644
--- a/apps/client/src/app/pages/faq/faq-page.component.ts
+++ b/apps/client/src/app/pages/faq/faq-page.component.ts
@@ -3,19 +3,13 @@ import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { DataService } from '@ghostfolio/ui/services';
-import {
- CUSTOM_ELEMENTS_SCHEMA,
- Component,
- OnDestroy,
- OnInit
-} from '@angular/core';
+import { CUSTOM_ELEMENTS_SCHEMA, Component, OnInit } from '@angular/core';
import { MatTabsModule } from '@angular/material/tabs';
import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { cloudyOutline, readerOutline, serverOutline } from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
@Component({
host: { class: 'page has-tabs' },
@@ -25,13 +19,11 @@ import { Subject } from 'rxjs';
styleUrls: ['./faq-page.scss'],
templateUrl: './faq-page.html'
})
-export class GfFaqPageComponent implements OnDestroy, OnInit {
+export class GfFaqPageComponent implements OnInit {
public deviceType: string;
public hasPermissionForSubscription: boolean;
public tabs: TabConfiguration[] = [];
- private unsubscribeSubject = new Subject();
-
public constructor(
private dataService: DataService,
private deviceService: DeviceDetectorService
@@ -68,9 +60,4 @@ export class GfFaqPageComponent implements OnDestroy, OnInit {
public ngOnInit() {
this.deviceType = this.deviceService.getDeviceInfo().deviceType;
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/pages/faq/faq-page.routes.ts b/apps/client/src/app/pages/faq/faq-page.routes.ts
index 2999e3c80..f80304a08 100644
--- a/apps/client/src/app/pages/faq/faq-page.routes.ts
+++ b/apps/client/src/app/pages/faq/faq-page.routes.ts
@@ -15,12 +15,12 @@ export const routes: Routes = [
import('./overview/faq-overview-page.routes').then((m) => m.routes)
},
{
- path: publicRoutes.faq.subRoutes.saas.path,
+ path: publicRoutes.faq.subRoutes?.saas.path,
loadChildren: () =>
import('./saas/saas-page.routes').then((m) => m.routes)
},
{
- path: publicRoutes.faq.subRoutes.selfHosting.path,
+ path: publicRoutes.faq.subRoutes?.selfHosting.path,
loadChildren: () =>
import('./self-hosting/self-hosting-page.routes').then(
(m) => m.routes
diff --git a/apps/client/src/app/pages/faq/saas/saas-page.component.ts b/apps/client/src/app/pages/faq/saas/saas-page.component.ts
index b47d45fe2..4429fe492 100644
--- a/apps/client/src/app/pages/faq/saas/saas-page.component.ts
+++ b/apps/client/src/app/pages/faq/saas/saas-page.component.ts
@@ -25,7 +25,7 @@ export class GfSaasPageComponent implements OnDestroy {
public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${publicRoutes.pricing.path}`;
public routerLinkAccount = internalRoutes.account.routerLink;
public routerLinkAccountMembership =
- internalRoutes.account.subRoutes.membership.routerLink;
+ internalRoutes.account.subRoutes?.membership.routerLink;
public routerLinkMarkets = publicRoutes.markets.routerLink;
public routerLinkRegister = publicRoutes.register.routerLink;
public user: User;
diff --git a/apps/client/src/app/pages/faq/saas/saas-page.routes.ts b/apps/client/src/app/pages/faq/saas/saas-page.routes.ts
index dcb574c38..d68893640 100644
--- a/apps/client/src/app/pages/faq/saas/saas-page.routes.ts
+++ b/apps/client/src/app/pages/faq/saas/saas-page.routes.ts
@@ -10,6 +10,6 @@ export const routes: Routes = [
canActivate: [AuthGuard],
component: GfSaasPageComponent,
path: '',
- title: `${publicRoutes.faq.subRoutes.saas.title} - ${publicRoutes.faq.title}`
+ title: `${publicRoutes.faq.subRoutes?.saas.title} - ${publicRoutes.faq.title}`
}
];
diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts
index ed1d74395..f2468c7d4 100644
--- a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts
+++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts
@@ -1,10 +1,9 @@
import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
-import { CUSTOM_ELEMENTS_SCHEMA, Component, OnDestroy } from '@angular/core';
+import { CUSTOM_ELEMENTS_SCHEMA, Component } from '@angular/core';
import { MatCardModule } from '@angular/material/card';
import { RouterModule } from '@angular/router';
-import { Subject } from 'rxjs';
@Component({
host: { class: 'page' },
@@ -14,13 +13,6 @@ import { Subject } from 'rxjs';
styleUrls: ['./self-hosting-page.scss'],
templateUrl: './self-hosting-page.html'
})
-export class GfSelfHostingPageComponent implements OnDestroy {
+export class GfSelfHostingPageComponent {
public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${publicRoutes.pricing.path}`;
-
- private unsubscribeSubject = new Subject();
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.routes.ts b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.routes.ts
index d08cdb312..ccf034421 100644
--- a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.routes.ts
+++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.routes.ts
@@ -10,6 +10,6 @@ export const routes: Routes = [
canActivate: [AuthGuard],
component: GfSelfHostingPageComponent,
path: '',
- title: `${publicRoutes.faq.subRoutes.selfHosting.title} - ${publicRoutes.faq.title}`
+ title: `${publicRoutes.faq.subRoutes?.selfHosting.title} - ${publicRoutes.faq.title}`
}
];
diff --git a/apps/client/src/app/pages/features/features-page.component.ts b/apps/client/src/app/pages/features/features-page.component.ts
index b9eb91fe2..cef90f2e5 100644
--- a/apps/client/src/app/pages/features/features-page.component.ts
+++ b/apps/client/src/app/pages/features/features-page.component.ts
@@ -5,11 +5,11 @@ import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { DataService } from '@ghostfolio/ui/services';
-import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core';
+import { ChangeDetectorRef, Component, DestroyRef } from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { RouterModule } from '@angular/router';
-import { Subject, takeUntil } from 'rxjs';
@Component({
host: { class: 'page' },
@@ -23,7 +23,7 @@ import { Subject, takeUntil } from 'rxjs';
styleUrls: ['./features-page.scss'],
templateUrl: './features-page.html'
})
-export class GfFeaturesPageComponent implements OnDestroy {
+export class GfFeaturesPageComponent {
public hasPermissionForSubscription: boolean;
public hasPermissionToCreateUser: boolean;
public info: InfoItem;
@@ -31,11 +31,10 @@ export class GfFeaturesPageComponent implements OnDestroy {
public routerLinkResources = publicRoutes.resources.routerLink;
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private userService: UserService
) {
this.info = this.dataService.fetchInfo();
@@ -43,7 +42,7 @@ export class GfFeaturesPageComponent implements OnDestroy {
public ngOnInit() {
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -62,9 +61,4 @@ export class GfFeaturesPageComponent implements OnDestroy {
permissions.createUserAccount
);
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/pages/home/home-page.component.ts b/apps/client/src/app/pages/home/home-page.component.ts
index fd860ced5..5130c8166 100644
--- a/apps/client/src/app/pages/home/home-page.component.ts
+++ b/apps/client/src/app/pages/home/home-page.component.ts
@@ -8,9 +8,10 @@ import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
- OnDestroy,
+ DestroyRef,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatTabsModule } from '@angular/material/tabs';
import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
@@ -23,8 +24,6 @@ import {
readerOutline
} from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
@Component({
host: { class: 'page has-tabs' },
@@ -34,22 +33,21 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./home-page.scss'],
templateUrl: './home-page.html'
})
-export class GfHomePageComponent implements OnDestroy, OnInit {
+export class GfHomePageComponent implements OnInit {
public deviceType: string;
public hasImpersonationId: boolean;
public tabs: TabConfiguration[] = [];
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private impersonationStorageService: ImpersonationStorageService,
private userService: UserService
) {
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -110,14 +108,9 @@ export class GfHomePageComponent implements OnDestroy, OnInit {
this.impersonationStorageService
.onChangeHasImpersonation()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((impersonationId) => {
this.hasImpersonationId = !!impersonationId;
});
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/pages/home/home-page.routes.ts b/apps/client/src/app/pages/home/home-page.routes.ts
index 82ef1e521..436826674 100644
--- a/apps/client/src/app/pages/home/home-page.routes.ts
+++ b/apps/client/src/app/pages/home/home-page.routes.ts
@@ -20,29 +20,29 @@ export const routes: Routes = [
component: GfHomeOverviewComponent
},
{
- path: internalRoutes.home.subRoutes.holdings.path,
+ path: internalRoutes.home.subRoutes?.holdings.path,
component: GfHomeHoldingsComponent,
- title: internalRoutes.home.subRoutes.holdings.title
+ title: internalRoutes.home.subRoutes?.holdings.title
},
{
- path: internalRoutes.home.subRoutes.summary.path,
+ path: internalRoutes.home.subRoutes?.summary.path,
component: GfHomeSummaryComponent,
- title: internalRoutes.home.subRoutes.summary.title
+ title: internalRoutes.home.subRoutes?.summary.title
},
{
- path: internalRoutes.home.subRoutes.markets.path,
+ path: internalRoutes.home.subRoutes?.markets.path,
component: GfHomeMarketComponent,
- title: internalRoutes.home.subRoutes.markets.title
+ title: internalRoutes.home.subRoutes?.markets.title
},
{
- path: internalRoutes.home.subRoutes.marketsPremium.path,
+ path: internalRoutes.home.subRoutes?.marketsPremium.path,
component: GfMarketsComponent,
- title: internalRoutes.home.subRoutes.marketsPremium.title
+ title: internalRoutes.home.subRoutes?.marketsPremium.title
},
{
- path: internalRoutes.home.subRoutes.watchlist.path,
+ path: internalRoutes.home.subRoutes?.watchlist.path,
component: GfHomeWatchlistComponent,
- title: internalRoutes.home.subRoutes.watchlist.title
+ title: internalRoutes.home.subRoutes?.watchlist.title
}
],
component: GfHomePageComponent,
diff --git a/apps/client/src/app/pages/i18n/i18n-page.component.ts b/apps/client/src/app/pages/i18n/i18n-page.component.ts
index 19ecd222e..76d123914 100644
--- a/apps/client/src/app/pages/i18n/i18n-page.component.ts
+++ b/apps/client/src/app/pages/i18n/i18n-page.component.ts
@@ -1,5 +1,4 @@
import { Component } from '@angular/core';
-import { Subject } from 'rxjs';
@Component({
host: { class: 'page' },
@@ -8,11 +7,4 @@ import { Subject } from 'rxjs';
styleUrls: ['./i18n-page.scss'],
templateUrl: './i18n-page.html'
})
-export class GfI18nPageComponent {
- private unsubscribeSubject = new Subject();
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-}
+export class GfI18nPageComponent {}
diff --git a/apps/client/src/app/pages/landing/landing-page.component.ts b/apps/client/src/app/pages/landing/landing-page.component.ts
index 25fb2d6e7..9ee9cceb4 100644
--- a/apps/client/src/app/pages/landing/landing-page.component.ts
+++ b/apps/client/src/app/pages/landing/landing-page.component.ts
@@ -9,7 +9,7 @@ import { GfValueComponent } from '@ghostfolio/ui/value';
import { GfWorldMapChartComponent } from '@ghostfolio/ui/world-map-chart';
import { CommonModule } from '@angular/common';
-import { Component, OnDestroy, OnInit } from '@angular/core';
+import { Component, OnInit } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { RouterModule } from '@angular/router';
@@ -21,7 +21,6 @@ import {
starOutline
} from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
@Component({
host: { class: 'page' },
@@ -40,7 +39,7 @@ import { Subject } from 'rxjs';
styleUrls: ['./landing-page.scss'],
templateUrl: './landing-page.html'
})
-export class GfLandingPageComponent implements OnDestroy, OnInit {
+export class GfLandingPageComponent implements OnInit {
public countriesOfSubscribersMap: {
[code: string]: { value: number };
} = {};
@@ -107,8 +106,6 @@ export class GfLandingPageComponent implements OnDestroy, OnInit {
}
];
- private unsubscribeSubject = new Subject();
-
public constructor(
private dataService: DataService,
private deviceService: DeviceDetectorService
@@ -155,9 +152,4 @@ export class GfLandingPageComponent implements OnDestroy, OnInit {
public ngOnInit() {
this.deviceType = this.deviceService.getDeviceInfo().deviceType;
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/pages/markets/markets-page.component.ts b/apps/client/src/app/pages/markets/markets-page.component.ts
index 1ab97c3e0..c70cb8120 100644
--- a/apps/client/src/app/pages/markets/markets-page.component.ts
+++ b/apps/client/src/app/pages/markets/markets-page.component.ts
@@ -1,7 +1,6 @@
import { GfHomeMarketComponent } from '@ghostfolio/client/components/home-market/home-market.component';
-import { Component, OnDestroy } from '@angular/core';
-import { Subject } from 'rxjs';
+import { Component } from '@angular/core';
@Component({
host: { class: 'page' },
@@ -10,11 +9,4 @@ import { Subject } from 'rxjs';
styleUrls: ['./markets-page.scss'],
templateUrl: './markets-page.html'
})
-export class GfMarketsPageComponent implements OnDestroy {
- private unsubscribeSubject = new Subject();
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-}
+export class GfMarketsPageComponent {}
diff --git a/apps/client/src/app/pages/open/open-page.component.ts b/apps/client/src/app/pages/open/open-page.component.ts
index 6284c41f4..090588d7d 100644
--- a/apps/client/src/app/pages/open/open-page.component.ts
+++ b/apps/client/src/app/pages/open/open-page.component.ts
@@ -7,11 +7,11 @@ import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
- OnDestroy,
+ DestroyRef,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatCardModule } from '@angular/material/card';
-import { Subject, takeUntil } from 'rxjs';
@Component({
host: { class: 'page' },
@@ -21,15 +21,14 @@ import { Subject, takeUntil } from 'rxjs';
styleUrls: ['./open-page.scss'],
templateUrl: './open-page.html'
})
-export class GfOpenPageComponent implements OnDestroy, OnInit {
+export class GfOpenPageComponent implements OnInit {
public statistics: Statistics;
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private userService: UserService
) {
const { statistics } = this.dataService.fetchInfo();
@@ -39,7 +38,7 @@ export class GfOpenPageComponent implements OnDestroy, OnInit {
public ngOnInit() {
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -48,9 +47,4 @@ export class GfOpenPageComponent implements OnDestroy, OnInit {
}
});
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
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 cf7a41215..faadef54f 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
@@ -10,10 +10,17 @@ import {
User
} from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
+import { DateRange } from '@ghostfolio/common/types';
import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table';
import { DataService } from '@ghostfolio/ui/services';
-import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
+import {
+ ChangeDetectorRef,
+ Component,
+ DestroyRef,
+ OnInit
+} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MatDialog } from '@angular/material/dialog';
import { PageEvent } from '@angular/material/paginator';
@@ -26,8 +33,7 @@ import { format, parseISO } from 'date-fns';
import { addIcons } from 'ionicons';
import { addOutline } from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject, Subscription } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
+import { Subscription } from 'rxjs';
import { GfCreateOrUpdateActivityDialogComponent } from './create-or-update-activity-dialog/create-or-update-activity-dialog.component';
import { CreateOrUpdateActivityDialogParams } from './create-or-update-activity-dialog/interfaces/interfaces';
@@ -47,7 +53,8 @@ import { ImportActivitiesDialogParams } from './import-activities-dialog/interfa
styleUrls: ['./activities-page.scss'],
templateUrl: './activities-page.html'
})
-export class GfActivitiesPageComponent implements OnDestroy, OnInit {
+export class GfActivitiesPageComponent implements OnInit {
+ public activityTypesFilter: string[] = [];
public dataSource: MatTableDataSource;
public deviceType: string;
public hasImpersonationId: boolean;
@@ -61,11 +68,10 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
public totalItems: number;
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private dialog: MatDialog,
private icsService: IcsService,
@@ -75,13 +81,13 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
private userService: UserService
) {
this.routeQueryParams = route.queryParams
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((params) => {
if (params['createDialog']) {
if (params['activityId']) {
this.dataService
.fetchActivity(params['activityId'])
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((activity) => {
this.openCreateActivityDialog(activity);
});
@@ -92,7 +98,7 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
if (params['activityId']) {
this.dataService
.fetchActivity(params['activityId'])
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((activity) => {
this.openUpdateActivityDialog(activity);
});
@@ -110,13 +116,13 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
this.impersonationStorageService
.onChangeHasImpersonation()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((impersonationId) => {
this.hasImpersonationId = !!impersonationId;
});
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.updateUser(state.user);
@@ -129,15 +135,23 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
}
public fetchActivities() {
+ const dateRange = this.user?.settings?.dateRange;
+
+ const range = this.isCalendarYear(dateRange) ? dateRange : undefined;
+
this.dataService
.fetchActivities({
+ range,
+ activityTypes: this.activityTypesFilter.length
+ ? this.activityTypesFilter
+ : undefined,
filters: this.userService.getFilters(),
skip: this.pageIndex * this.pageSize,
sortColumn: this.sortColumn,
sortDirection: this.sortDirection,
take: this.pageSize
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ activities, count }) => {
this.dataSource = new MatTableDataSource(activities);
this.totalItems = count;
@@ -178,11 +192,11 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
.deleteActivities({
filters: this.userService.getFilters()
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe();
this.fetchActivities();
@@ -192,11 +206,11 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
public onDeleteActivity(aId: string) {
this.dataService
.deleteActivity(aId)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe();
this.fetchActivities();
@@ -207,12 +221,17 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
let fetchExportParams: any = { activityIds };
if (!activityIds) {
- fetchExportParams = { filters: this.userService.getFilters() };
+ fetchExportParams = {
+ activityTypes: this.activityTypesFilter.length
+ ? this.activityTypesFilter
+ : undefined,
+ filters: this.userService.getFilters()
+ };
}
this.dataService
.fetchExport(fetchExportParams)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((data) => {
for (const activity of data.activities) {
delete activity.id;
@@ -232,7 +251,7 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
public onExportDrafts(activityIds?: string[]) {
this.dataService
.fetchExport({ activityIds })
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((data) => {
downloadAsFile({
content: this.icsService.transformActivitiesToIcsContent(
@@ -262,11 +281,11 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
dialogRef
.afterClosed()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe();
this.fetchActivities();
@@ -289,11 +308,11 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
dialogRef
.afterClosed()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe();
this.fetchActivities();
@@ -308,6 +327,13 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
this.fetchActivities();
}
+ public onTypesFilterChanged(aTypes: string[]) {
+ this.activityTypesFilter = aTypes;
+ this.pageIndex = 0;
+
+ this.fetchActivities();
+ }
+
public onUpdateActivity(aActivity: Activity) {
this.router.navigate([], {
queryParams: { activityId: aActivity.id, editDialog: true }
@@ -330,12 +356,12 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
dialogRef
.afterClosed()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((activity: UpdateOrderDto) => {
if (activity) {
this.dataService
- .putOrder(activity)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .putActivity(activity)
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe({
next: () => {
this.fetchActivities();
@@ -347,15 +373,18 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
});
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
+ private isCalendarYear(dateRange: DateRange) {
+ if (!dateRange) {
+ return false;
+ }
+
+ return /^\d{4}$/.test(dateRange);
}
private openCreateActivityDialog(aActivity?: Activity) {
this.userService
.get()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((user) => {
this.updateUser(user);
@@ -382,14 +411,14 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
dialogRef
.afterClosed()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((transaction: CreateOrderDto | null) => {
if (transaction) {
- this.dataService.postOrder(transaction).subscribe({
+ this.dataService.postActivity(transaction).subscribe({
next: () => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe();
this.fetchActivities();
@@ -407,9 +436,9 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
this.hasPermissionToCreateActivity =
!this.hasImpersonationId &&
- hasPermission(this.user.permissions, permissions.createOrder);
+ hasPermission(this.user.permissions, permissions.createActivity);
this.hasPermissionToDeleteActivity =
!this.hasImpersonationId &&
- hasPermission(this.user.permissions, permissions.deleteOrder);
+ hasPermission(this.user.permissions, permissions.deleteActivity);
}
}
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 80ad71b79..2a72dcfd2 100644
--- a/apps/client/src/app/pages/portfolio/activities/activities-page.html
+++ b/apps/client/src/app/pages/portfolio/activities/activities-page.html
@@ -10,6 +10,7 @@
[hasPermissionToCreateActivity]="hasPermissionToCreateActivity"
[hasPermissionToDeleteActivity]="hasPermissionToDeleteActivity"
[hasPermissionToExportActivities]="!hasImpersonationId"
+ [hasPermissionToFilterByType]="user?.settings?.isExperimentalFeatures"
[locale]="user?.settings?.locale"
[pageIndex]="pageIndex"
[pageSize]="pageSize"
@@ -32,6 +33,7 @@
(importDividends)="onImportDividends()"
(pageChanged)="onChangePage($event)"
(sortChanged)="onSortChanged($event)"
+ (typesFilterChanged)="onTypesFilterChanged($event)"
/>
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 c96c8a558..e1c75f6cc 100644
--- a/apps/client/src/app/pages/portfolio/activities/activities-page.routes.ts
+++ b/apps/client/src/app/pages/portfolio/activities/activities-page.routes.ts
@@ -10,6 +10,6 @@ export const routes: Routes = [
canActivate: [AuthGuard],
component: GfActivitiesPageComponent,
path: '',
- title: internalRoutes.portfolio.subRoutes.activities.title
+ title: internalRoutes.portfolio.subRoutes?.activities.title
}
];
diff --git a/apps/client/src/app/pages/portfolio/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 c7cd63191..9cc312b25 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
@@ -20,9 +20,10 @@ import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
- Inject,
- OnDestroy
+ DestroyRef,
+ Inject
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import {
FormBuilder,
FormGroup,
@@ -46,8 +47,8 @@ import { AssetClass, Tag, Type } from '@prisma/client';
import { isAfter, isToday } from 'date-fns';
import { addIcons } from 'ionicons';
import { calendarClearOutline, refreshOutline } from 'ionicons/icons';
-import { EMPTY, Subject } from 'rxjs';
-import { catchError, delay, takeUntil } from 'rxjs/operators';
+import { EMPTY } from 'rxjs';
+import { catchError, delay } from 'rxjs/operators';
import { CreateOrUpdateActivityDialogParams } from './interfaces/interfaces';
import { ActivityType } from './types/activity-type.type';
@@ -75,7 +76,7 @@ import { ActivityType } from './types/activity-type.type';
styleUrls: ['./create-or-update-activity-dialog.scss'],
templateUrl: 'create-or-update-activity-dialog.html'
})
-export class GfCreateOrUpdateActivityDialogComponent implements OnDestroy {
+export class GfCreateOrUpdateActivityDialogComponent {
public activityForm: FormGroup;
public assetClassOptions: AssetClassSelectorOption[] = Object.keys(AssetClass)
@@ -101,13 +102,12 @@ export class GfCreateOrUpdateActivityDialogComponent implements OnDestroy {
public typesTranslationMap = new Map
();
public Validators = Validators;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
@Inject(MAT_DIALOG_DATA) public data: CreateOrUpdateActivityDialogParams,
private dataService: DataService,
private dateAdapter: DateAdapter,
+ private destroyRef: DestroyRef,
public dialogRef: MatDialogRef,
private formBuilder: FormBuilder,
@Inject(MAT_DATE_LOCALE) private locale: string,
@@ -133,7 +133,7 @@ export class GfCreateOrUpdateActivityDialogComponent implements OnDestroy {
this.dataService
.fetchPortfolioHoldings()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ holdings }) => {
this.defaultLookupItems = holdings
.filter(({ assetSubClass }) => {
@@ -237,7 +237,7 @@ export class GfCreateOrUpdateActivityDialogComponent implements OnDestroy {
// Slightly delay until the more specific form control value changes have
// completed
delay(300),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
)
.subscribe(async () => {
if (
@@ -284,7 +284,7 @@ export class GfCreateOrUpdateActivityDialogComponent implements OnDestroy {
this.activityForm
.get('assetClass')
- .valueChanges.pipe(takeUntil(this.unsubscribeSubject))
+ .valueChanges.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((assetClass) => {
const assetSubClasses = ASSET_CLASS_MAPPING.get(assetClass) ?? [];
@@ -335,7 +335,7 @@ export class GfCreateOrUpdateActivityDialogComponent implements OnDestroy {
if (newTag && this.hasPermissionToCreateOwnTag) {
this.dataService
.postTag({ ...newTag, userId: this.data.user.id })
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((tag) => {
this.activityForm.get('tags').setValue(
tags.map((currentTag) => {
@@ -349,7 +349,7 @@ export class GfCreateOrUpdateActivityDialogComponent implements OnDestroy {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe();
});
}
@@ -357,7 +357,7 @@ export class GfCreateOrUpdateActivityDialogComponent implements OnDestroy {
this.activityForm
.get('type')
- .valueChanges.pipe(takeUntil(this.unsubscribeSubject))
+ .valueChanges.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((type: ActivityType) => {
if (
type === 'VALUABLE' ||
@@ -465,7 +465,7 @@ export class GfCreateOrUpdateActivityDialogComponent implements OnDestroy {
dataSource: this.data.activity?.SymbolProfile?.dataSource,
symbol: this.data.activity?.SymbolProfile?.symbol
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ marketPrice }) => {
this.currentMarketPrice = marketPrice;
@@ -557,11 +557,6 @@ export class GfCreateOrUpdateActivityDialogComponent implements OnDestroy {
}
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private updateAssetProfile() {
this.isLoading = true;
this.changeDetectorRef.markForCheck();
@@ -581,7 +576,7 @@ export class GfCreateOrUpdateActivityDialogComponent implements OnDestroy {
return EMPTY;
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
)
.subscribe(({ currency, dataSource, marketPrice }) => {
if (this.mode === 'create') {
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 1a84e9f31..00f0508fe 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
@@ -21,9 +21,10 @@ import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
- Inject,
- OnDestroy
+ DestroyRef,
+ Inject
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import {
FormBuilder,
FormGroup,
@@ -52,7 +53,6 @@ import { cloudUploadOutline, warningOutline } from 'ionicons/icons';
import { isArray, sortBy } from 'lodash';
import ms from 'ms';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject, takeUntil } from 'rxjs';
import { ImportStep } from './enums/import-step';
import { ImportActivitiesDialogParams } from './interfaces/interfaces';
@@ -81,7 +81,7 @@ import { ImportActivitiesDialogParams } from './interfaces/interfaces';
styleUrls: ['./import-activities-dialog.scss'],
templateUrl: 'import-activities-dialog.html'
})
-export class GfImportActivitiesDialogComponent implements OnDestroy {
+export class GfImportActivitiesDialogComponent {
public accounts: CreateAccountWithBalancesDto[] = [];
public activities: Activity[] = [];
public assetProfileForm: FormGroup;
@@ -104,12 +104,11 @@ export class GfImportActivitiesDialogComponent implements OnDestroy {
public tags: CreateTagDto[] = [];
public totalItems: number;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
@Inject(MAT_DIALOG_DATA) public data: ImportActivitiesDialogParams,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private formBuilder: FormBuilder,
public dialogRef: MatDialogRef,
@@ -152,7 +151,7 @@ export class GfImportActivitiesDialogComponent implements OnDestroy {
],
range: 'max'
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ holdings }) => {
this.holdings = sortBy(holdings, ({ name }) => {
return name.toLowerCase();
@@ -237,7 +236,7 @@ export class GfImportActivitiesDialogComponent implements OnDestroy {
dataSource,
symbol
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ activities }) => {
this.activities = activities;
this.dataSource = new MatTableDataSource(activities.reverse());
@@ -284,11 +283,6 @@ export class GfImportActivitiesDialogComponent implements OnDestroy {
});
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private async handleFile({
file,
stepper
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 70fa09eb1..367716d2d 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
@@ -22,7 +22,13 @@ import { GfValueComponent } from '@ghostfolio/ui/value';
import { GfWorldMapChartComponent } from '@ghostfolio/ui/world-map-chart';
import { NgClass } from '@angular/common';
-import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
+import {
+ ChangeDetectorRef,
+ Component,
+ DestroyRef,
+ OnInit
+} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatCardModule } from '@angular/material/card';
import { MatDialog } from '@angular/material/dialog';
import { MatProgressBarModule } from '@angular/material/progress-bar';
@@ -36,8 +42,6 @@ import {
} from '@prisma/client';
import { isNumber } from 'lodash';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
@Component({
imports: [
@@ -54,7 +58,7 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./allocations-page.scss'],
templateUrl: './allocations-page.html'
})
-export class GfAllocationsPageComponent implements OnDestroy, OnInit {
+export class GfAllocationsPageComponent implements OnInit {
public accounts: {
[id: string]: Pick & {
id: string;
@@ -119,11 +123,10 @@ export class GfAllocationsPageComponent implements OnDestroy, OnInit {
public user: User;
public worldMapChartFormat: string;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private dialog: MatDialog,
private impersonationStorageService: ImpersonationStorageService,
@@ -132,7 +135,7 @@ export class GfAllocationsPageComponent implements OnDestroy, OnInit {
private userService: UserService
) {
this.route.queryParams
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((params) => {
if (params['accountId'] && params['accountDetailDialog']) {
this.openAccountDetailDialog(params['accountId']);
@@ -145,13 +148,13 @@ export class GfAllocationsPageComponent implements OnDestroy, OnInit {
this.impersonationStorageService
.onChangeHasImpersonation()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((impersonationId) => {
this.hasImpersonationId = !!impersonationId;
});
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -166,7 +169,7 @@ export class GfAllocationsPageComponent implements OnDestroy, OnInit {
this.initialize();
this.fetchPortfolioDetails()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((portfolioDetails) => {
this.initialize();
@@ -202,11 +205,6 @@ export class GfAllocationsPageComponent implements OnDestroy, OnInit {
}
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private extractEtfProvider({
assetSubClass,
name
@@ -407,17 +405,22 @@ export class GfAllocationsPageComponent implements OnDestroy, OnInit {
}
if (position.holdings.length > 0) {
- for (const holding of position.holdings) {
- const { allocationInPercentage, name, valueInBaseCurrency } =
- holding;
-
- if (this.topHoldingsMap[name]?.value) {
- this.topHoldingsMap[name].value += isNumber(valueInBaseCurrency)
+ for (const {
+ allocationInPercentage,
+ name,
+ valueInBaseCurrency
+ } of position.holdings) {
+ const normalizedAssetName = this.normalizeAssetName(name);
+
+ if (this.topHoldingsMap[normalizedAssetName]?.value) {
+ this.topHoldingsMap[normalizedAssetName].value += isNumber(
+ valueInBaseCurrency
+ )
? valueInBaseCurrency
: allocationInPercentage *
this.portfolioDetails.holdings[symbol].valueInPercentage;
} else {
- this.topHoldingsMap[name] = {
+ this.topHoldingsMap[normalizedAssetName] = {
name,
value: isNumber(valueInBaseCurrency)
? valueInBaseCurrency
@@ -520,7 +523,10 @@ export class GfAllocationsPageComponent implements OnDestroy, OnInit {
if (holding.holdings.length > 0) {
const currentParentHolding = holding.holdings.find(
(parentHolding) => {
- return parentHolding.name === name;
+ return (
+ this.normalizeAssetName(parentHolding.name) ===
+ this.normalizeAssetName(name)
+ );
}
);
@@ -557,6 +563,14 @@ export class GfAllocationsPageComponent implements OnDestroy, OnInit {
}
}
+ private normalizeAssetName(name: string) {
+ if (!name) {
+ return '';
+ }
+
+ return name.trim().toLowerCase();
+ }
+
private openAccountDetailDialog(aAccountId: string) {
const dialogRef = this.dialog.open<
GfAccountDetailDialogComponent,
@@ -569,7 +583,7 @@ export class GfAllocationsPageComponent implements OnDestroy, OnInit {
hasImpersonationId: this.hasImpersonationId,
hasPermissionToCreateActivity:
!this.hasImpersonationId &&
- hasPermission(this.user?.permissions, permissions.createOrder) &&
+ hasPermission(this.user?.permissions, permissions.createActivity) &&
!this.user?.settings?.isRestrictedView
},
height: this.deviceType === 'mobile' ? '98vh' : '80vh',
@@ -578,7 +592,7 @@ export class GfAllocationsPageComponent implements OnDestroy, OnInit {
dialogRef
.afterClosed()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.router.navigate(['.'], { relativeTo: this.route });
});
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 5cd24777c..47845ea6f 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
@@ -24,10 +24,11 @@ import { Clipboard } from '@angular/cdk/clipboard';
import {
ChangeDetectorRef,
Component,
- OnDestroy,
+ DestroyRef,
OnInit,
ViewChild
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';
@@ -42,8 +43,6 @@ import { isNumber, sortBy } from 'lodash';
import ms from 'ms';
import { DeviceDetectorService } from 'ngx-device-detector';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
@Component({
imports: [
@@ -64,7 +63,7 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./analysis-page.scss'],
templateUrl: './analysis-page.html'
})
-export class GfAnalysisPageComponent implements OnDestroy, OnInit {
+export class GfAnalysisPageComponent implements OnInit {
@ViewChild(MatMenuTrigger) actionsMenuButton!: MatMenuTrigger;
public benchmark: Partial;
@@ -102,12 +101,11 @@ export class GfAnalysisPageComponent implements OnDestroy, OnInit {
public unitLongestStreak: string;
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private clipboard: Clipboard,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private impersonationStorageService: ImpersonationStorageService,
private snackBar: MatSnackBar,
@@ -135,13 +133,13 @@ export class GfAnalysisPageComponent implements OnDestroy, OnInit {
this.impersonationStorageService
.onChangeHasImpersonation()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((impersonationId) => {
this.hasImpersonationId = !!impersonationId;
});
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -163,11 +161,11 @@ export class GfAnalysisPageComponent implements OnDestroy, OnInit {
public onChangeBenchmark(symbolProfileId: string) {
this.dataService
.putUserSetting({ benchmark: symbolProfileId })
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((user) => {
this.user = user;
@@ -193,7 +191,7 @@ export class GfAnalysisPageComponent implements OnDestroy, OnInit {
mode,
filters: this.userService.getFilters()
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ prompt }) => {
this.clipboard.copy(prompt);
@@ -207,7 +205,7 @@ export class GfAnalysisPageComponent implements OnDestroy, OnInit {
snackBarRef
.onAction()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
window.open('https://duck.ai', '_blank');
});
@@ -222,11 +220,6 @@ export class GfAnalysisPageComponent implements OnDestroy, OnInit {
});
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private fetchDividendsAndInvestments() {
this.isLoadingDividendTimelineChart = true;
this.isLoadingInvestmentTimelineChart = true;
@@ -237,7 +230,7 @@ export class GfAnalysisPageComponent implements OnDestroy, OnInit {
groupBy: this.mode,
range: this.user?.settings?.dateRange
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ dividends }) => {
this.dividendsByGroup = dividends;
@@ -252,7 +245,7 @@ export class GfAnalysisPageComponent implements OnDestroy, OnInit {
groupBy: this.mode,
range: this.user?.settings?.dateRange
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ investments, streaks }) => {
this.investmentsByGroup = investments;
this.streaks = streaks;
@@ -287,7 +280,7 @@ export class GfAnalysisPageComponent implements OnDestroy, OnInit {
filters: this.userService.getFilters(),
range: this.user?.settings?.dateRange
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ chart, firstOrderDate, performance }) => {
this.firstOrderDate = firstOrderDate ?? new Date();
@@ -346,7 +339,7 @@ export class GfAnalysisPageComponent implements OnDestroy, OnInit {
filters: this.userService.getFilters(),
range: this.user?.settings?.dateRange
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ holdings }) => {
const holdingsSorted = sortBy(
holdings.filter(({ netPerformancePercentWithCurrencyEffect }) => {
@@ -397,7 +390,7 @@ export class GfAnalysisPageComponent implements OnDestroy, OnInit {
range: this.user?.settings?.dateRange,
startDate: this.firstOrderDate
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ marketData }) => {
this.benchmarkDataItems = marketData.map(({ date, value }) => {
return {
diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.routes.ts b/apps/client/src/app/pages/portfolio/analysis/analysis-page.routes.ts
index 91cf4c91b..343d6ced5 100644
--- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.routes.ts
+++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.routes.ts
@@ -10,6 +10,6 @@ export const routes: Routes = [
canActivate: [AuthGuard],
component: GfAnalysisPageComponent,
path: '',
- title: internalRoutes.portfolio.subRoutes.analysis.title
+ title: internalRoutes.portfolio.subRoutes?.analysis.title
}
];
diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts b/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts
index 27db6c76e..2f7568982 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
@@ -12,14 +12,18 @@ import { DataService } from '@ghostfolio/ui/services';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule, NgStyle } from '@angular/common';
-import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
+import {
+ ChangeDetectorRef,
+ Component,
+ DestroyRef,
+ OnInit
+} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { FormControl } from '@angular/forms';
import { Big } from 'big.js';
import { DeviceDetectorService } from 'ngx-device-detector';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
@Component({
imports: [
@@ -36,7 +40,7 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./fire-page.scss'],
templateUrl: './fire-page.html'
})
-export class GfFirePageComponent implements OnDestroy, OnInit {
+export class GfFirePageComponent implements OnInit {
public deviceType: string;
public fireWealth: FireWealth;
public hasImpersonationId: boolean;
@@ -52,11 +56,10 @@ export class GfFirePageComponent implements OnDestroy, OnInit {
public withdrawalRatePerYear: Big;
public withdrawalRatePerYearProjected: Big;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private impersonationStorageService: ImpersonationStorageService,
private userService: UserService
@@ -68,7 +71,7 @@ export class GfFirePageComponent implements OnDestroy, OnInit {
this.dataService
.fetchPortfolioDetails()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ summary }) => {
this.fireWealth = {
today: {
@@ -92,19 +95,19 @@ export class GfFirePageComponent implements OnDestroy, OnInit {
this.impersonationStorageService
.onChangeHasImpersonation()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((impersonationId) => {
this.hasImpersonationId = !!impersonationId;
});
this.safeWithdrawalRateControl.valueChanges
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((value) => {
this.onSafeWithdrawalRateChange(Number(value));
});
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -132,11 +135,11 @@ export class GfFirePageComponent implements OnDestroy, OnInit {
public onAnnualInterestRateChange(annualInterestRate: number) {
this.dataService
.putUserSetting({ annualInterestRate })
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((user) => {
this.user = user;
@@ -163,11 +166,11 @@ export class GfFirePageComponent implements OnDestroy, OnInit {
retirementDate: retirementDate.toISOString(),
projectedTotalAmount: null
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((user) => {
this.user = user;
@@ -179,11 +182,11 @@ export class GfFirePageComponent implements OnDestroy, OnInit {
public onSafeWithdrawalRateChange(safeWithdrawalRate: number) {
this.dataService
.putUserSetting({ safeWithdrawalRate })
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((user) => {
this.user = user;
@@ -198,11 +201,11 @@ export class GfFirePageComponent implements OnDestroy, OnInit {
public onSavingsRateChange(savingsRate: number) {
this.dataService
.putUserSetting({ savingsRate })
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((user) => {
this.user = user;
@@ -217,11 +220,11 @@ export class GfFirePageComponent implements OnDestroy, OnInit {
projectedTotalAmount,
retirementDate: null
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((user) => {
this.user = user;
@@ -230,11 +233,6 @@ export class GfFirePageComponent implements OnDestroy, OnInit {
});
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private calculateWithdrawalRates() {
if (this.fireWealth && this.user?.settings?.safeWithdrawalRate) {
this.withdrawalRatePerYear = new Big(
diff --git a/apps/client/src/app/pages/portfolio/portfolio-page.component.ts b/apps/client/src/app/pages/portfolio/portfolio-page.component.ts
index 387e3fd0f..eb4935127 100644
--- a/apps/client/src/app/pages/portfolio/portfolio-page.component.ts
+++ b/apps/client/src/app/pages/portfolio/portfolio-page.component.ts
@@ -2,7 +2,13 @@ import { UserService } from '@ghostfolio/client/services/user/user.service';
import { TabConfiguration, User } from '@ghostfolio/common/interfaces';
import { internalRoutes } from '@ghostfolio/common/routes/routes';
-import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
+import {
+ ChangeDetectorRef,
+ Component,
+ DestroyRef,
+ OnInit
+} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatTabsModule } from '@angular/material/tabs';
import { RouterModule } from '@angular/router';
import { addIcons } from 'ionicons';
@@ -14,8 +20,6 @@ import {
swapVerticalOutline
} from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
@Component({
host: { class: 'page has-tabs' },
@@ -24,20 +28,19 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./portfolio-page.scss'],
templateUrl: './portfolio-page.html'
})
-export class PortfolioPageComponent implements OnDestroy, OnInit {
+export class PortfolioPageComponent implements OnInit {
public deviceType: string;
public tabs: TabConfiguration[] = [];
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private userService: UserService
) {
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.tabs = [
@@ -87,9 +90,4 @@ export class PortfolioPageComponent implements OnDestroy, OnInit {
public ngOnInit() {
this.deviceType = this.deviceService.getDeviceInfo().deviceType;
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/pages/portfolio/portfolio-page.routes.ts b/apps/client/src/app/pages/portfolio/portfolio-page.routes.ts
index aeebf4a6b..a4fdc3f61 100644
--- a/apps/client/src/app/pages/portfolio/portfolio-page.routes.ts
+++ b/apps/client/src/app/pages/portfolio/portfolio-page.routes.ts
@@ -15,22 +15,22 @@ export const routes: Routes = [
import('./analysis/analysis-page.routes').then((m) => m.routes)
},
{
- path: internalRoutes.portfolio.subRoutes.activities.path,
+ path: internalRoutes.portfolio.subRoutes?.activities.path,
loadChildren: () =>
import('./activities/activities-page.routes').then((m) => m.routes)
},
{
- path: internalRoutes.portfolio.subRoutes.allocations.path,
+ path: internalRoutes.portfolio.subRoutes?.allocations.path,
loadChildren: () =>
import('./allocations/allocations-page.routes').then((m) => m.routes)
},
{
- path: internalRoutes.portfolio.subRoutes.fire.path,
+ path: internalRoutes.portfolio.subRoutes?.fire.path,
loadChildren: () =>
import('./fire/fire-page.routes').then((m) => m.routes)
},
{
- path: internalRoutes.portfolio.subRoutes.xRay.path,
+ path: internalRoutes.portfolio.subRoutes?.xRay.path,
loadChildren: () =>
import('./x-ray/x-ray-page.routes').then((m) => m.routes)
}
diff --git a/apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.ts b/apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.ts
index 70b748b10..e97fd4876 100644
--- a/apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.ts
+++ b/apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.ts
@@ -12,7 +12,8 @@ import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { DataService } from '@ghostfolio/ui/services';
import { NgClass } from '@angular/common';
-import { ChangeDetectorRef, Component } from '@angular/core';
+import { ChangeDetectorRef, Component, DestroyRef } from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import {
@@ -21,7 +22,6 @@ import {
warningOutline
} from 'ionicons/icons';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
-import { Subject, takeUntil } from 'rxjs';
@Component({
imports: [
@@ -48,11 +48,10 @@ export class GfXRayPageComponent {
public statistics: PortfolioReportResponse['xRay']['statistics'];
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private impersonationStorageService: ImpersonationStorageService,
private userService: UserService
) {
@@ -62,13 +61,13 @@ export class GfXRayPageComponent {
public ngOnInit() {
this.impersonationStorageService
.onChangeHasImpersonation()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((impersonationId) => {
this.hasImpersonationId = !!impersonationId;
});
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -91,28 +90,23 @@ export class GfXRayPageComponent {
public onRulesUpdated(event: UpdateUserSettingDto) {
this.dataService
.putUserSetting(event)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.userService
.get(true)
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe();
this.initializePortfolioReport();
});
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private initializePortfolioReport() {
this.isLoading = true;
this.dataService
.fetchPortfolioReport()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ xRay: { categories, statistics } }) => {
this.categories = categories;
this.inactiveRules = this.mergeInactiveRules(categories);
diff --git a/apps/client/src/app/pages/pricing/pricing-page.component.ts b/apps/client/src/app/pages/pricing/pricing-page.component.ts
index 831f0809c..08c561fc8 100644
--- a/apps/client/src/app/pages/pricing/pricing-page.component.ts
+++ b/apps/client/src/app/pages/pricing/pricing-page.component.ts
@@ -12,9 +12,10 @@ import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
- OnDestroy,
+ DestroyRef,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { MatTooltipModule } from '@angular/material/tooltip';
@@ -27,8 +28,8 @@ import {
informationCircleOutline
} from 'ionicons/icons';
import { StringValue } from 'ms';
-import { EMPTY, Subject } from 'rxjs';
-import { catchError, takeUntil } from 'rxjs/operators';
+import { EMPTY } from 'rxjs';
+import { catchError } from 'rxjs/operators';
@Component({
host: { class: 'page' },
@@ -46,7 +47,7 @@ import { catchError, takeUntil } from 'rxjs/operators';
styleUrls: ['./pricing-page.scss'],
templateUrl: './pricing-page.html'
})
-export class GfPricingPageComponent implements OnDestroy, OnInit {
+export class GfPricingPageComponent implements OnInit {
public baseCurrency: string;
public coupon: number;
public couponId: string;
@@ -92,11 +93,10 @@ export class GfPricingPageComponent implements OnDestroy, OnInit {
public routerLinkRegister = publicRoutes.register.routerLink;
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private notificationService: NotificationService,
private userService: UserService
) {
@@ -124,7 +124,7 @@ export class GfPricingPageComponent implements OnDestroy, OnInit {
this.price = subscriptionOffer?.price;
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -161,15 +161,10 @@ export class GfPricingPageComponent implements OnDestroy, OnInit {
return EMPTY;
}),
- takeUntil(this.unsubscribeSubject)
+ takeUntilDestroyed(this.destroyRef)
)
.subscribe(({ sessionUrl }) => {
window.location.href = sessionUrl;
});
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
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 fe4b295db..9ccbbf52e 100644
--- a/apps/client/src/app/pages/public/public-page.component.ts
+++ b/apps/client/src/app/pages/public/public-page.component.ts
@@ -19,8 +19,10 @@ import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
+ DestroyRef,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { MatTableDataSource } from '@angular/material/table';
@@ -29,8 +31,8 @@ import { AssetClass } from '@prisma/client';
import { StatusCodes } from 'http-status-codes';
import { isNumber } from 'lodash';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { EMPTY, Subject } from 'rxjs';
-import { catchError, takeUntil } from 'rxjs/operators';
+import { EMPTY } from 'rxjs';
+import { catchError } from 'rxjs/operators';
@Component({
host: { class: 'page' },
@@ -83,12 +85,12 @@ export class GfPublicPageComponent implements OnInit {
public UNKNOWN_KEY = UNKNOWN_KEY;
private accessId: string;
- private unsubscribeSubject = new Subject();
public constructor(
private activatedRoute: ActivatedRoute,
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private router: Router
) {
@@ -110,7 +112,7 @@ export class GfPublicPageComponent implements OnInit {
this.dataService
.fetchPublicPortfolio(this.accessId)
.pipe(
- takeUntil(this.unsubscribeSubject),
+ takeUntilDestroyed(this.destroyRef),
catchError((error) => {
if (error.status === StatusCodes.NOT_FOUND) {
console.error(error);
@@ -246,9 +248,4 @@ export class GfPublicPageComponent implements OnInit {
};
}
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/pages/register/register-page.component.ts b/apps/client/src/app/pages/register/register-page.component.ts
index 21b26944e..db199143f 100644
--- a/apps/client/src/app/pages/register/register-page.component.ts
+++ b/apps/client/src/app/pages/register/register-page.component.ts
@@ -1,4 +1,5 @@
import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
+import { UserService } from '@ghostfolio/client/services/user/user.service';
import { InfoItem, LineChartItem } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { GfLogoComponent } from '@ghostfolio/ui/logo';
@@ -7,15 +8,14 @@ import { DataService } from '@ghostfolio/ui/services';
import {
Component,
CUSTOM_ELEMENTS_SCHEMA,
- OnDestroy,
+ DestroyRef,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MatDialog } from '@angular/material/dialog';
import { Router, RouterModule } from '@angular/router';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
import { UserAccountRegistrationDialogParams } from './user-account-registration-dialog/interfaces/interfaces';
import { GfUserAccountRegistrationDialogComponent } from './user-account-registration-dialog/user-account-registration-dialog.component';
@@ -28,7 +28,7 @@ import { GfUserAccountRegistrationDialogComponent } from './user-account-registr
styleUrls: ['./register-page.scss'],
templateUrl: './register-page.html'
})
-export class GfRegisterPageComponent implements OnDestroy, OnInit {
+export class GfRegisterPageComponent implements OnInit {
public deviceType: string;
public hasPermissionForAuthGoogle: boolean;
public hasPermissionForAuthToken: boolean;
@@ -37,18 +37,18 @@ export class GfRegisterPageComponent implements OnDestroy, OnInit {
public historicalDataItems: LineChartItem[];
public info: InfoItem;
- private unsubscribeSubject = new Subject();
-
public constructor(
private dataService: DataService,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private dialog: MatDialog,
private router: Router,
- private tokenStorageService: TokenStorageService
+ private tokenStorageService: TokenStorageService,
+ private userService: UserService
) {
this.info = this.dataService.fetchInfo();
- this.tokenStorageService.signOut();
+ this.userService.signOut();
}
public ngOnInit() {
@@ -93,7 +93,7 @@ export class GfRegisterPageComponent implements OnDestroy, OnInit {
dialogRef
.afterClosed()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((authToken) => {
if (authToken) {
this.tokenStorageService.saveToken(authToken, true);
@@ -102,9 +102,4 @@ export class GfRegisterPageComponent implements OnDestroy, OnInit {
}
});
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.component.ts b/apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.component.ts
index 4cc0f52f8..cbbe2d29c 100644
--- a/apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.component.ts
+++ b/apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.component.ts
@@ -8,10 +8,11 @@ import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
+ DestroyRef,
Inject,
- OnDestroy,
ViewChild
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
@@ -27,8 +28,6 @@ import {
checkmarkOutline,
copyOutline
} from 'ionicons/icons';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
import { UserAccountRegistrationDialogParams } from './interfaces/interfaces';
@@ -53,7 +52,7 @@ import { UserAccountRegistrationDialogParams } from './interfaces/interfaces';
styleUrls: ['./user-account-registration-dialog.scss'],
templateUrl: 'user-account-registration-dialog.html'
})
-export class GfUserAccountRegistrationDialogComponent implements OnDestroy {
+export class GfUserAccountRegistrationDialogComponent {
@ViewChild(MatStepper) stepper!: MatStepper;
public accessToken: string;
@@ -64,12 +63,11 @@ export class GfUserAccountRegistrationDialogComponent implements OnDestroy {
public routerLinkAboutTermsOfService =
publicRoutes.about.subRoutes.termsOfService.routerLink;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
@Inject(MAT_DIALOG_DATA) public data: UserAccountRegistrationDialogParams,
- private dataService: DataService
+ private dataService: DataService,
+ private destroyRef: DestroyRef
) {
addIcons({ arrowForwardOutline, checkmarkOutline, copyOutline });
}
@@ -77,7 +75,7 @@ export class GfUserAccountRegistrationDialogComponent implements OnDestroy {
public createAccount() {
this.dataService
.postUser()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ accessToken, authToken, role }) => {
this.accessToken = accessToken;
this.authToken = authToken;
@@ -96,9 +94,4 @@ export class GfUserAccountRegistrationDialogComponent implements OnDestroy {
public onChangeDislaimerChecked() {
this.isDisclaimerChecked = !this.isDisclaimerChecked;
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts b/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts
index 112619239..9c86f2c83 100644
--- a/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts
+++ b/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts
@@ -16,7 +16,7 @@ export class ResourcesGlossaryPageComponent implements OnInit {
public hasPermissionForSubscription: boolean;
public info: InfoItem;
public routerLinkResourcesPersonalFinanceTools =
- publicRoutes.resources.subRoutes.personalFinanceTools.routerLink;
+ publicRoutes.resources.subRoutes?.personalFinanceTools.routerLink;
public constructor(private dataService: DataService) {
this.info = this.dataService.fetchInfo();
diff --git a/apps/client/src/app/pages/resources/glossary/resources-glossary.routes.ts b/apps/client/src/app/pages/resources/glossary/resources-glossary.routes.ts
index 2f864155a..4096dfecd 100644
--- a/apps/client/src/app/pages/resources/glossary/resources-glossary.routes.ts
+++ b/apps/client/src/app/pages/resources/glossary/resources-glossary.routes.ts
@@ -8,6 +8,6 @@ export const routes: Routes = [
{
component: ResourcesGlossaryPageComponent,
path: '',
- title: publicRoutes.resources.subRoutes.glossary.title
+ title: publicRoutes.resources.subRoutes?.glossary.title
}
];
diff --git a/apps/client/src/app/pages/resources/guides/resources-guides.routes.ts b/apps/client/src/app/pages/resources/guides/resources-guides.routes.ts
index f9f65f44a..eb8c39e24 100644
--- a/apps/client/src/app/pages/resources/guides/resources-guides.routes.ts
+++ b/apps/client/src/app/pages/resources/guides/resources-guides.routes.ts
@@ -8,6 +8,6 @@ export const routes: Routes = [
{
component: ResourcesGuidesComponent,
path: '',
- title: publicRoutes.resources.subRoutes.guides.title
+ title: publicRoutes.resources.subRoutes?.guides.title
}
];
diff --git a/apps/client/src/app/pages/resources/markets/resources-markets.routes.ts b/apps/client/src/app/pages/resources/markets/resources-markets.routes.ts
index 4bcb66789..a56dc7cf7 100644
--- a/apps/client/src/app/pages/resources/markets/resources-markets.routes.ts
+++ b/apps/client/src/app/pages/resources/markets/resources-markets.routes.ts
@@ -8,6 +8,6 @@ export const routes: Routes = [
{
component: ResourcesMarketsComponent,
path: '',
- title: publicRoutes.resources.subRoutes.markets.title
+ title: publicRoutes.resources.subRoutes?.markets.title
}
];
diff --git a/apps/client/src/app/pages/resources/overview/resources-overview.component.html b/apps/client/src/app/pages/resources/overview/resources-overview.component.html
index 3a6f18d40..86a334c79 100644
--- a/apps/client/src/app/pages/resources/overview/resources-overview.component.html
+++ b/apps/client/src/app/pages/resources/overview/resources-overview.component.html
@@ -7,7 +7,9 @@
}
diff --git a/apps/client/src/app/pages/resources/overview/resources-overview.component.ts b/apps/client/src/app/pages/resources/overview/resources-overview.component.ts
index 81338200f..310f16a5e 100644
--- a/apps/client/src/app/pages/resources/overview/resources-overview.component.ts
+++ b/apps/client/src/app/pages/resources/overview/resources-overview.component.ts
@@ -20,20 +20,20 @@ export class ResourcesOverviewComponent {
{
description:
'Explore our guides to help you get started with investing and managing your finances.',
- routerLink: publicRoutes.resources.subRoutes.guides.routerLink,
- title: publicRoutes.resources.subRoutes.guides.title
+ routerLink: publicRoutes.resources.subRoutes?.guides.routerLink,
+ title: publicRoutes.resources.subRoutes?.guides.title
},
{
description:
'Access various market resources and tools to stay informed about financial markets.',
- routerLink: publicRoutes.resources.subRoutes.markets.routerLink,
- title: publicRoutes.resources.subRoutes.markets.title
+ routerLink: publicRoutes.resources.subRoutes?.markets.routerLink,
+ title: publicRoutes.resources.subRoutes?.markets.title
},
{
description:
'Learn key financial terms and concepts in our comprehensive glossary.',
- routerLink: publicRoutes.resources.subRoutes.glossary.routerLink,
- title: publicRoutes.resources.subRoutes.glossary.title
+ routerLink: publicRoutes.resources.subRoutes?.glossary.routerLink,
+ title: publicRoutes.resources.subRoutes?.glossary.title
}
];
}
diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts
index c4cfd184e..bb4ae3889 100644
--- a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts
+++ b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts
@@ -1,13 +1,12 @@
import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools';
import { publicRoutes } from '@ghostfolio/common/routes/routes';
-import { Component, OnDestroy } from '@angular/core';
+import { Component } from '@angular/core';
import { MatCardModule } from '@angular/material/card';
import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { chevronForwardOutline } from 'ionicons/icons';
-import { Subject } from 'rxjs';
@Component({
host: { class: 'page' },
@@ -16,7 +15,7 @@ import { Subject } from 'rxjs';
styleUrls: ['./personal-finance-tools-page.scss'],
templateUrl: './personal-finance-tools-page.html'
})
-export class PersonalFinanceToolsPageComponent implements OnDestroy {
+export class PersonalFinanceToolsPageComponent {
public pathAlternativeTo =
publicRoutes.resources.subRoutes.personalFinanceTools.subRoutes.product
.path + '-';
@@ -28,14 +27,7 @@ export class PersonalFinanceToolsPageComponent implements OnDestroy {
});
public routerLinkAbout = publicRoutes.about.routerLink;
- private unsubscribeSubject = new Subject();
-
public constructor() {
addIcons({ chevronForwardOutline });
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.routes.ts b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.routes.ts
index 9081f6b28..081c34000 100644
--- a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.routes.ts
+++ b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.routes.ts
@@ -11,7 +11,7 @@ export const routes: Routes = [
canActivate: [AuthGuard],
component: PersonalFinanceToolsPageComponent,
path: '',
- title: publicRoutes.resources.subRoutes.personalFinanceTools.title
+ title: publicRoutes.resources.subRoutes?.personalFinanceTools.title
},
...personalFinanceTools.map(({ alias, key, name }) => {
return {
@@ -23,8 +23,8 @@ export const routes: Routes = [
return GfProductPageComponent;
}
),
- path: `${publicRoutes.resources.subRoutes.personalFinanceTools.subRoutes.product.path}-${alias ?? key}`,
- title: `${publicRoutes.resources.subRoutes.personalFinanceTools.subRoutes.product.title} ${name}`
+ path: `${publicRoutes.resources.subRoutes?.personalFinanceTools.subRoutes?.product.path}-${alias ?? key}`,
+ title: `${publicRoutes.resources.subRoutes?.personalFinanceTools.subRoutes?.product.title} ${name}`
};
})
];
diff --git a/apps/client/src/app/pages/resources/resources-page.routes.ts b/apps/client/src/app/pages/resources/resources-page.routes.ts
index 107988238..6e59f0995 100644
--- a/apps/client/src/app/pages/resources/resources-page.routes.ts
+++ b/apps/client/src/app/pages/resources/resources-page.routes.ts
@@ -16,22 +16,22 @@ export const routes: Routes = [
import('./overview/resources-overview.routes').then((m) => m.routes)
},
{
- path: publicRoutes.resources.subRoutes.glossary.path,
+ path: publicRoutes.resources.subRoutes?.glossary.path,
loadChildren: () =>
import('./glossary/resources-glossary.routes').then((m) => m.routes)
},
{
- path: publicRoutes.resources.subRoutes.guides.path,
+ path: publicRoutes.resources.subRoutes?.guides.path,
loadChildren: () =>
import('./guides/resources-guides.routes').then((m) => m.routes)
},
{
- path: publicRoutes.resources.subRoutes.markets.path,
+ path: publicRoutes.resources.subRoutes?.markets.path,
loadChildren: () =>
import('./markets/resources-markets.routes').then((m) => m.routes)
},
{
- path: publicRoutes.resources.subRoutes.personalFinanceTools.path,
+ path: publicRoutes.resources.subRoutes?.personalFinanceTools.path,
loadChildren: () =>
import('./personal-finance-tools/personal-finance-tools-page.routes').then(
(m) => m.routes
diff --git a/apps/client/src/app/pages/user-account/user-account-page.component.ts b/apps/client/src/app/pages/user-account/user-account-page.component.ts
index 7341660f2..24c150408 100644
--- a/apps/client/src/app/pages/user-account/user-account-page.component.ts
+++ b/apps/client/src/app/pages/user-account/user-account-page.component.ts
@@ -6,16 +6,16 @@ import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
- OnDestroy,
+ DestroyRef,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatTabsModule } from '@angular/material/tabs';
import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { diamondOutline, keyOutline, settingsOutline } from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject, takeUntil } from 'rxjs';
@Component({
host: { class: 'page has-tabs' },
@@ -25,20 +25,19 @@ import { Subject, takeUntil } from 'rxjs';
styleUrls: ['./user-account-page.scss'],
templateUrl: './user-account-page.html'
})
-export class GfUserAccountPageComponent implements OnDestroy, OnInit {
+export class GfUserAccountPageComponent implements OnInit {
public deviceType: string;
public tabs: TabConfiguration[] = [];
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private userService: UserService
) {
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.user = state.user;
@@ -73,9 +72,4 @@ export class GfUserAccountPageComponent implements OnDestroy, OnInit {
public ngOnInit() {
this.deviceType = this.deviceService.getDeviceInfo().deviceType;
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/pages/user-account/user-account-page.routes.ts b/apps/client/src/app/pages/user-account/user-account-page.routes.ts
index 5d0f5b202..7eac1298e 100644
--- a/apps/client/src/app/pages/user-account/user-account-page.routes.ts
+++ b/apps/client/src/app/pages/user-account/user-account-page.routes.ts
@@ -18,14 +18,14 @@ export const routes: Routes = [
title: internalRoutes.account.title
},
{
- path: internalRoutes.account.subRoutes.membership.path,
+ path: internalRoutes.account.subRoutes?.membership.path,
component: GfUserAccountMembershipComponent,
- title: internalRoutes.account.subRoutes.membership.title
+ title: internalRoutes.account.subRoutes?.membership.title
},
{
- path: internalRoutes.account.subRoutes.access.path,
+ path: internalRoutes.account.subRoutes?.access.path,
component: GfUserAccountAccessComponent,
- title: internalRoutes.account.subRoutes.access.title
+ title: internalRoutes.account.subRoutes?.access.title
}
],
component: GfUserAccountPageComponent,
diff --git a/apps/client/src/app/pages/webauthn/webauthn-page.component.ts b/apps/client/src/app/pages/webauthn/webauthn-page.component.ts
index 74631eeca..8e7e58fd1 100644
--- a/apps/client/src/app/pages/webauthn/webauthn-page.component.ts
+++ b/apps/client/src/app/pages/webauthn/webauthn-page.component.ts
@@ -2,12 +2,16 @@ import { TokenStorageService } from '@ghostfolio/client/services/token-storage.s
import { WebAuthnService } from '@ghostfolio/client/services/web-authn.service';
import { GfLogoComponent } from '@ghostfolio/ui/logo';
-import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
+import {
+ ChangeDetectorRef,
+ Component,
+ DestroyRef,
+ OnInit
+} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { Router } from '@angular/router';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
@Component({
host: { class: 'page' },
@@ -16,13 +20,12 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./webauthn-page.scss'],
templateUrl: './webauthn-page.html'
})
-export class GfWebauthnPageComponent implements OnDestroy, OnInit {
+export class GfWebauthnPageComponent implements OnInit {
public hasError = false;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
+ private destroyRef: DestroyRef,
private router: Router,
private tokenStorageService: TokenStorageService,
private webAuthnService: WebAuthnService
@@ -35,7 +38,7 @@ export class GfWebauthnPageComponent implements OnDestroy, OnInit {
public deregisterDevice() {
this.webAuthnService
.deregister()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.router.navigate(['/']);
});
@@ -46,7 +49,7 @@ export class GfWebauthnPageComponent implements OnDestroy, OnInit {
this.webAuthnService
.login()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(
({ authToken }) => {
this.tokenStorageService.saveToken(authToken, false);
@@ -59,9 +62,4 @@ export class GfWebauthnPageComponent implements OnDestroy, OnInit {
}
);
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/pages/zen/zen-page.component.ts b/apps/client/src/app/pages/zen/zen-page.component.ts
index 280f33c25..633f15885 100644
--- a/apps/client/src/app/pages/zen/zen-page.component.ts
+++ b/apps/client/src/app/pages/zen/zen-page.component.ts
@@ -2,15 +2,19 @@ import { UserService } from '@ghostfolio/client/services/user/user.service';
import { TabConfiguration, User } from '@ghostfolio/common/interfaces';
import { internalRoutes } from '@ghostfolio/common/routes/routes';
-import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
+import {
+ ChangeDetectorRef,
+ Component,
+ DestroyRef,
+ OnInit
+} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatTabsModule } from '@angular/material/tabs';
import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { albumsOutline, analyticsOutline } from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
@Component({
host: { class: 'page has-tabs' },
@@ -19,20 +23,19 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./zen-page.scss'],
templateUrl: './zen-page.html'
})
-export class GfZenPageComponent implements OnDestroy, OnInit {
+export class GfZenPageComponent implements OnInit {
public deviceType: string;
public tabs: TabConfiguration[] = [];
public user: User;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
+ private destroyRef: DestroyRef,
private deviceService: DeviceDetectorService,
private userService: UserService
) {
this.userService.stateChanged
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
this.tabs = [
@@ -59,9 +62,4 @@ export class GfZenPageComponent implements OnDestroy, OnInit {
public ngOnInit() {
this.deviceType = this.deviceService.getDeviceInfo().deviceType;
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/apps/client/src/app/pages/zen/zen-page.routes.ts b/apps/client/src/app/pages/zen/zen-page.routes.ts
index 60e163ca4..38929dc85 100644
--- a/apps/client/src/app/pages/zen/zen-page.routes.ts
+++ b/apps/client/src/app/pages/zen/zen-page.routes.ts
@@ -16,9 +16,9 @@ export const routes: Routes = [
component: GfHomeOverviewComponent
},
{
- path: internalRoutes.zen.subRoutes.holdings.path,
+ path: internalRoutes.zen.subRoutes?.holdings.path,
component: GfHomeHoldingsComponent,
- title: internalRoutes.home.subRoutes.holdings.title
+ title: internalRoutes.home.subRoutes?.holdings.title
}
],
component: GfZenPageComponent,
diff --git a/apps/client/src/app/services/token-storage.service.ts b/apps/client/src/app/services/token-storage.service.ts
index 5b9a29a08..f54aab828 100644
--- a/apps/client/src/app/services/token-storage.service.ts
+++ b/apps/client/src/app/services/token-storage.service.ts
@@ -1,19 +1,11 @@
-import { WebAuthnService } from '@ghostfolio/client/services/web-authn.service';
-
import { Injectable } from '@angular/core';
import { KEY_TOKEN } from './settings-storage.service';
-import { UserService } from './user/user.service';
@Injectable({
providedIn: 'root'
})
export class TokenStorageService {
- public constructor(
- private userService: UserService,
- private webAuthnService: WebAuthnService
- ) {}
-
public getToken(): string {
return (
window.sessionStorage.getItem(KEY_TOKEN) ||
@@ -25,23 +17,7 @@ export class TokenStorageService {
if (staySignedIn) {
window.localStorage.setItem(KEY_TOKEN, token);
}
- window.sessionStorage.setItem(KEY_TOKEN, token);
- }
-
- public signOut() {
- const utmSource = window.localStorage.getItem('utm_source');
- if (this.webAuthnService.isEnabled()) {
- this.webAuthnService.deregister().subscribe();
- }
-
- window.localStorage.clear();
- window.sessionStorage.clear();
-
- this.userService.remove();
-
- if (utmSource) {
- window.localStorage.setItem('utm_source', utmSource);
- }
+ window.sessionStorage.setItem(KEY_TOKEN, token);
}
}
diff --git a/apps/client/src/app/services/user/user.service.ts b/apps/client/src/app/services/user/user.service.ts
index bd9d7d04c..44b63e056 100644
--- a/apps/client/src/app/services/user/user.service.ts
+++ b/apps/client/src/app/services/user/user.service.ts
@@ -1,3 +1,4 @@
+import { WebAuthnService } from '@ghostfolio/client/services/web-authn.service';
import { Filter, User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
@@ -26,7 +27,8 @@ export class UserService extends ObservableStore {
public constructor(
private deviceService: DeviceDetectorService,
private dialog: MatDialog,
- private http: HttpClient
+ private http: HttpClient,
+ private webAuthnService: WebAuthnService
) {
super({ trackStateHistory: true });
@@ -93,10 +95,40 @@ export class UserService extends ObservableStore {
return this.getFilters().length > 0;
}
- public remove() {
+ public reset() {
this.setState({ user: null }, UserStoreActions.RemoveUser);
}
+ public signOut() {
+ const utmSource = window.localStorage.getItem('utm_source');
+
+ if (this.webAuthnService.isEnabled()) {
+ this.webAuthnService.deregister().subscribe();
+ }
+
+ window.localStorage.clear();
+ window.sessionStorage.clear();
+
+ void this.clearAllCookies();
+
+ this.reset();
+
+ if (utmSource) {
+ window.localStorage.setItem('utm_source', utmSource);
+ }
+ }
+
+ private async clearAllCookies() {
+ if (!('cookieStore' in window)) {
+ console.warn('Cookie Store API not available in this browser');
+ return;
+ }
+
+ const cookies = await cookieStore.getAll();
+
+ await Promise.all(cookies.map(({ name }) => cookieStore.delete(name)));
+ }
+
private fetchUser(): Observable {
return this.http.get('/api/v1/user').pipe(
map((user) => {
diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf
index d878a63bf..566d91cc7 100644
--- a/apps/client/src/locales/messages.ca.xlf
+++ b/apps/client/src/locales/messages.ca.xlf
@@ -38,7 +38,7 @@
apps/client/src/app/components/header/header.component.ts
- 297
+ 298
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
@@ -427,7 +427,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 309
+ 310
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -439,7 +439,7 @@
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 46
+ 58
apps/client/src/app/components/admin-tag/admin-tag.component.html
@@ -499,7 +499,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 316
+ 317
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -587,11 +587,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 74
+ 78
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 67
+ 71
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -619,11 +619,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 85
+ 89
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 78
+ 82
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -659,7 +659,7 @@
Tipus
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 48
+ 57
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -679,7 +679,7 @@
Perfil d’Actiu
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 52
+ 61
@@ -687,11 +687,11 @@
Dades Històriques de Mercat
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 54
+ 63
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 448
+ 451
@@ -699,7 +699,7 @@
Origen de les Dades
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 82
+ 91
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -723,7 +723,7 @@
Prioritat
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 96
+ 105
@@ -731,7 +731,7 @@
Intents
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 120
+ 129
@@ -739,7 +739,7 @@
Creat
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 134
+ 143
@@ -747,7 +747,7 @@
Finalitzat
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 143
+ 152
@@ -755,11 +755,11 @@
Estat
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 152
+ 161
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 92
+ 104
@@ -775,7 +775,7 @@
Aturar Processos
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 193
+ 202
@@ -783,7 +783,7 @@
Veure les Dades
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 208
+ 217
@@ -791,7 +791,7 @@
Veure Stacktrace
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 216
+ 225
@@ -799,7 +799,7 @@
Executar Procés
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 220
+ 229
@@ -807,7 +807,7 @@
Suprimir Procés
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 224
+ 233
@@ -859,7 +859,7 @@
Punts de referència
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 126
+ 125
@@ -867,7 +867,7 @@
Divises
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 131
+ 130
apps/client/src/app/pages/public/public-page.html
@@ -879,7 +879,7 @@
ETFs sense País
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 136
+ 135
@@ -887,7 +887,7 @@
ETFs sense Sector
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 141
+ 140
@@ -895,7 +895,7 @@
Filtra per...
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 390
+ 383
@@ -1011,7 +1011,7 @@
El preu de mercat actual és
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 706
+ 722
@@ -1079,7 +1079,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 396
+ 399
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -1099,7 +1099,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 407
+ 410
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -1111,7 +1111,7 @@
Mapatge de Símbols
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 384
+ 387
@@ -1127,7 +1127,7 @@
Configuració del Proveïdor de Dades
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 471
+ 474
@@ -1135,7 +1135,7 @@
Prova
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 568
+ 571
@@ -1143,11 +1143,11 @@
Url
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 419
+ 422
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 550
+ 553
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -1163,7 +1163,7 @@
Asset profile has been saved
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 578
+ 594
@@ -1171,7 +1171,7 @@
Notes
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 432
+ 435
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
@@ -1231,7 +1231,7 @@
Està segur qeu vol eliminar aquest cupó?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 193
+ 196
@@ -1239,7 +1239,7 @@
Està segur que vol eliminar aquest missatge del sistema?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 206
+ 209
@@ -1247,7 +1247,7 @@
Està segur que vol depurar el cache?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 230
+ 233
@@ -1255,7 +1255,7 @@
Si us plau, afegeixi el seu missatge del sistema:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 250
+ 253
@@ -1319,7 +1319,7 @@
Recollida de Dades
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 587
+ 594
apps/client/src/app/components/admin-overview/admin-overview.html
@@ -1391,7 +1391,15 @@
Està segur que vol eliminar aquesta plataforma?
apps/client/src/app/components/admin-platform/admin-platform.component.ts
- 106
+ 111
+
+
+
+ Explore
+ Explore
+
+ apps/client/src/app/pages/resources/overview/resources-overview.component.html
+ 11
@@ -1415,7 +1423,7 @@
Current year
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
@@ -1431,7 +1439,7 @@
Plataformes
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 195
+ 212
@@ -1439,7 +1447,7 @@
Etiquetes
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 201
+ 218
libs/ui/src/lib/tags-selector/tags-selector.component.html
@@ -1463,7 +1471,7 @@
Està segur que vol eliminar aquesta etiqueta?
apps/client/src/app/components/admin-tag/admin-tag.component.ts
- 103
+ 108
@@ -1487,7 +1495,7 @@
Està segur que vol eliminar aquest usuari?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 218
+ 215
@@ -1555,11 +1563,11 @@
Could not validate form
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 554
+ 570
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 557
+ 573
@@ -1607,7 +1615,7 @@
Punt de Referència
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 376
+ 379
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
@@ -1683,15 +1691,15 @@
Oooh! El testimoni de seguretat és incorrecte.
apps/client/src/app/components/header/header.component.ts
- 312
+ 313
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 154
+ 152
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 193
+ 191
@@ -1771,7 +1779,7 @@
Informar d’un Problema amb les Dades
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 450
+ 456
@@ -1779,7 +1787,7 @@
en Actiiu
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 64
+ 63
@@ -1787,7 +1795,7 @@
Finalitzat
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 65
+ 64
@@ -1811,7 +1819,7 @@
Gestionar Activitats
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 64
@@ -1819,11 +1827,11 @@
Por
apps/client/src/app/components/home-market/home-market.component.ts
- 42
+ 41
apps/client/src/app/components/markets/markets.component.ts
- 47
+ 46
libs/ui/src/lib/i18n.ts
@@ -1835,11 +1843,11 @@
Cobdícia
apps/client/src/app/components/home-market/home-market.component.ts
- 43
+ 42
apps/client/src/app/components/markets/markets.component.ts
- 48
+ 47
libs/ui/src/lib/i18n.ts
@@ -1943,7 +1951,7 @@
Current week
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
@@ -2351,7 +2359,7 @@
YTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2363,7 +2371,7 @@
1 any
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2375,7 +2383,7 @@
5 anys
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2395,7 +2403,7 @@
Màx
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 211
+ 217
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2539,7 +2547,7 @@
Automàtic
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 70
+ 69
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -2551,7 +2559,7 @@
De debò vols tancar el teu compte de Ghostfolio?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 208
+ 205
@@ -2559,7 +2567,7 @@
De debò vols eliminar aquest mètode d’inici de sessió?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 282
+ 279
@@ -2567,7 +2575,7 @@
Include in
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 374
+ 377
@@ -2575,7 +2583,7 @@
Ups! Hi ha hagut un error en configurar l’autenticació biomètrica.
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 336
+ 333
@@ -2623,7 +2631,7 @@
Localització
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 509
+ 512
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -2767,7 +2775,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 195
+ 194
@@ -2787,7 +2795,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 193
+ 192
@@ -2803,7 +2811,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 196
+ 195
@@ -2939,7 +2947,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 375
+ 381
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -3043,7 +3051,7 @@
Dades de mercat
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 397
+ 403
libs/common/src/lib/routes/routes.ts
@@ -3077,6 +3085,10 @@
Overview
Visió general
+
+ apps/client/src/app/components/admin-jobs/admin-jobs.html
+ 7
+
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
114
@@ -3223,11 +3235,11 @@
Could not parse scraper configuration
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 509
+ 525
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 512
+ 528
@@ -3271,7 +3283,7 @@
General
apps/client/src/app/pages/faq/faq-page.component.ts
- 49
+ 41
@@ -3279,7 +3291,7 @@
Núvol
apps/client/src/app/pages/faq/faq-page.component.ts
- 54
+ 46
libs/common/src/lib/routes/routes.ts
@@ -3291,7 +3303,7 @@
Autoallotjament
apps/client/src/app/pages/faq/faq-page.component.ts
- 60
+ 52
libs/common/src/lib/routes/routes.ts
@@ -3492,7 +3504,7 @@
Mercats
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 378
+ 381
apps/client/src/app/components/footer/footer.component.html
@@ -3964,7 +3976,7 @@
Job ID
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 34
+ 43
@@ -4020,7 +4032,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 342
+ 348
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -4140,7 +4152,7 @@
Importar dividends
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 137
+ 136
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -4156,7 +4168,7 @@
S’estan important dades...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 175
+ 174
@@ -4164,7 +4176,7 @@
La importació s’ha completat
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 185
+ 184
@@ -4180,7 +4192,7 @@
S’estan validant les dades...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 299
+ 293
@@ -4496,7 +4508,7 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 76
+ 75
libs/ui/src/lib/i18n.ts
@@ -4516,11 +4528,11 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 81
+ 80
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 97
+ 96
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
@@ -4540,7 +4552,7 @@
Mensualment
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 91
+ 90
@@ -4548,7 +4560,7 @@
Anualment
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 92
+ 91
@@ -4556,7 +4568,7 @@
Close Holding
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 441
+ 447
@@ -4852,11 +4864,11 @@
Could not save asset profile
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 588
+ 604
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 591
+ 607
@@ -4934,6 +4946,10 @@
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
88
+
+ libs/ui/src/lib/value/value.component.html
+ 18
+
Personal Finance Tools
@@ -5433,7 +5449,7 @@
WTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
libs/ui/src/lib/assistant/assistant.component.ts
@@ -5453,7 +5469,7 @@
MTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
libs/ui/src/lib/assistant/assistant.component.ts
@@ -5473,7 +5489,7 @@
any
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
@@ -5493,7 +5509,7 @@
anys
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -5505,7 +5521,7 @@
Perfils d’actius
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 106
+ 123
libs/ui/src/lib/assistant/assistant.html
@@ -5645,7 +5661,7 @@
Dipòsit
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 385
+ 404
@@ -5661,7 +5677,7 @@
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 395
+ 414
libs/ui/src/lib/i18n.ts
@@ -5673,7 +5689,7 @@
Estalvi
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 405
+ 424
@@ -5745,7 +5761,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 326
+ 327
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -5777,7 +5793,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 342
+ 343
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -5913,7 +5929,7 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 449
+ 451
@@ -5929,7 +5945,7 @@
No Activities
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 146
+ 145
@@ -5961,7 +5977,7 @@
Símbol
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 68
+ 77
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -5977,7 +5993,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 315
+ 318
libs/ui/src/lib/i18n.ts
@@ -6293,7 +6309,7 @@
Vàlid fins a
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 74
+ 86
libs/ui/src/lib/membership-card/membership-card.component.html
@@ -6325,11 +6341,11 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 451
+ 453
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 465
+ 467
libs/ui/src/lib/top-holdings/top-holdings.component.html
@@ -6673,7 +6689,7 @@
Error
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 697
+ 713
@@ -6725,7 +6741,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 592
+ 599
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6777,7 +6793,7 @@
Close
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 594
+ 601
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6849,7 +6865,7 @@
Portfolio Snapshot
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 56
+ 65
@@ -6916,6 +6932,14 @@
42
+
+ has been copied to the clipboard
+ has been copied to the clipboard
+
+ libs/ui/src/lib/value/value.component.ts
+ 180
+
+
From the beginning
From the beginning
@@ -7081,7 +7105,7 @@
Set API key
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 171
+ 188
@@ -7187,7 +7211,7 @@
of
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 135
+ 152
@@ -7195,7 +7219,7 @@
daily requests
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 137
+ 154
@@ -7203,7 +7227,7 @@
Remove API key
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 161
+ 178
@@ -7211,7 +7235,7 @@
Do you really want to delete the API key?
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 127
+ 133
@@ -7303,7 +7327,7 @@
Save
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 603
+ 610
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -7355,7 +7379,7 @@
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 260
+ 257
@@ -7379,7 +7403,7 @@
Please enter your Ghostfolio API key.
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 146
+ 152
@@ -7395,7 +7419,7 @@
AI prompt has been copied to the clipboard
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 201
+ 199
@@ -7411,7 +7435,7 @@
Lazy
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7419,7 +7443,7 @@
Instant
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7427,7 +7451,7 @@
Default Market Price
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 481
+ 484
@@ -7435,7 +7459,7 @@
Mode
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 518
+ 521
@@ -7443,7 +7467,7 @@
Selector
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 534
+ 537
@@ -7451,7 +7475,7 @@
HTTP Request Headers
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 494
+ 497
@@ -7459,7 +7483,7 @@
end of day
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7467,7 +7491,7 @@
real-time
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7475,7 +7499,7 @@
Open Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 202
+ 200
@@ -7495,7 +7519,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
@@ -7507,7 +7531,7 @@
apps/client/src/app/components/home-overview/home-overview.component.ts
- 55
+ 54
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -7515,11 +7539,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 388
+ 390
@@ -7623,11 +7647,11 @@
Security token
apps/client/src/app/components/admin-users/admin-users.component.ts
- 239
+ 235
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 170
+ 167
@@ -7635,7 +7659,7 @@
Do you really want to generate a new security token for this user?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 244
+ 240
@@ -7708,7 +7732,7 @@
( ) is already in use.
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 633
+ 649
@@ -7716,7 +7740,7 @@
An error occurred while updating to ( ).
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 641
+ 657
@@ -7780,7 +7804,7 @@
someone
apps/client/src/app/pages/public/public-page.component.ts
- 59
+ 61
@@ -7812,7 +7836,7 @@
Do you really want to delete this item?
libs/ui/src/lib/benchmark/benchmark.component.ts
- 144
+ 139
@@ -7853,7 +7877,7 @@
Demo user account has been synced.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 274
+ 277
@@ -8067,7 +8091,7 @@
Current month
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
@@ -8075,7 +8099,7 @@
new
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 67
+ 79
apps/client/src/app/pages/admin/admin-page.component.ts
@@ -8236,7 +8260,7 @@
Do you really want to generate a new security token?
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 175
+ 172
@@ -8260,7 +8284,7 @@
Stocks
apps/client/src/app/components/markets/markets.component.ts
- 52
+ 51
apps/client/src/app/pages/features/features-page.html
@@ -8272,7 +8296,7 @@
Cryptocurrencies
apps/client/src/app/components/markets/markets.component.ts
- 53
+ 52
apps/client/src/app/pages/features/features-page.html
@@ -8292,7 +8316,7 @@
Manage Asset Profile
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 465
+ 471
diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf
index 54c3f7de8..ff12aebcb 100644
--- a/apps/client/src/locales/messages.de.xlf
+++ b/apps/client/src/locales/messages.de.xlf
@@ -50,7 +50,7 @@
Typ
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 48
+ 57
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -106,7 +106,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 309
+ 310
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -118,7 +118,7 @@
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 46
+ 58
apps/client/src/app/components/admin-tag/admin-tag.component.html
@@ -234,11 +234,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 74
+ 78
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 67
+ 71
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -266,11 +266,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 85
+ 89
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 78
+ 82
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -306,7 +306,7 @@
Jobs löschen
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 193
+ 202
@@ -314,7 +314,7 @@
Datenquelle
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 82
+ 91
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -338,7 +338,7 @@
Versuche
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 120
+ 129
@@ -346,7 +346,7 @@
Erstellt
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 134
+ 143
@@ -354,7 +354,7 @@
Abgeschlossen
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 143
+ 152
@@ -362,11 +362,11 @@
Status
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 152
+ 161
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 92
+ 104
@@ -382,7 +382,7 @@
Anlageprofile
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 106
+ 123
libs/ui/src/lib/assistant/assistant.html
@@ -394,11 +394,11 @@
Historische Marktdaten
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 54
+ 63
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 448
+ 451
@@ -406,7 +406,7 @@
Daten anzeigen
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 208
+ 217
@@ -414,7 +414,7 @@
Stacktrace anzeigen
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 216
+ 225
@@ -422,7 +422,7 @@
Job löschen
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 224
+ 233
@@ -514,7 +514,7 @@
Möchtest du diesen Gutscheincode wirklich löschen?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 193
+ 196
@@ -522,7 +522,7 @@
Möchtest du den Cache wirklich leeren?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 230
+ 233
@@ -530,7 +530,7 @@
Bitte gebe deine Systemmeldung ein:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 250
+ 253
@@ -650,7 +650,7 @@
Möchtest du diesen Benutzer wirklich löschen?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 218
+ 215
@@ -758,7 +758,7 @@
apps/client/src/app/components/header/header.component.ts
- 297
+ 298
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
@@ -778,15 +778,15 @@
Ups! Falsches Sicherheits-Token.
apps/client/src/app/components/header/header.component.ts
- 312
+ 313
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 154
+ 152
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 193
+ 191
@@ -794,7 +794,7 @@
Aktivitäten verwalten
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 64
@@ -986,7 +986,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 396
+ 399
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -1006,7 +1006,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 407
+ 410
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -1018,7 +1018,7 @@
Tags
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 201
+ 218
libs/ui/src/lib/tags-selector/tags-selector.component.html
@@ -1034,7 +1034,7 @@
Datenfehler melden
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 450
+ 456
@@ -1082,7 +1082,7 @@
YTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1094,7 +1094,7 @@
1J
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1106,7 +1106,7 @@
5J
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1126,7 +1126,7 @@
Max
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 211
+ 217
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1146,7 +1146,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 196
+ 195
@@ -1238,7 +1238,7 @@
Möchtest du diese Anmeldemethode wirklich löschen?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 282
+ 279
@@ -1298,7 +1298,7 @@
Lokalität
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 509
+ 512
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -1394,7 +1394,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 375
+ 381
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -1438,7 +1438,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 316
+ 317
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -1676,6 +1676,10 @@
Overview
Übersicht
+
+ apps/client/src/app/components/admin-jobs/admin-jobs.html
+ 7
+
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
114
@@ -1714,7 +1718,7 @@
Märkte
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 378
+ 381
apps/client/src/app/components/footer/footer.component.html
@@ -1934,7 +1938,7 @@
Aktuelle Woche
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
@@ -2018,7 +2022,7 @@
Kommentar
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 432
+ 435
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
@@ -2058,7 +2062,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 342
+ 348
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2082,7 +2086,7 @@
Daten importieren...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 175
+ 174
@@ -2090,7 +2094,7 @@
Der Import wurde abgeschlossen
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 185
+ 184
@@ -2208,6 +2212,10 @@
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
88
+
+ libs/ui/src/lib/value/value.component.html
+ 18
+
Resources
@@ -2398,7 +2406,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 195
+ 194
@@ -2410,7 +2418,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 193
+ 192
@@ -2530,7 +2538,7 @@
Monatlich
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 91
+ 90
@@ -2546,7 +2554,7 @@
Einlage
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 385
+ 404
@@ -2562,7 +2570,7 @@
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 395
+ 414
libs/ui/src/lib/i18n.ts
@@ -2574,7 +2582,7 @@
Ersparnisse
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 405
+ 424
@@ -2598,11 +2606,11 @@
Angst
apps/client/src/app/components/home-market/home-market.component.ts
- 42
+ 41
apps/client/src/app/components/markets/markets.component.ts
- 47
+ 46
libs/ui/src/lib/i18n.ts
@@ -2614,11 +2622,11 @@
Gier
apps/client/src/app/components/home-market/home-market.component.ts
- 43
+ 42
apps/client/src/app/components/markets/markets.component.ts
- 48
+ 47
libs/ui/src/lib/i18n.ts
@@ -2630,7 +2638,7 @@
Filtern nach...
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 390
+ 383
@@ -2666,11 +2674,11 @@
Das Formular konnte nicht validiert werden
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 554
+ 570
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 557
+ 573
@@ -2686,7 +2694,7 @@
Benchmark
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 376
+ 379
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
@@ -2714,7 +2722,7 @@
Automatisch
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 70
+ 69
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -2802,7 +2810,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 326
+ 327
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -2826,7 +2834,7 @@
Symbol
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 68
+ 77
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -2842,7 +2850,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 315
+ 318
libs/ui/src/lib/i18n.ts
@@ -2998,7 +3006,7 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 449
+ 451
@@ -3018,11 +3026,11 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 451
+ 453
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 465
+ 467
libs/ui/src/lib/top-holdings/top-holdings.component.html
@@ -3126,7 +3134,7 @@
Symbol Zuordnung
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 384
+ 387
@@ -3170,7 +3178,7 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 76
+ 75
libs/ui/src/lib/i18n.ts
@@ -3190,7 +3198,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 342
+ 343
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -3218,7 +3226,7 @@
Daten validieren...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 299
+ 293
@@ -3242,7 +3250,7 @@
Marktdaten
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 397
+ 403
libs/common/src/lib/routes/routes.ts
@@ -3294,7 +3302,7 @@
Jährlich
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 92
+ 91
@@ -3302,7 +3310,7 @@
Dividenden importieren
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 137
+ 136
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -3318,7 +3326,7 @@
Gültig bis
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 74
+ 86
libs/ui/src/lib/membership-card/membership-card.component.html
@@ -3362,7 +3370,7 @@
Keine Aktivitäten
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 146
+ 145
@@ -3638,11 +3646,11 @@
Das Anlageprofil konnte nicht gespeichert werden
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 588
+ 604
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 591
+ 607
@@ -3845,6 +3853,14 @@
306
+
+ Explore
+ Entdecke
+
+ apps/client/src/app/pages/resources/overview/resources-overview.component.html
+ 11
+
+
By
Bis
@@ -3866,7 +3882,7 @@
Aktuelles Jahr
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
@@ -3882,11 +3898,11 @@
Url
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 419
+ 422
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 550
+ 553
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -3902,7 +3918,7 @@
Das Anlageprofil wurde gespeichert
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 578
+ 594
@@ -3910,7 +3926,7 @@
Möchtest du diese Plattform wirklich löschen?
apps/client/src/app/components/admin-platform/admin-platform.component.ts
- 106
+ 111
@@ -3918,7 +3934,7 @@
Plattformen
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 195
+ 212
@@ -4262,7 +4278,7 @@
Scraper Konfiguration
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 471
+ 474
@@ -4506,7 +4522,7 @@
ETFs ohne Länder
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 136
+ 135
@@ -4514,7 +4530,7 @@
ETFs ohne Sektoren
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 141
+ 140
@@ -4694,7 +4710,7 @@
Job ID
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 34
+ 43
@@ -4750,7 +4766,7 @@
Währungen
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 131
+ 130
apps/client/src/app/pages/public/public-page.html
@@ -4802,11 +4818,11 @@
Die Scraper Konfiguration konnte nicht geparsed werden
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 509
+ 525
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 512
+ 528
@@ -5500,7 +5516,7 @@
Möchtest du diesen Tag wirklich löschen?
apps/client/src/app/components/admin-tag/admin-tag.component.ts
- 103
+ 108
@@ -5600,7 +5616,7 @@
Anlageprofil
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 52
+ 61
@@ -5732,7 +5748,7 @@
Möchtest du diese Systemmeldung wirklich löschen?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 206
+ 209
@@ -5792,7 +5808,7 @@
Der aktuelle Marktpreis ist
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 706
+ 722
@@ -5800,7 +5816,7 @@
Test
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 568
+ 571
@@ -5888,11 +5904,11 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 81
+ 80
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 97
+ 96
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
@@ -5912,7 +5928,7 @@
Position abschliessen
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 441
+ 447
@@ -5960,7 +5976,7 @@
WTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
libs/ui/src/lib/assistant/assistant.component.ts
@@ -5980,7 +5996,7 @@
MTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6028,7 +6044,7 @@
Jahr
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
@@ -6048,7 +6064,7 @@
Jahre
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6068,7 +6084,7 @@
Finanzmarktdaten synchronisieren
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 587
+ 594
apps/client/src/app/components/admin-overview/admin-overview.html
@@ -6080,7 +6096,7 @@
Allgemein
apps/client/src/app/pages/faq/faq-page.component.ts
- 49
+ 41
@@ -6088,7 +6104,7 @@
Cloud
apps/client/src/app/pages/faq/faq-page.component.ts
- 54
+ 46
libs/common/src/lib/routes/routes.ts
@@ -6100,7 +6116,7 @@
Self-Hosting
apps/client/src/app/pages/faq/faq-page.component.ts
- 60
+ 52
libs/common/src/lib/routes/routes.ts
@@ -6141,7 +6157,7 @@
Aktiv
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 64
+ 63
@@ -6149,7 +6165,7 @@
Abgeschlossen
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 65
+ 64
@@ -6181,7 +6197,7 @@
Job ausführen
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 220
+ 229
@@ -6189,7 +6205,7 @@
Priorität
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 96
+ 105
@@ -6245,7 +6261,7 @@
Möchtest du dieses Ghostfolio Konto wirklich schliessen?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 208
+ 205
@@ -6293,7 +6309,7 @@
Berücksichtigen in
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 374
+ 377
@@ -6301,7 +6317,7 @@
Ups! Beim Einrichten der biometrischen Authentifizierung ist ein Fehler aufgetreten.
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 336
+ 333
@@ -6317,7 +6333,7 @@
Benchmarks
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 126
+ 125
@@ -6697,7 +6713,7 @@
Fehler
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 697
+ 713
@@ -6749,7 +6765,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 592
+ 599
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6801,7 +6817,7 @@
Schliessen
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 594
+ 601
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6873,7 +6889,7 @@
Portfolio Snapshot
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 56
+ 65
@@ -6940,6 +6956,14 @@
42
+
+ has been copied to the clipboard
+ wurde in die Zwischenablage kopiert
+
+ libs/ui/src/lib/value/value.component.ts
+ 180
+
+
From the beginning
Seit Beginn
@@ -7105,7 +7129,7 @@
API-Schlüssel setzen
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 171
+ 188
@@ -7211,7 +7235,7 @@
von
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 135
+ 152
@@ -7219,7 +7243,7 @@
täglichen Anfragen
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 137
+ 154
@@ -7227,7 +7251,7 @@
API-Schlüssel löschen
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 161
+ 178
@@ -7235,7 +7259,7 @@
Möchtest du den API-Schlüssel wirklich löschen?
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 127
+ 133
@@ -7327,7 +7351,7 @@
Speichern
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 603
+ 610
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -7379,7 +7403,7 @@
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 260
+ 257
@@ -7403,7 +7427,7 @@
Bitte gebe deinen Ghostfolio API-Schlüssel ein.
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 146
+ 152
@@ -7419,7 +7443,7 @@
KI-Anweisung wurde in die Zwischenablage kopiert
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 201
+ 199
@@ -7435,7 +7459,7 @@
Verzögert
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7443,7 +7467,7 @@
Sofort
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7451,7 +7475,7 @@
Standardmarktpreis
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 481
+ 484
@@ -7459,7 +7483,7 @@
Modus
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 518
+ 521
@@ -7467,7 +7491,7 @@
Selektor
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 534
+ 537
@@ -7475,7 +7499,7 @@
HTTP Request-Headers
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 494
+ 497
@@ -7483,7 +7507,7 @@
Tagesende
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7491,7 +7515,7 @@
in Echtzeit
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7499,7 +7523,7 @@
Öffne Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 202
+ 200
@@ -7519,7 +7543,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
@@ -7531,7 +7555,7 @@
apps/client/src/app/components/home-overview/home-overview.component.ts
- 55
+ 54
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -7539,11 +7563,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 388
+ 390
@@ -7647,11 +7671,11 @@
Sicherheits-Token
apps/client/src/app/components/admin-users/admin-users.component.ts
- 239
+ 235
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 170
+ 167
@@ -7659,7 +7683,7 @@
Möchtest du für diesen Benutzer wirklich ein neues Sicherheits-Token generieren?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 244
+ 240
@@ -7732,7 +7756,7 @@
( ) wird bereits verwendet.
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 633
+ 649
@@ -7740,7 +7764,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
- 641
+ 657
@@ -7780,7 +7804,7 @@
jemand
apps/client/src/app/pages/public/public-page.component.ts
- 59
+ 61
@@ -7812,7 +7836,7 @@
Möchtest du diesen Eintrag wirklich löschen?
libs/ui/src/lib/benchmark/benchmark.component.ts
- 144
+ 139
@@ -7853,7 +7877,7 @@
Demo Benutzerkonto wurde synchronisiert.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 274
+ 277
@@ -8067,7 +8091,7 @@
Aktueller Monat
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
@@ -8075,7 +8099,7 @@
neu
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 67
+ 79
apps/client/src/app/pages/admin/admin-page.component.ts
@@ -8236,7 +8260,7 @@
Möchtest du wirklich ein neues Sicherheits-Token generieren?
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 175
+ 172
@@ -8260,7 +8284,7 @@
Aktien
apps/client/src/app/components/markets/markets.component.ts
- 52
+ 51
apps/client/src/app/pages/features/features-page.html
@@ -8272,7 +8296,7 @@
Kryptowährungen
apps/client/src/app/components/markets/markets.component.ts
- 53
+ 52
apps/client/src/app/pages/features/features-page.html
@@ -8292,7 +8316,7 @@
Anlageprofil verwalten
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 465
+ 471
diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf
index ba5a38d67..26c76ef6c 100644
--- a/apps/client/src/locales/messages.es.xlf
+++ b/apps/client/src/locales/messages.es.xlf
@@ -32,7 +32,7 @@
Grantee
- Beneficiario
+ Usuario autorizado
apps/client/src/app/components/access-table/access-table.component.html
11
@@ -51,7 +51,7 @@
Tipo
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 48
+ 57
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -76,7 +76,7 @@
Revoke
- Revoca
+ Revocar
apps/client/src/app/components/access-table/access-table.component.html
96
@@ -92,7 +92,7 @@
Do you really want to revoke this granted access?
- ¿Quieres revocar el acceso concedido?
+ ¿Seguro que quieres revocar el acceso concedido?
apps/client/src/app/components/access-table/access-table.component.ts
113
@@ -107,7 +107,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 309
+ 310
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -119,7 +119,7 @@
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 46
+ 58
apps/client/src/app/components/admin-tag/admin-tag.component.html
@@ -224,7 +224,7 @@
Edit
- Edita
+ Editar
apps/client/src/app/components/access-table/access-table.component.html
76
@@ -235,11 +235,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 74
+ 78
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 67
+ 71
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -252,7 +252,7 @@
Delete
- Elimina
+ Eliminar
apps/client/src/app/components/admin-market-data/admin-market-data.html
289
@@ -267,11 +267,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 85
+ 89
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 78
+ 82
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -296,7 +296,7 @@
Do you really want to delete this account?
- ¿Estás seguro de eliminar esta cuenta?
+ ¿Seguro que quieres eliminar esta cuenta?
libs/ui/src/lib/accounts-table/accounts-table.component.ts
148
@@ -304,10 +304,10 @@
Delete Jobs
- Elimina los trabajos
+ Eliminar trabajos
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 193
+ 202
@@ -315,7 +315,7 @@
Fuente de datos
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 82
+ 91
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -339,7 +339,7 @@
Intentos
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 120
+ 129
@@ -347,7 +347,7 @@
Creado
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 134
+ 143
@@ -355,7 +355,7 @@
Finalizado
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 143
+ 152
@@ -363,16 +363,16 @@
Estado
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 152
+ 161
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 92
+ 104
and is driven by the efforts of its contributors
- y es impulsado por los esfuerzos de sus contribuidores
+ y es impulsado por los esfuerzos de sus colaboradores
apps/client/src/app/pages/about/overview/about-overview-page.html
49
@@ -380,10 +380,10 @@
Asset Profiles
- Perfiles de activos.
+ Perfiles de activos
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 106
+ 123
libs/ui/src/lib/assistant/assistant.html
@@ -395,40 +395,40 @@
Datos históricos del mercado
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 54
+ 63
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 448
+ 451
View Data
- Visualiza los datos
+ Ver datos
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 208
+ 217
View Stacktrace
- Visualiza Stacktrace
+ Ver Stacktrace
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 216
+ 225
Delete Job
- Elimina el trabajo
+ Eliminar trabajo
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 224
+ 233
Details for
- Detalles para
+ Detalles de
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html
2
@@ -472,7 +472,7 @@
First Activity
- Primera actividad
+ Primera operación
apps/client/src/app/components/admin-market-data/admin-market-data.html
147
@@ -492,7 +492,7 @@
Activity Count
- Recuento de actividad
+ Número de operaciones
apps/client/src/app/components/admin-overview/admin-overview.html
19
@@ -512,18 +512,18 @@
Do you really want to delete this coupon?
- ¿Estás seguro de eliminar este cupón?
+ ¿Seguro que quieres eliminar este cupón?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 193
+ 196
Do you really want to flush the cache?
- ¿Estás seguro de limpiar la caché?
+ ¿Seguro que quieres limpiar la caché?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 230
+ 233
@@ -531,7 +531,7 @@
Por favor, establece tu mensaje del sistema:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 250
+ 253
@@ -544,7 +544,7 @@
per User
- por usario
+ por usuario
apps/client/src/app/components/admin-overview/admin-overview.html
28
@@ -552,7 +552,7 @@
Gather Profile Data
- Recoger los datos del perfil
+ Recopilar datos del perfil
apps/client/src/app/components/admin-market-data/admin-market-data.html
234
@@ -616,7 +616,7 @@
Housekeeping
- Tareas domésticas
+ Limpieza del sistema
apps/client/src/app/components/admin-overview/admin-overview.html
184
@@ -632,10 +632,10 @@
Do you really want to delete this user?
- ¿Estás seguro de eliminar este usuario?
+ ¿Seguro que quieres eliminar este usuario?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 218
+ 215
@@ -656,7 +656,7 @@
No auto-renewal on membership.
- No se renueva automáticamente la membresía.
+ Sin renovación automática de la membresía.
apps/client/src/app/components/user-account-membership/user-account-membership.html
74
@@ -664,7 +664,7 @@
Engagement per Day
- Contratación diaria
+ Interacción diaria
apps/client/src/app/components/admin-users/admin-users.html
140
@@ -684,7 +684,7 @@
Current Market Mood
- Estado de ánimo del mercado
+ Sentimiento del mercado
apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html
12
@@ -743,7 +743,7 @@
apps/client/src/app/components/header/header.component.ts
- 297
+ 298
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
@@ -760,26 +760,26 @@
Oops! Incorrect Security Token.
- Vaya! Token de seguridad incorrecto.
+ ¡Vaya! Token de seguridad incorrecto.
apps/client/src/app/components/header/header.component.ts
- 312
+ 313
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 154
+ 152
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 193
+ 191
Manage Activities
- Gestión de las operaciones
+ Gestionar operaciones
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 64
@@ -932,7 +932,7 @@
Buying Power
- Capacidad de compra
+ Poder adquisitivo
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
248
@@ -956,7 +956,7 @@
Please set the amount of your emergency fund.
- Por favor, ingresa la cantidad de tu fondo de emergencia:
+ Por favor, ingresa la cantidad de tu fondo de emergencia.
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
111
@@ -971,7 +971,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 396
+ 399
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -991,7 +991,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 407
+ 410
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -1003,7 +1003,7 @@
Etiquetas
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 201
+ 218
libs/ui/src/lib/tags-selector/tags-selector.component.html
@@ -1016,10 +1016,10 @@
Report Data Glitch
- Reporta un anomalía de los datos
+ Reportar anomalía en los datos
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 450
+ 456
@@ -1064,10 +1064,10 @@
YTD
- Desde principio de año
+ YTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1079,7 +1079,7 @@
1 año
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1091,7 +1091,7 @@
5 años
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1100,7 +1100,7 @@
Performance with currency effect
- Rendimiento con el efecto del tipo de cambio de divisa
+ Rendimiento con el efecto de la divisa
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
135
@@ -1111,7 +1111,7 @@
Máximo
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 211
+ 217
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1131,12 +1131,12 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 196
+ 195
About
- Sobre
+ Acerca de
apps/client/src/app/components/footer/footer.component.html
20
@@ -1188,7 +1188,7 @@
Please enter your coupon code.
- Por favor, ingresa tu código de cupón:
+ Por favor, ingresa tu código de cupón.
apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
210
@@ -1196,7 +1196,7 @@
Could not redeem coupon code
- No se puede canjear este código de cupón
+ No se pudo canjear el código de cupón
apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
174
@@ -1204,7 +1204,7 @@
Coupon code has been redeemed
- El codigo de cupón ha sido canjeado
+ El código del cupón ha sido canjeado
apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
187
@@ -1212,7 +1212,7 @@
Reload
- Refrescar
+ Recargar
apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
188
@@ -1220,10 +1220,10 @@
Do you really want to remove this sign in method?
- ¿Estás seguro de eliminar este método de acceso?
+ ¿Seguro que quieres eliminar este método de acceso?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 282
+ 279
@@ -1248,7 +1248,7 @@
Try Premium
- Prueba Premium
+ Probar Premium
apps/client/src/app/components/user-account-membership/user-account-membership.html
53
@@ -1256,7 +1256,7 @@
Redeem Coupon
- Canjea el cupón
+ Canjear cupón
apps/client/src/app/components/user-account-membership/user-account-membership.html
67
@@ -1280,10 +1280,10 @@
Locale
- Ubicación
+ Configuración regional
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 509
+ 512
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -1320,7 +1320,7 @@
User ID
- ID usuario
+ ID de usuario
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
51
@@ -1379,7 +1379,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 375
+ 381
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -1400,7 +1400,7 @@
Update account
- Editar cuenta
+ Actualizar cuenta
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
8
@@ -1416,14 +1416,14 @@
Currency
- Divisa base
+ Divisa
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
199
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 316
+ 317
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -1480,7 +1480,7 @@
Account ID
- ID cuenta
+ ID de cuenta
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
96
@@ -1620,7 +1620,7 @@
Frequently Asked Questions (FAQ)
- Preguntas más frecuentes (FAQ)
+ Preguntas frecuentes (FAQ)
apps/client/src/app/components/footer/footer.component.html
33
@@ -1661,6 +1661,10 @@
Overview
Visión general
+
+ apps/client/src/app/components/admin-jobs/admin-jobs.html
+ 7
+
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
114
@@ -1699,7 +1703,7 @@
Mercados
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 378
+ 381
apps/client/src/app/components/footer/footer.component.html
@@ -1784,7 +1788,7 @@
By Holding
- Por participación
+ Por posiciones
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
107
@@ -1848,7 +1852,7 @@
Top
- Lo mejor
+ Mejores
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
305
@@ -1856,7 +1860,7 @@
Bottom
- Lo peor
+ Peores
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
354
@@ -1880,7 +1884,7 @@
Holdings
- Participaciones
+ Posiciones
apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html
102
@@ -1908,7 +1912,7 @@
Update activity
- Actualizar opereación
+ Actualizar operación
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
10
@@ -1919,7 +1923,7 @@
Semana actual
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
@@ -2003,7 +2007,7 @@
Nota
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 432
+ 435
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
@@ -2016,7 +2020,7 @@
Activities
- Operación
+ Operaciones
apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html
86
@@ -2043,7 +2047,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 342
+ 348
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2067,7 +2071,7 @@
Importando datos...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 175
+ 174
@@ -2075,12 +2079,12 @@
La importación se ha completado
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 185
+ 184
or start a discussion at
- o iniciar una discusión en
+ o inicia una discusión en
apps/client/src/app/pages/about/overview/about-overview-page.html
94
@@ -2152,7 +2156,7 @@
Sustainable retirement income
- Ingreso sostenible de retiro
+ Ingresos sostenibles para la jubilación
apps/client/src/app/pages/portfolio/fire/fire-page.html
41
@@ -2160,7 +2164,7 @@
Ghostfolio empowers you to keep track of your wealth.
- Ghostfolio te permite hacer un seguimiento de tu riqueza.
+ Ghostfolio te permite hacer un seguimiento de tu patrimonio.
apps/client/src/app/pages/public/public-page.html
237
@@ -2193,6 +2197,10 @@
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
88
+
+ libs/ui/src/lib/value/value.component.html
+ 18
+
Resources
@@ -2308,7 +2316,7 @@
Do you really want to delete this activity?
- ¿Estás seguro de eliminar esta operación?
+ ¿Seguro que quieres eliminar esta operación?
libs/ui/src/lib/activities-table/activities-table.component.ts
292
@@ -2324,7 +2332,7 @@
contact us
- contactarnos
+ contáctanos
apps/client/src/app/pages/pricing/pricing-page.html
336
@@ -2340,7 +2348,7 @@
Annual Interest Rate
- Tipo de interés anual
+ Tasa de interés anual
libs/ui/src/lib/fire-calculator/fire-calculator.component.html
21
@@ -2372,14 +2380,14 @@
Oops! Something went wrong.
- Vaya! Algo no funcionó bien.
+ ¡Vaya! Algo no funcionó bien.
apps/client/src/app/core/http-response.interceptor.ts
86
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 193
+ 192
@@ -2395,7 +2403,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 195
+ 194
@@ -2424,7 +2432,7 @@
Latest activities
- Últimas actividades
+ Últimas operaciones
apps/client/src/app/pages/public/public-page.html
210
@@ -2515,7 +2523,7 @@
Ahorros
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 405
+ 424
@@ -2531,7 +2539,7 @@
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 395
+ 414
libs/ui/src/lib/i18n.ts
@@ -2551,7 +2559,7 @@
Depósito
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 385
+ 404
@@ -2559,7 +2567,7 @@
Mensual
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 91
+ 90
@@ -2583,11 +2591,11 @@
Miedo
apps/client/src/app/components/home-market/home-market.component.ts
- 42
+ 41
apps/client/src/app/components/markets/markets.component.ts
- 47
+ 46
libs/ui/src/lib/i18n.ts
@@ -2599,11 +2607,11 @@
Codicia
apps/client/src/app/components/home-market/home-market.component.ts
- 43
+ 42
apps/client/src/app/components/markets/markets.component.ts
- 48
+ 47
libs/ui/src/lib/i18n.ts
@@ -2615,12 +2623,12 @@
Filtrar por...
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 390
+ 383
Hello, has shared a Portfolio with you!
- Hola, ha compartido una Cartera contigo!
+ ¡Hola, ha compartido una cartera contigo!
apps/client/src/app/pages/public/public-page.html
5
@@ -2648,10 +2656,10 @@
Benchmark
- Benchmark
+ Índice de referencia
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 376
+ 379
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
@@ -2663,11 +2671,11 @@
No se pudo validar el formulario
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 554
+ 570
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 557
+ 573
@@ -2699,7 +2707,7 @@
Automático
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 70
+ 69
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -2740,7 +2748,7 @@
Portfolio Evolution
- Evolución cartera
+ Evolución de la cartera
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
407
@@ -2787,7 +2795,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 326
+ 327
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -2811,7 +2819,7 @@
Símbolo
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 68
+ 77
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -2827,7 +2835,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 315
+ 318
libs/ui/src/lib/i18n.ts
@@ -2860,7 +2868,7 @@
Commodity
- Bien
+ Materia prima
libs/ui/src/lib/i18n.ts
47
@@ -2868,7 +2876,7 @@
Equity
- Capital
+ Renta variable
apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html
57
@@ -2983,7 +2991,7 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 449
+ 451
@@ -3003,11 +3011,11 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 451
+ 453
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 465
+ 467
libs/ui/src/lib/top-holdings/top-holdings.component.html
@@ -3048,7 +3056,7 @@
If you retire today, you would be able to withdraw
- Si te retirases hoy, podrías sacar
+ Si te jubilas hoy, podrías retirar
apps/client/src/app/pages/portfolio/fire/fire-page.html
68
@@ -3072,7 +3080,7 @@
The following file formats are supported:
- Los siguientes formatos de archivo están soportados:
+ Los siguientes formatos de archivo son compatibles:
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
90
@@ -3092,7 +3100,7 @@
Activities Count
- Recuento de actividades
+ Número de operaciones
apps/client/src/app/components/admin-market-data/admin-market-data.html
156
@@ -3100,7 +3108,7 @@
Refresh
- Refrescar
+ Actualizar
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
21
@@ -3111,12 +3119,12 @@
Mapeo de símbolos
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 384
+ 387
Looking for a student discount?
- ¿Buscando un descuento para estudiantes?
+ ¿Buscas un descuento para estudiantes?
apps/client/src/app/pages/pricing/pricing-page.html
342
@@ -3147,7 +3155,7 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 76
+ 75
libs/ui/src/lib/i18n.ts
@@ -3175,7 +3183,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 342
+ 343
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -3203,7 +3211,7 @@
Validando datos...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 299
+ 293
@@ -3227,7 +3235,7 @@
Datos del mercado
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 397
+ 403
libs/common/src/lib/routes/routes.ts
@@ -3256,7 +3264,7 @@
Holding
- Participación
+ Posición
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
32
@@ -3279,15 +3287,15 @@
Anual
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 92
+ 91
Import Dividends
- Importar Dividendos
+ Importar dividendos
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 137
+ 136
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -3303,7 +3311,7 @@
Válido hasta
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 74
+ 86
libs/ui/src/lib/membership-card/membership-card.component.html
@@ -3328,7 +3336,7 @@
Higher Risk
- Riesgo mayor
+ Mayor riesgo
libs/ui/src/lib/i18n.ts
20
@@ -3344,10 +3352,10 @@
No Activities
- Sin actividades
+ Sin operaciones
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 146
+ 145
@@ -3360,7 +3368,7 @@
Everything in Basic , plus
- Todo en Básico , más
+ Todo lo incluido en Basic , más
apps/client/src/app/pages/pricing/pricing-page.html
199
@@ -3376,7 +3384,7 @@
Protection for sensitive information like absolute performances and quantity values
- Protección de información confidencial como rendimientos absolutos y valores cuantitativos
+ Protección de información confidencial como rendimientos absolutos y cantidades
apps/client/src/app/components/user-account-settings/user-account-settings.html
194
@@ -3400,7 +3408,7 @@
Are you an ambitious investor who needs the full picture?
- ¿Es usted un inversor ambicioso que necesita una visión completa?
+ ¿Eres un inversor ambicioso que necesita una visión completa?
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
15
@@ -3424,7 +3432,7 @@
Performance Benchmarks
- Puntos de referencia de rendimiento
+ Índices de referencia de rendimiento
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
32
@@ -3456,7 +3464,7 @@
and more Features...
- y más características...
+ y más funcionalidades...
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
44
@@ -3472,7 +3480,7 @@
Skip
- Saltar
+ Omitir
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
59
@@ -3528,7 +3536,7 @@
Unlimited Transactions
- Transacciones ilimitadas
+ Operaciones ilimitadas
apps/client/src/app/pages/pricing/pricing-page.html
35
@@ -3552,7 +3560,7 @@
Portfolio Performance
- Rendimiento del Portfolio
+ Rendimiento de la cartera
apps/client/src/app/pages/pricing/pricing-page.html
43
@@ -3564,7 +3572,7 @@
Self-hosted, update manually.
- Auto alojado, actualiza manualmente.
+ Autoalojado, actualiza manualmente.
apps/client/src/app/pages/pricing/pricing-page.html
84
@@ -3584,7 +3592,7 @@
For new investors who are just getting started with trading.
- Para nuevos inversores que estan empezando con el trading.
+ Para nuevos inversores que están empezando con el trading.
apps/client/src/app/pages/pricing/pricing-page.html
119
@@ -3592,7 +3600,7 @@
Fully managed Ghostfolio cloud offering.
- Oferta en la nube de Ghostfolio totalmente administrada.
+ Oferta de Ghostfolio en la nube totalmente gestionada.
apps/client/src/app/pages/pricing/pricing-page.html
150
@@ -3604,7 +3612,7 @@
For ambitious investors who need the full picture of their financial assets.
- Para inversores ambiciosos que necesitan una visión completa de sus activos financieros
+ Para inversores ambiciosos que necesitan una visión completa de sus activos financieros.
apps/client/src/app/pages/pricing/pricing-page.html
193
@@ -3623,11 +3631,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
- 588
+ 604
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 591
+ 607
@@ -3652,7 +3660,7 @@
Portfolio Allocations
- Distribucion del Portfolio
+ Distribución de la cartera
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
28
@@ -3680,7 +3688,7 @@
Data Import and Export
- Importacion y exportacion de datos
+ Importación y exportación de datos
apps/client/src/app/pages/pricing/pricing-page.html
63
@@ -3692,7 +3700,7 @@
Switch to Ghostfolio Premium easily
- Cambia a Ghostfolio Premium facilmente
+ Cambia a Ghostfolio Premium fácilmente
libs/ui/src/lib/i18n.ts
13
@@ -3708,7 +3716,7 @@
Email and Chat Support
- Soporte a Traves de Email y Chat
+ Soporte a través de correo electrónico y chat
apps/client/src/app/pages/pricing/pricing-page.html
248
@@ -3716,7 +3724,7 @@
Switch to Ghostfolio Premium or Ghostfolio Open Source easily
- Cambie a Ghostfolio Premium o Ghostfolio Open Source fácilmente
+ Cambia a Ghostfolio Premium o Ghostfolio Open Source fácilmente
libs/ui/src/lib/i18n.ts
12
@@ -3724,7 +3732,7 @@
Switch to Ghostfolio Open Source or Ghostfolio Basic easily
- Cambie a Ghostfolio Open Source o Ghostfolio Basic fácilmente
+ Cambia a Ghostfolio Open Source o Ghostfolio Basic fácilmente
libs/ui/src/lib/i18n.ts
14
@@ -3748,7 +3756,7 @@
Professional Data Provider
- Proveedor de datos profesional
+ Proveedor de datos profesional
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
40
@@ -3808,7 +3816,7 @@
Do you really want to delete these activities?
- ¿Realmente deseas eliminar estas actividades?
+ ¿Seguro que quieres eliminar estas operaciones?
libs/ui/src/lib/activities-table/activities-table.component.ts
282
@@ -3822,6 +3830,14 @@
306
+
+ Explore
+ Explorar
+
+ apps/client/src/app/pages/resources/overview/resources-overview.component.html
+ 11
+
+
By
Por
@@ -3843,12 +3859,12 @@
Año actual
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
Add platform
- Agregar plataforma
+ Añadir plataforma
apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html
10
@@ -3856,14 +3872,14 @@
Url
- ¿La URL?
+ Url
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 419
+ 422
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 550
+ 553
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -3876,18 +3892,18 @@
Asset profile has been saved
- El perfil del activo ha sido guardado
+ Perfil del activo guardado
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 578
+ 594
Do you really want to delete this platform?
- ¿Realmente deseas eliminar esta plataforma?
+ ¿Seguro que quieres eliminar esta plataforma?
apps/client/src/app/components/admin-platform/admin-platform.component.ts
- 106
+ 111
@@ -3895,7 +3911,7 @@
Plataformas
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 195
+ 212
@@ -3916,7 +3932,7 @@
Upgrade to Ghostfolio Premium today and gain access to exclusive features to enhance your investment experience:
- Actualiza a Ghostfolio Premium hoy y accede a características exclusivas para mejorar tu experiencia de inversión:
+ Actualiza a Ghostfolio Premium hoy y accede a funcionalidades exclusivas para mejorar tu experiencia de inversión:
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
18
@@ -3932,7 +3948,7 @@
Add Platform
- Agregar plataforma
+ Añadir plataforma
apps/client/src/app/components/admin-platform/admin-platform.component.html
9
@@ -3940,7 +3956,7 @@
Settings
- Configuraciones
+ Ajustes
apps/client/src/app/components/user-account-settings/user-account-settings.html
2
@@ -3956,7 +3972,7 @@
This activity already exists.
- Esta actividad ya existe.
+ Esta operación ya existe.
libs/ui/src/lib/i18n.ts
21
@@ -3964,7 +3980,7 @@
Manage Benchmarks
- Gestionar puntos de referencia
+ Gestionar índices de referencia
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html
35
@@ -3996,7 +4012,7 @@
Select Activities
- Seleccionar dividendos
+ Seleccionar operaciones
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
115
@@ -4156,7 +4172,7 @@
Multi-Accounts
- Cuentas múltiples
+ Múltiples cuentas
apps/client/src/app/pages/features/features-page.html
127
@@ -4164,7 +4180,7 @@
Portfolio Calculations
- Cálculos de portafolio
+ Cálculos de la cartera
apps/client/src/app/pages/features/features-page.html
141
@@ -4180,7 +4196,7 @@
Market Mood
- Modo de mercado
+ Sentimiento del mercado
apps/client/src/app/pages/features/features-page.html
215
@@ -4196,7 +4212,7 @@
Multi-Language
- Multilenguaje
+ Multilingüe
apps/client/src/app/pages/features/features-page.html
259
@@ -4220,7 +4236,7 @@
Liability
- Responsabilidad
+ Pasivo
libs/ui/src/lib/i18n.ts
41
@@ -4228,7 +4244,7 @@
and we share aggregated key metrics of the platform’s performance
- y compartimos agregados métricas clave del rendimiento de la plataforma
+ y compartimos métricas clave agregadas del rendimiento de la plataforma
apps/client/src/app/pages/about/overview/about-overview-page.html
32
@@ -4239,12 +4255,12 @@
Configuración del scraper
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 471
+ 474
Add Asset Profile
- Agregar perfil de activo
+ Añadir perfil de activo
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
7
@@ -4264,7 +4280,7 @@
Discover Open Source Alternatives for Personal Finance Tools
- Descubra alternativas de software libre para herramientas de finanzas personales
+ Descubre alternativas de software de código abierto para herramientas de finanzas personales
apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html
5
@@ -4416,7 +4432,7 @@
Effortlessly track, analyze, and visualize your wealth with Ghostfolio.
- Siga, analice y visualice su patrimonio sin esfuerzo con Ghostfolio.
+ Sigue, analiza y visualiza tu patrimonio sin esfuerzo con Ghostfolio.
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
329
@@ -4460,7 +4476,7 @@
Buy
- Comprar
+ Compra
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
31
@@ -4472,7 +4488,7 @@
Valuable
- Valioso
+ Activo de valor
libs/ui/src/lib/i18n.ts
43
@@ -4483,7 +4499,7 @@
ETFs sin países
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 136
+ 135
@@ -4491,7 +4507,7 @@
ETFs sin sectores
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 141
+ 140
@@ -4544,7 +4560,7 @@
The source code is fully available as open source software (OSS) under the AGPL-3.0 license
- El código fuente está disponible completamente en software de código abierto (OSS) bajo la licencia AGPL-3.0
+ El código fuente está disponible como software de código abierto (OSS) bajo la licencia AGPL-3.0
apps/client/src/app/pages/about/overview/about-overview-page.html
16
@@ -4568,7 +4584,7 @@
Capture your activities
- Captura tus actividades
+ Captura tus operaciones
apps/client/src/app/components/home-overview/home-overview.html
28
@@ -4576,7 +4592,7 @@
Record your investment activities to keep your portfolio up to date.
- Registra tus actividades de inversión para mantener tu portafolio actualizado.
+ Registra tus operaciones de inversión para mantener tu cartera actualizada.
apps/client/src/app/components/home-overview/home-overview.html
30
@@ -4584,7 +4600,7 @@
Monitor and analyze your portfolio
- Monitorea y analiza tu portafolio
+ Monitorea y analiza tu cartera
apps/client/src/app/components/home-overview/home-overview.html
37
@@ -4600,7 +4616,7 @@
Ready to take control of your personal finances?
- ¿Listo para tomar el control de tus finanzas personales?
+ ¿Estás preparado para tomar el control de tus finanzas personales?
apps/client/src/app/components/home-overview/home-overview.html
12
@@ -4616,7 +4632,7 @@
this is projected to increase to
- esto se proyecta a aumentar a
+ se proyecta que esto aumente a
apps/client/src/app/pages/portfolio/fire/fire-page.html
147
@@ -4632,7 +4648,7 @@
At Ghostfolio, transparency is at the core of our values. We publish the source code as open source software (OSS) under the AGPL-3.0 license and we openly share aggregated key metrics of the platform’s operational status.
- En Ghostfolio, la transparencia está en el centro de nuestros valores. Publicamos el código fuente como software de código abierto (OSS) bajo la licencia Licencia AGPL-3.0 y compartimos abiertamente métricas clave agregadas sobre el estado operativo de la plataforma.
+ En Ghostfolio, la transparencia está en el centro de nuestros valores. Publicamos el código fuente como software de código abierto (OSS) bajo la Licencia AGPL-3.0 y compartimos abiertamente métricas clave agregadas sobre el estado operativo de la plataforma.
apps/client/src/app/pages/open/open-page.html
7
@@ -4668,10 +4684,10 @@
Job ID
- ID de trabajo
+ ID del trabajo
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 34
+ 43
@@ -4724,10 +4740,10 @@
Currencies
- Monedas
+ Divisas
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 131
+ 130
apps/client/src/app/pages/public/public-page.html
@@ -4768,7 +4784,7 @@
Check out the numerous features of Ghostfolio to manage your wealth
- Descubra las numerosas funciones de Ghostfolio para gestionar su patrimonio
+ Descubre las numerosas funciones de Ghostfolio para gestionar tu patrimonio
apps/client/src/app/pages/features/features-page.html
7
@@ -4779,11 +4795,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
- 509
+ 525
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 512
+ 528
@@ -4844,7 +4860,7 @@
Protect your assets . Refine your personal investment strategy .
- Protege tus assets . Mejora tu estrategia de inversión personal .
+ Protege tus activos . Mejora tu estrategia de inversión personal .
apps/client/src/app/pages/landing/landing-page.html
124
@@ -4892,7 +4908,7 @@
Get access to 80’000+ tickers from over 50 exchanges
- Obtén acceso a más de 80,000 tickers de más de 50 exchanges
+ Accede a más de 80.000 tickers de más de 50 bolsas
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
84
@@ -4924,7 +4940,7 @@
pursuing a buy & hold strategy
- persiguiendo una compra & mantener estrategia
+ siguiendo una estrategia de comprar y mantener
apps/client/src/app/pages/landing/landing-page.html
184
@@ -4932,7 +4948,7 @@
interested in getting insights of your portfolio composition
- interesado en obtener información sobre la composición de tu portafolio
+ interesado en obtener información sobre la composición de tu cartera
apps/client/src/app/pages/landing/landing-page.html
189
@@ -4948,7 +4964,7 @@
into minimalism
- en el minimalismo
+ interesado en el minimalismo
apps/client/src/app/pages/landing/landing-page.html
197
@@ -4956,7 +4972,7 @@
caring about diversifying your financial resources
- preocuparse por diversificar tus recursos financieros
+ preocupado por diversificar tus recursos financieros
apps/client/src/app/pages/landing/landing-page.html
201
@@ -5012,7 +5028,7 @@
How does Ghostfolio work?
- ¿Cómo Ghostfolio work?
+ ¿Cómo funciona Ghostfolio ?
apps/client/src/app/pages/landing/landing-page.html
282
@@ -5028,7 +5044,7 @@
* no e-mail address nor credit card required
- * no se requiere dirección de correo electrónico ni tarjeta de crédito
+ * no se necesita correo electrónico ni tarjeta de crédito
apps/client/src/app/pages/landing/landing-page.html
292
@@ -5044,7 +5060,7 @@
Get valuable insights of your portfolio composition
- Obtén información valiosa sobre la composición de tu portafolio
+ Obtén información valiosa sobre la composición de tu cartera
apps/client/src/app/pages/landing/landing-page.html
316
@@ -5052,7 +5068,7 @@
Are you ready?
- ¿Estás tú listo?
+ ¿Estás preparado ?
apps/client/src/app/pages/landing/landing-page.html
330
@@ -5076,7 +5092,7 @@
less than
- menos que
+ menos de
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
129
@@ -5265,7 +5281,7 @@
Open Source Alternative to
- Alternativa de software libre a
+ Alternativa de software de código abierto a
apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html
42
@@ -5273,7 +5289,7 @@
The Open Source Alternative to
- La alternativa de software libre a
+ La alternativa de software de código abierto a
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
8
@@ -5281,7 +5297,7 @@
Are you looking for an open source alternative to ? Ghostfolio is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a wide range of functionalities to help you make informed decisions and take control of your financial future.
- ¿Estás buscando una alternativa de código abierto a ? Ghostfolio es una potente herramienta de gestión de carteras que ofrece a los usuarios una plataforma integral para rastrear, analizar y optimizar sus inversiones. Ya seas un inversor con experiencia o estés comenzando, Ghostfolio ofrece una interfaz intuitiva y una amplia gama de funcionalidades para ayudarte a tomar decisiones informadas y tener el control de tu futuro financiero.
+ ¿Estás buscando una alternativa de código abierto a ? Ghostfolio es una potente herramienta de gestión de carteras que proporciona a los usuarios una plataforma completa para seguir, analizar y optimizar sus inversiones. Ya seas un inversor con experiencia o estés comenzando, Ghostfolio ofrece una interfaz intuitiva y una amplia gama de funcionalidades para ayudarte a tomar decisiones informadas y tener el control de tu futuro financiero.
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
19
@@ -5305,7 +5321,7 @@
open-source-alternative-to
- alternativa-de-software-libre-a
+ alternativa-de-software-de-codigo-abierto-a
kebab-case
libs/common/src/lib/routes/routes.ts
@@ -5326,7 +5342,7 @@
Ready to take your investments to the next level ?
- ¿Listo para llevar sus inversiones al siguiente nivel ?
+ ¿Estás preparado para llevar tus inversiones al siguiente nivel ?
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
325
@@ -5374,7 +5390,7 @@
with your university e-mail address
- con tu dirección de correo electrónico de la universidad
+ con tu dirección de correo electrónico universitaria
apps/client/src/app/pages/pricing/pricing-page.html
348
@@ -5426,7 +5442,7 @@
One-time fee, annual account fees
- Tarifa única, tarifas anuales de la cuenta
+ Comisión única, comisiones anuales de la cuenta
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
33
@@ -5442,7 +5458,7 @@
Fee
- Tarifa
+ Comisión
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
258
@@ -5466,7 +5482,7 @@
Add Tag
- Agregar etiqueta
+ Añadir etiqueta
apps/client/src/app/components/admin-tag/admin-tag.component.html
9
@@ -5474,10 +5490,10 @@
Do you really want to delete this tag?
- ¿Realmente deseas eliminar esta etiqueta?
+ ¿Seguro que quieres eliminar esta etiqueta?
apps/client/src/app/components/admin-tag/admin-tag.component.ts
- 103
+ 108
@@ -5558,7 +5574,7 @@
Request it
- Solicitar
+ Solicítalo
apps/client/src/app/pages/pricing/pricing-page.html
344
@@ -5577,12 +5593,12 @@
Perfil de activo
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 52
+ 61
Do you really want to delete this asset profile?
- ¿Realmente deseas eliminar este perfil de activo?
+ ¿Seguro que quieres eliminar este perfil de activo?
apps/client/src/app/components/admin-market-data/admin-market-data.service.ts
37
@@ -5606,7 +5622,7 @@
Ghostfolio is a personal finance dashboard to keep track of your net worth including cash, stocks, ETFs and cryptocurrencies across multiple platforms.
- Ghostfolio es un dashboard de finanzas personales para hacer un seguimiento de tus activos como acciones, ETFs o criptodivisas a través de múltiples plataformas.
+ Ghostfolio es un panel de control de finanzas personales para hacer un seguimiento de tu patrimonio neto, incluyendo efectivo, acciones, ETFs y criptomonedas a través de múltiples plataformas.
apps/client/src/app/pages/i18n/i18n-page.html
5
@@ -5642,7 +5658,7 @@
Ghostfolio vs comparison table
- Ghostfolio vs tabla comparativa
+ Tabla comparativa de Ghostfolio vs
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
55
@@ -5658,7 +5674,7 @@
app, asset, cryptocurrency, dashboard, etf, finance, management, performance, portfolio, software, stock, trading, wealth, web3
- aplicación, activo, criptomoneda, panel, ETF, finanzas, gestión, rendimiento, cartera, software, acciones, comercio, riqueza, web3
+ aplicación, activo, criptomoneda, panel, ETF, finanzas, gestión, rendimiento, cartera, software, acciones, comercio, patrimonio, web3
apps/client/src/app/pages/i18n/i18n-page.html
10
@@ -5666,7 +5682,7 @@
Oops, cash balance transfer has failed.
- Oops, el saldo de efectivo no se ha transferido.
+ ¡Vaya! La transferencia del saldo de efectivo ha fallado.
apps/client/src/app/pages/accounts/accounts-page.component.ts
341
@@ -5682,7 +5698,7 @@
Extreme Greed
- Avaricia extrema
+ Codicia extrema
libs/ui/src/lib/i18n.ts
107
@@ -5698,7 +5714,7 @@
Oops! Could not parse historical data.
- ¡Ups! No se pudieron analizar los datos históricos.
+ ¡Vaya! No se pudieron analizar los datos históricos.
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts
284
@@ -5706,10 +5722,10 @@
Do you really want to delete this system message?
- ¿Realmente deseas eliminar este mensaje del sistema?
+ ¿Seguro que quieres eliminar este mensaje del sistema?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 206
+ 209
@@ -5750,7 +5766,7 @@
Do you really want to delete this account balance?
- ¿Realmente desea eliminar el saldo de esta cuenta?
+ ¿Seguro que quieres eliminar el saldo de esta cuenta?
libs/ui/src/lib/account-balances/account-balances.component.ts
113
@@ -5758,7 +5774,7 @@
If a translation is missing, kindly support us in extending it here .
- Si falta una traducción, por favor ayúdenos a ampliarla. here .
+ Si falta una traducción, por favor ayúdanos a completarla aquí .
apps/client/src/app/components/user-account-settings/user-account-settings.html
59
@@ -5769,7 +5785,7 @@
El precio actual de mercado es
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 706
+ 722
@@ -5777,7 +5793,7 @@
Prueba
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 568
+ 571
@@ -5814,7 +5830,7 @@
Oops! Could not grant access.
- ¡Ups! No se pudo otorgar acceso.
+ ¡Vaya! No se pudo otorgar acceso.
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts
141
@@ -5846,7 +5862,7 @@
Market data is delayed for
- Los datos del mercado se retrasan por
+ Los datos del mercado tienen un retraso de
apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts
95
@@ -5865,11 +5881,11 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 81
+ 80
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 97
+ 96
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
@@ -5889,7 +5905,7 @@
Cerrar posición
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 441
+ 447
@@ -5902,7 +5918,7 @@
Asset Performance
- Rendimiento de activos
+ Rendimiento de los activos
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
190
@@ -5910,7 +5926,7 @@
Absolute Currency Performance
- Rendimiento absoluto de divisas
+ Rendimiento absoluto de las divisas
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
211
@@ -5918,7 +5934,7 @@
Currency Performance
- Rendimiento de la moneda
+ Rendimiento de la divisa
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
236
@@ -5937,7 +5953,7 @@
WTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
libs/ui/src/lib/assistant/assistant.component.ts
@@ -5957,7 +5973,7 @@
MTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
libs/ui/src/lib/assistant/assistant.component.ts
@@ -5966,7 +5982,7 @@
Year to date
- El año hasta la fecha
+ Año hasta la fecha
libs/ui/src/lib/assistant/assistant.component.ts
374
@@ -5986,7 +6002,7 @@
Oops! A data provider is experiencing the hiccups.
- ¡Ups! Un proveedor de datos está experimentando problemas.
+ ¡Vaya! Un proveedor de datos está experimentando problemas.
apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html
8
@@ -6005,7 +6021,7 @@
año
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
@@ -6025,7 +6041,7 @@
años
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6045,7 +6061,7 @@
Recopilación de datos
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 587
+ 594
apps/client/src/app/components/admin-overview/admin-overview.html
@@ -6057,7 +6073,7 @@
General
apps/client/src/app/pages/faq/faq-page.component.ts
- 49
+ 41
@@ -6065,7 +6081,7 @@
Nube
apps/client/src/app/pages/faq/faq-page.component.ts
- 54
+ 46
libs/common/src/lib/routes/routes.ts
@@ -6077,7 +6093,7 @@
Autoalojamiento
apps/client/src/app/pages/faq/faq-page.component.ts
- 60
+ 52
libs/common/src/lib/routes/routes.ts
@@ -6086,7 +6102,7 @@
self-hosting
- auto-alojado
+ autoalojado
kebab-case
libs/common/src/lib/routes/routes.ts
@@ -6118,7 +6134,7 @@
Activo
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 64
+ 63
@@ -6126,7 +6142,7 @@
Cerrado
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 65
+ 64
@@ -6139,7 +6155,7 @@
Activity
- Actividad
+ Operación
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
229
@@ -6155,10 +6171,10 @@
Execute Job
- Ejecutar Tarea
+ Ejecutar trabajo
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 220
+ 229
@@ -6166,7 +6182,7 @@
Prioridad
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 96
+ 105
@@ -6187,7 +6203,7 @@
{VAR_PLURAL, plural, =1 {activity} other {activities}}
- {VAR_PLURAL, plural, =1 {actividad} other {actividades}}
+ {VAR_PLURAL, plural, =1 {operación} other {operaciones}}
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
14
@@ -6203,7 +6219,7 @@
Delete Activities
- Eliminar actividades
+ Eliminar operaciones
libs/ui/src/lib/activities-table/activities-table.component.html
69
@@ -6219,10 +6235,10 @@
Do you really want to close your Ghostfolio account?
- ¿Estás seguro de querer borrar tu cuenta de Ghostfolio?
+ ¿Seguro que quieres eliminar tu cuenta de Ghostfolio?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 208
+ 205
@@ -6251,7 +6267,7 @@
Approximation based on the top holdings of each ETF
- Aproximación basada en las principales participaciones de cada ETF
+ Aproximación basada en las principales posiciones de cada ETF
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
340
@@ -6270,15 +6286,15 @@
Incluir en
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 374
+ 377
Oops! There was an error setting up biometric authentication.
- ¡Ups! Hubo un error al configurar la autenticación biométrica.
+ ¡Vaya! Hubo un error al configurar la autenticación biométrica.
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 336
+ 333
@@ -6291,15 +6307,15 @@
Benchmarks
- Puntos de referencia
+ Índices de referencia
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 126
+ 125
Delete Profiles
- Borrar Perfiles
+ Eliminar Perfiles
apps/client/src/app/components/admin-market-data/admin-market-data.html
242
@@ -6307,7 +6323,7 @@
Do you really want to delete these profiles?
- Estas seguro de borrar estos perfiles?
+ ¿Seguro que quieres eliminar estos perfiles?
apps/client/src/app/components/admin-market-data/admin-market-data.service.ts
68
@@ -6315,7 +6331,7 @@
Oops! Could not delete profiles.
- ¡Ups! No se pudieron eliminar los perfiles.
+ ¡Vaya! No se pudieron eliminar los perfiles.
apps/client/src/app/components/admin-market-data/admin-market-data.service.ts
56
@@ -6331,7 +6347,7 @@
Chart
- Grafico
+ Gráfico
apps/client/src/app/components/home-holdings/home-holdings.html
19
@@ -6363,7 +6379,7 @@
Budgeting
- Presupuestación
+ Presupuestos
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
85
@@ -6503,7 +6519,7 @@
Wealth
- Riqueza
+ Patrimonio
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
99
@@ -6551,7 +6567,7 @@
View Holding
- Ver fondos
+ Ver posición
libs/ui/src/lib/activities-table/activities-table.component.html
450
@@ -6674,7 +6690,7 @@
Error
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 697
+ 713
@@ -6695,7 +6711,7 @@
Oops! Could not update access.
- Oops! No se pudo actualizar el acceso.
+ ¡Vaya! No se pudo actualizar el acceso.
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts
178
@@ -6726,7 +6742,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 592
+ 599
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6778,7 +6794,7 @@
Cerrar
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 594
+ 601
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6850,12 +6866,12 @@
Instantánea de la cartera
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 56
+ 65
Change with currency effect Change
- Cambiar con efecto de cambio dedivisa Cambiar
+ Cambio con el efecto de la divisa Cambio
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
63
@@ -6871,7 +6887,7 @@
Performance with currency effect Performance
- Rendimiento con cambio de divisa Rendimiento
+ Rendimiento con el efecto de la divisa Rendimiento
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
83
@@ -6895,7 +6911,7 @@
send an e-mail to
- enviar un correo electrónico a
+ envía un correo electrónico a
apps/client/src/app/pages/about/overview/about-overview-page.html
87
@@ -6917,6 +6933,14 @@
42
+
+ has been copied to the clipboard
+ has been copied to the clipboard
+
+ libs/ui/src/lib/value/value.component.ts
+ 180
+
+
From the beginning
Desde el principio
@@ -6927,7 +6951,7 @@
Oops! Invalid currency.
- ¡Ups! Moneda inválida.
+ ¡Vaya! Divisa no válida.
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
48
@@ -6975,7 +6999,7 @@
to use our referral link and get a Ghostfolio Premium membership for one year
- para usar nuestro enlace de referido y obtener una membresía Ghostfolio Premium por un año
+ para utilizar nuestro enlace de recomendación y obtener una membresía de Ghostfolio Premium por un año
apps/client/src/app/pages/pricing/pricing-page.html
340
@@ -7055,7 +7079,7 @@
Ghostfolio is a lightweight wealth management application for individuals to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions.
- Ghostfolio es una aplicación de gestión de patrimonio para aquellos individuos que desean realizar un seguimiento de acciones, ETFs o criptomonedas y tomar decisiones de inversión sólidas y basadas en datos.
+ Ghostfolio es una aplicación ligera de gestión de patrimonio para que las personas realicen un seguimiento de acciones, ETFs o criptomonedas y tomen decisiones de inversión sólidas basadas en datos.
apps/client/src/app/pages/about/overview/about-overview-page.html
10
@@ -7063,7 +7087,7 @@
Oops! Could not find any assets.
- ¡Ups! No se pudieron encontrar activos.
+ ¡Vaya! No se pudieron encontrar activos.
libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html
40
@@ -7082,12 +7106,12 @@
Configurar clave API
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 171
+ 188
Get access to 80’000+ tickers from over 50 exchanges
- Accede a más de 80’000 tickers de más de 50 bolsas
+ Accede a más de 80.000 tickers de más de 50 bolsas
libs/ui/src/lib/i18n.ts
26
@@ -7169,7 +7193,7 @@
Threshold range
- Rango umbral
+ Rango del umbral
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
9
@@ -7188,7 +7212,7 @@
de
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 135
+ 152
@@ -7196,7 +7220,7 @@
solicitudes diarias
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 137
+ 154
@@ -7204,20 +7228,20 @@
Eliminar clave API
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 161
+ 178
Do you really want to delete the API key?
- ¿Realmente deseas eliminar la clave API?
+ ¿Seguro que quieres eliminar la clave API?
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 127
+ 133
Please enter your Ghostfolio API key:
- Ingrese su clave API de Ghostfolio:
+ Ingresa tu clave API de Ghostfolio:
apps/client/src/app/pages/api/api-page.component.ts
43
@@ -7225,7 +7249,7 @@
API Requests Today
- Solicitudes de API hoy
+ Solicitudes de API de hoy
apps/client/src/app/components/admin-users/admin-users.html
161
@@ -7245,7 +7269,7 @@
Set this API key in your self-hosted environment:
- Configure esta clave API en su entorno autohospedado:
+ Configura esta clave API en tu entorno autoalojado:
apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
151
@@ -7261,7 +7285,7 @@
Do you really want to generate a new API key?
- ¿Realmente desea generar una nueva clave API?
+ ¿Seguro que quieres generar una nueva clave API?
apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
159
@@ -7277,7 +7301,7 @@
Generate Ghostfolio Premium Data Provider API key for self-hosted environments...
- Genere la clave API del proveedor de datos premium de Ghostfolio para entornos autohospedados...
+ Genera la clave API del proveedor de datos premium de Ghostfolio para entornos autoalojados...
libs/ui/src/lib/membership-card/membership-card.component.html
29
@@ -7285,7 +7309,7 @@
out of
- fuera de
+ de
apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html
56
@@ -7293,7 +7317,7 @@
rules align with your portfolio.
- Las reglas se alinean con su cartera.
+ reglas se alinean con tu cartera.
apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html
58
@@ -7301,10 +7325,10 @@
Save
- Ahorrar
+ Guardar
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 603
+ 610
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -7356,7 +7380,7 @@
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 260
+ 257
@@ -7369,7 +7393,7 @@
Check the system status at
- Verificar el estado del sistema en
+ Verifica el estado del sistema en
apps/client/src/app/pages/about/overview/about-overview-page.html
57
@@ -7380,12 +7404,12 @@
Por favor, ingresa tu clave API de Ghostfolio.
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 146
+ 152
Change with currency effect
- Cambiar con el efecto del tipo de cambio de divisa
+ Cambio con el efecto de la divisa
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
116
@@ -7393,10 +7417,10 @@
AI prompt has been copied to the clipboard
- El aviso de IA ha sido copiado al portapapeles
+ El prompt para la IA ha sido copiado al portapapeles
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 201
+ 199
@@ -7409,10 +7433,10 @@
Lazy
- Perezoso
+ Bajo demanda
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7420,7 +7444,7 @@
Instantáneo
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7428,7 +7452,7 @@
Precio de mercado por defecto
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 481
+ 484
@@ -7436,7 +7460,7 @@
Modo
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 518
+ 521
@@ -7444,7 +7468,7 @@
Selector
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 534
+ 537
@@ -7452,7 +7476,7 @@
Encabezados de solicitud HTTP
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 494
+ 497
@@ -7460,7 +7484,7 @@
final del día
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7468,7 +7492,7 @@
en tiempo real
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7476,7 +7500,7 @@
Abrir Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 202
+ 200
@@ -7489,14 +7513,14 @@
Change
- Cambiar
+ Cambio
libs/ui/src/lib/holdings-table/holdings-table.component.html
138
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
@@ -7508,7 +7532,7 @@
apps/client/src/app/components/home-overview/home-overview.component.ts
- 55
+ 54
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -7516,11 +7540,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 388
+ 390
@@ -7533,7 +7557,7 @@
Copy portfolio data to clipboard for AI prompt
- Copiar los datos del portafolio al portapapeles para el aviso de IA
+ Copiar los datos de la cartera al portapapeles para el prompt de IA
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
42
@@ -7541,7 +7565,7 @@
Copy AI prompt to clipboard for analysis
- Copiar el aviso de IA al portapapeles para análisis
+ Copiar el prompt de IA al portapapeles para análisis
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
67
@@ -7549,7 +7573,7 @@
Total amount
- Cantidad total
+ Importe total
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
95
@@ -7581,7 +7605,7 @@
Terms and Conditions
- Terminos y condiciones
+ Términos y Condiciones
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
15
@@ -7624,24 +7648,24 @@
Token de seguridad
apps/client/src/app/components/admin-users/admin-users.component.ts
- 239
+ 235
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 170
+ 167
Do you really want to generate a new security token for this user?
- ¿Realmente deseas generar un nuevo token de seguridad para este usuario?
+ ¿Seguro que quieres generar un nuevo token de seguridad para este usuario?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 244
+ 240
Find account, holding or page...
- Buscar cuenta, posición o página...
+ Busca una cuenta, posición o página...
libs/ui/src/lib/assistant/assistant.component.ts
115
@@ -7698,7 +7722,7 @@
and I agree to the Terms of Service .
- y acepto los Términos del servicio .
+ y acepto los Términos de servicio .
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
34
@@ -7709,7 +7733,7 @@
( ) ya está en uso.
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 633
+ 649
@@ -7717,7 +7741,7 @@
Ocurrió un error al actualizar a ( ).
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 641
+ 657
@@ -7781,7 +7805,7 @@
alguien
apps/client/src/app/pages/public/public-page.component.ts
- 59
+ 61
@@ -7810,15 +7834,15 @@
Do you really want to delete this item?
- ¿Realmente deseas eliminar este elemento?
+ ¿Seguro que quieres eliminar este elemento?
libs/ui/src/lib/benchmark/benchmark.component.ts
- 144
+ 139
Log out
- Finalizar la sesión
+ Cerrar sesión
apps/client/src/app/components/header/header.component.html
329
@@ -7826,7 +7850,7 @@
Calculations are based on delayed market data and may not be displayed in real-time.
- Los cálculos se basan en datos de mercado retrasados y es posible que no se muestren en tiempo real.
+ 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
@@ -7838,7 +7862,7 @@
changelog
- registro-decambios
+ registro-de-cambios
kebab-case
libs/common/src/lib/routes/routes.ts
@@ -7854,7 +7878,7 @@
La cuenta de usuario de demostración se ha sincronizado.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 274
+ 277
@@ -7867,7 +7891,7 @@
Set up
- Fondo de Emergencia: Establecer
+ Establecer
apps/client/src/app/pages/i18n/i18n-page.html
145
@@ -7891,7 +7915,7 @@
Fee Ratio
- Relación de tarifas
+ Relación de comisiones
apps/client/src/app/pages/i18n/i18n-page.html
152
@@ -7899,7 +7923,7 @@
The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
- Las tarifas superan el ${thresholdMax}% de su volumen total de inversión (${feeRatio}%)
+ Las comisiones superan el ${thresholdMax}% de tu volumen total de inversión (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
154
@@ -7907,7 +7931,7 @@
The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
- Las tarifas no superan el ${thresholdMax}% de su volumen total de inversión (${feeRatio}%)
+ Las comisiones no superan el ${thresholdMax}% de tu volumen total de inversión (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
158
@@ -7939,7 +7963,7 @@
Open Source Alternative to
- Alternativa de software libre a
+ Alternativa de software de código abierto a
libs/common/src/lib/routes/routes.ts
326
@@ -8001,7 +8025,7 @@
Fuel your self-hosted Ghostfolio with a powerful data provider to access 80,000+ tickers from over 50 exchanges worldwide.
- Alimenta tu Ghostfolio autoalojado con un proveedor de datos potente para acceder a más de 80.000 tickers de más de 50 intercambios a nivel mundial.
+ Alimenta tu Ghostfolio autoalojado con un proveedor de datos potente para acceder a más de 80.000 tickers de más de 50 bolsas a nivel mundial.
apps/client/src/app/components/admin-settings/admin-settings.component.html
16
@@ -8017,7 +8041,7 @@
Learn more
- Aprender más
+ Más información
apps/client/src/app/components/admin-settings/admin-settings.component.html
38
@@ -8068,7 +8092,7 @@
Mes actual
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
@@ -8076,7 +8100,7 @@
nuevo
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 67
+ 79
apps/client/src/app/pages/admin/admin-page.component.ts
@@ -8109,7 +8133,7 @@
Equity
- Acciones
+ Renta variable
apps/client/src/app/pages/i18n/i18n-page.html
41
@@ -8173,7 +8197,7 @@
Investment: Base Currency
- Inversión: Moneda base
+ Inversión: Divisa base
apps/client/src/app/pages/i18n/i18n-page.html
85
@@ -8181,7 +8205,7 @@
The major part of your current investment is not in your base currency (${baseCurrencyValueRatio}% in ${baseCurrency})
- La mayor parte de tu inversión actual no está en tu moneda base (${baseCurrencyValueRatio}% en ${baseCurrency})
+ La mayor parte de tu inversión actual no está en tu divisa base (${baseCurrencyValueRatio}% en ${baseCurrency})
apps/client/src/app/pages/i18n/i18n-page.html
88
@@ -8189,7 +8213,7 @@
The major part of your current investment is in your base currency (${baseCurrencyValueRatio}% in ${baseCurrency})
- La mayor parte de tu inversión actual está en tu moneda base (${baseCurrencyValueRatio}% en ${baseCurrency})
+ La mayor parte de tu inversión actual está en tu divisa base (${baseCurrencyValueRatio}% en ${baseCurrency})
apps/client/src/app/pages/i18n/i18n-page.html
92
@@ -8234,10 +8258,10 @@
Do you really want to generate a new security token?
- ¿Realmente deseas generar un nuevo token de seguridad?
+ ¿Seguro que quieres generar un nuevo token de seguridad?
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 175
+ 172
@@ -8250,7 +8274,7 @@
If you encounter a bug, would like to suggest an improvement or a new feature , please join the Ghostfolio Slack community, post to @ghostfolio_
- Si encuentras un error, deseas sugerir una mejora o una nueva característica , por favor únete a la comunidad Ghostfolio Slack , publica en @ghostfolio_
+ Si encuentras un error, deseas sugerir una mejora o una nueva funcionalidad , por favor únete a la comunidad de Ghostfolio en Slack y publica en @ghostfolio_
apps/client/src/app/pages/about/overview/about-overview-page.html
69
@@ -8261,7 +8285,7 @@
Acciones
apps/client/src/app/components/markets/markets.component.ts
- 52
+ 51
apps/client/src/app/pages/features/features-page.html
@@ -8273,7 +8297,7 @@
Criptomonedas
apps/client/src/app/components/markets/markets.component.ts
- 53
+ 52
apps/client/src/app/pages/features/features-page.html
@@ -8282,7 +8306,7 @@
-
+
apps/client/src/app/components/admin-users/admin-users.html
39
@@ -8293,7 +8317,7 @@
Gestionar perfil de activo
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 465
+ 471
@@ -8326,7 +8350,7 @@
Account Cluster Risks
- Riesgos de grupo de cuentas
+ Riesgos de agrupación de cuentas
apps/client/src/app/pages/i18n/i18n-page.html
14
@@ -8334,7 +8358,7 @@
Asset Class Cluster Risks
- Riesgos de grupo de clases de activos
+ Riesgos de agrupación de tipos de activos
apps/client/src/app/pages/i18n/i18n-page.html
39
@@ -8342,7 +8366,7 @@
Currency Cluster Risks
- Riesgos del clúster de divisas
+ Riesgos de agrupación de divisas
apps/client/src/app/pages/i18n/i18n-page.html
83
@@ -8350,7 +8374,7 @@
Economic Market Cluster Risks
- Riesgos del clúster de mercados económicos
+ Riesgos de agrupación de mercados económicos
apps/client/src/app/pages/i18n/i18n-page.html
106
@@ -8382,7 +8406,7 @@
Buying Power
- Poder de compra
+ Poder adquisitivo
apps/client/src/app/pages/i18n/i18n-page.html
71
@@ -8390,7 +8414,7 @@
Your buying power is below ${thresholdMin} ${baseCurrency}
- Tu poder de compra es inferior a ${thresholdMin} ${baseCurrency}
+ Tu poder adquisitivo está por debajo de ${thresholdMin} ${baseCurrency}
apps/client/src/app/pages/i18n/i18n-page.html
73
@@ -8398,7 +8422,7 @@
Your buying power is 0 ${baseCurrency}
- Tu poder de compra es 0 ${baseCurrency}
+ Tu poder adquisitivo es 0 ${baseCurrency}
apps/client/src/app/pages/i18n/i18n-page.html
77
@@ -8406,7 +8430,7 @@
Your buying power exceeds ${thresholdMin} ${baseCurrency}
- Tu poder de compra excede ${thresholdMin} ${baseCurrency}
+ Tu poder adquisitivo supera ${thresholdMin} ${baseCurrency}
apps/client/src/app/pages/i18n/i18n-page.html
80
@@ -8414,7 +8438,7 @@
Regional Market Cluster Risks
- Riesgos de los grupos de mercados regionales
+ Riesgos de agrupación de mercados regionales
apps/client/src/app/pages/i18n/i18n-page.html
163
@@ -8438,7 +8462,7 @@
The developed markets contribution of your current investment (${developedMarketsValueRatio}%) exceeds ${thresholdMax}%
- La contribución a los mercados desarrollados de tu inversión actual (${developedMarketsValueRatio}%) supera el ${thresholdMax}%
+ La contribución a mercados desarrollados de tu inversión actual (${developedMarketsValueRatio}%) supera ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
112
@@ -8446,7 +8470,7 @@
The developed markets contribution of your current investment (${developedMarketsValueRatio}%) is below ${thresholdMin}%
- La contribución a los mercados desarrollados de tu inversión actual (${developedMarketsValueRatio}%) es inferior al ${thresholdMin}%
+ La contribución a mercados desarrollados de tu inversión actual (${developedMarketsValueRatio}%) es inferior a ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
117
@@ -8454,7 +8478,7 @@
The developed markets contribution of your current investment (${developedMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- La contribución a los mercados desarrollados de tu inversión actual (${developedMarketsValueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}%
+ La contribución a mercados desarrollados de tu inversión actual (${developedMarketsValueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
122
@@ -8470,7 +8494,7 @@
The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) exceeds ${thresholdMax}%
- La contribución a los mercados emergentes de tu inversión actual (${emergingMarketsValueRatio}%) supera el ${thresholdMax}%
+ La contribución a mercados emergentes de tu inversión actual (${emergingMarketsValueRatio}%) supera ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
130
@@ -8478,7 +8502,7 @@
The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) is below ${thresholdMin}%
- La contribución a los mercados emergentes de tu inversión actual (${emergingMarketsValueRatio}%) es inferior al ${thresholdMin}%
+ La contribución a mercados emergentes de tu inversión actual (${emergingMarketsValueRatio}%) es inferior a ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
135
@@ -8486,7 +8510,7 @@
The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- La contribución a los mercados emergentes de tu inversión actual (${emergingMarketsValueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}%
+ La contribución a mercados emergentes de tu inversión actual (${emergingMarketsValueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
140
@@ -8502,7 +8526,7 @@
Your net worth is managed by 0 accounts
- Su patrimonio neto es administrado por 0 cuentas
+ Tu patrimonio neto es administrado por 0 cuentas
apps/client/src/app/pages/i18n/i18n-page.html
33
@@ -8518,7 +8542,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
- La contribución al mercado de Asia-Pacífico de tu inversión actual (${valueRatio}%) supera el ${thresholdMax}%
+ La contribución al mercado Asiático-Pacífico de tu inversión actual (${valueRatio}%) supera ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
167
@@ -8526,7 +8550,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
- La contribución al mercado de Asia-Pacífico de tu inversión actual (${valueRatio}%) es inferior al ${thresholdMin}%
+ La contribución al mercado Asiático-Pacífico de tu inversión actual (${valueRatio}%) es inferior a ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
171
@@ -8534,7 +8558,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- La contribución al mercado de Asia-Pacífico de tu inversión actual (${valueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}%
+ La contribución al mercado Asiático-Pacífico de tu inversión actual (${valueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
175
@@ -8550,7 +8574,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
- La contribución a los mercados emergentes de tu inversión actual (${valueRatio}%) supera el ${thresholdMax}%
+ La contribución a mercados emergentes de tu inversión actual (${valueRatio}%) supera ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
183
@@ -8558,7 +8582,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
- La contribución a los mercados emergentes de tu inversión actual (${valueRatio}%) es inferior al ${thresholdMin}%
+ La contribución a mercados emergentes de tu inversión actual (${valueRatio}%) es inferior a ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
187
@@ -8566,7 +8590,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- La contribución a los mercados emergentes de tu inversión actual (${valueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}%
+ La contribución a mercados emergentes de tu inversión actual (${valueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
191
@@ -8582,7 +8606,7 @@
The Europe market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
- La contribución al mercado europeo de tu inversión actual (${valueRatio}%) supera el ${thresholdMax}%
+ La contribución al mercado europeo de tu inversión actual (${valueRatio}%) supera ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
197
@@ -8590,7 +8614,7 @@
The Europe market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
- La contribución al mercado europeo de tu inversión actual (${valueRatio}%) es inferior al ${thresholdMin}%
+ La contribución al mercado europeo de tu inversión actual (${valueRatio}%) es inferior a ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
201
@@ -8614,7 +8638,7 @@
The Japan market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
- La contribución al mercado japonés de su inversión actual (${valueRatio}%) supera el ${thresholdMax}%
+ La contribución al mercado japonés de tu inversión actual (${valueRatio}%) supera el ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
211
@@ -8622,7 +8646,7 @@
The Japan market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
- La contribución al mercado japonés de su inversión actual (${valueRatio}%) es inferior a ${thresholdMin}%
+ La contribución al mercado japonés de tu inversión actual (${valueRatio}%) es inferior a ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
215
@@ -8630,7 +8654,7 @@
The Japan market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- La contribución al mercado japonés de su inversión actual (${valueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}%
+ La contribución al mercado japonés de tu inversión actual (${valueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
219
@@ -8646,7 +8670,7 @@
The North America market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
- La contribución del mercado de América del Norte de su inversión actual (${valueRatio}%) supera el ${thresholdMax}%
+ La contribución al mercado de América del Norte de tu inversión actual (${valueRatio}%) supera el ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
225
@@ -8654,7 +8678,7 @@
The North America market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
- La contribución al mercado de América del Norte de su inversión actual (${valueRatio}%) es inferior a ${thresholdMin}%
+ La contribución al mercado de América del Norte de tu inversión actual (${valueRatio}%) es inferior a ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
229
@@ -8662,7 +8686,7 @@
The North America market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- La contribución al mercado de América del Norte de su inversión actual (${valueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}%
+ La contribución al mercado de América del Norte de tu inversión actual (${valueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
233
@@ -8682,7 +8706,7 @@
Join the Ghostfolio Slack community
- Únete a la comunidad de Ghostfolio Slack
+ Únete a la comunidad de Ghostfolio en Slack
apps/client/src/app/pages/about/overview/about-overview-page.html
109
@@ -8690,7 +8714,7 @@
Follow Ghostfolio on X (formerly Twitter)
- Siga a Ghostfolio en X (anteriormente Twitter)
+ Sigue a Ghostfolio en X (anteriormente Twitter)
apps/client/src/app/pages/about/overview/about-overview-page.html
118
@@ -8718,7 +8742,7 @@
Follow Ghostfolio on LinkedIn
- Siga a Ghostfolio en LinkedIn
+ Sigue a Ghostfolio en LinkedIn
apps/client/src/app/pages/about/overview/about-overview-page.html
147
@@ -8726,7 +8750,7 @@
Ghostfolio is an independent & bootstrapped business
- Ghostfolio es una empresa independiente y autónoma
+ Ghostfolio es una empresa independiente y autofinanciada
apps/client/src/app/pages/about/overview/about-overview-page.html
157
@@ -8734,7 +8758,7 @@
Support Ghostfolio
- Soporte Ghostfolio
+ Apoya a Ghostfolio
apps/client/src/app/pages/about/overview/about-overview-page.html
166
diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf
index f343cb2ad..eec144e92 100644
--- a/apps/client/src/locales/messages.fr.xlf
+++ b/apps/client/src/locales/messages.fr.xlf
@@ -42,7 +42,7 @@
Type
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 48
+ 57
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -114,7 +114,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 309
+ 310
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -126,7 +126,7 @@
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 46
+ 58
apps/client/src/app/components/admin-tag/admin-tag.component.html
@@ -186,7 +186,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 316
+ 317
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -290,11 +290,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 74
+ 78
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 67
+ 71
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -322,11 +322,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 85
+ 89
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 78
+ 82
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -362,7 +362,7 @@
Source Données
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 82
+ 91
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -386,7 +386,7 @@
Tentatives
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 120
+ 129
@@ -394,7 +394,7 @@
Créé
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 134
+ 143
@@ -402,7 +402,7 @@
Terminé
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 143
+ 152
@@ -410,11 +410,11 @@
Statut
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 152
+ 161
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 92
+ 104
@@ -430,7 +430,7 @@
Supprimer Tâches
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 193
+ 202
@@ -438,7 +438,7 @@
Profils d’Actifs
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 106
+ 123
libs/ui/src/lib/assistant/assistant.html
@@ -450,11 +450,11 @@
Données historiques du marché
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 54
+ 63
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 448
+ 451
@@ -462,7 +462,7 @@
Voir Données
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 208
+ 217
@@ -470,7 +470,7 @@
Voir la Stacktrace
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 216
+ 225
@@ -478,7 +478,7 @@
Supprimer Tâche
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 224
+ 233
@@ -530,7 +530,7 @@
Filtrer par...
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 390
+ 383
@@ -650,7 +650,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 396
+ 399
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -670,7 +670,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 407
+ 410
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -682,7 +682,7 @@
Équivalence de Symboles
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 384
+ 387
@@ -690,7 +690,7 @@
Note
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 432
+ 435
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
@@ -706,7 +706,7 @@
Voulez-vous vraiment supprimer ce code promotionnel ?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 193
+ 196
@@ -714,7 +714,7 @@
Voulez-vous vraiment vider le cache ?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 230
+ 233
@@ -722,7 +722,7 @@
Veuillez définir votre message système :
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 250
+ 253
@@ -762,7 +762,7 @@
Étiquettes
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 201
+ 218
libs/ui/src/lib/tags-selector/tags-selector.component.html
@@ -846,7 +846,7 @@
Voulez-vous vraiment supprimer cet·te utilisateur·rice ?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 218
+ 215
@@ -898,11 +898,11 @@
Could not validate form
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 554
+ 570
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 557
+ 573
@@ -942,7 +942,7 @@
Référence
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 376
+ 379
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
@@ -978,7 +978,7 @@
apps/client/src/app/components/header/header.component.ts
- 297
+ 298
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
@@ -998,15 +998,15 @@
Oups! Jeton de Sécurité Incorrect.
apps/client/src/app/components/header/header.component.ts
- 312
+ 313
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 154
+ 152
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 193
+ 191
@@ -1014,7 +1014,7 @@
Gérer les Activités
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 64
@@ -1022,11 +1022,11 @@
Peur
apps/client/src/app/components/home-market/home-market.component.ts
- 42
+ 41
apps/client/src/app/components/markets/markets.component.ts
- 47
+ 46
libs/ui/src/lib/i18n.ts
@@ -1038,11 +1038,11 @@
Avidité
apps/client/src/app/components/home-market/home-market.component.ts
- 43
+ 42
apps/client/src/app/components/markets/markets.component.ts
- 48
+ 47
libs/ui/src/lib/i18n.ts
@@ -1294,7 +1294,7 @@
Signaler une Erreur de Données
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 450
+ 456
@@ -1314,7 +1314,7 @@
CDA
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1326,7 +1326,7 @@
1A
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1338,7 +1338,7 @@
5A
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1358,7 +1358,7 @@
Max
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 211
+ 217
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1386,7 +1386,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 195
+ 194
@@ -1398,7 +1398,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 193
+ 192
@@ -1414,7 +1414,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 196
+ 195
@@ -1474,7 +1474,7 @@
Auto
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 70
+ 69
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -1518,7 +1518,7 @@
Voulez-vous vraiment supprimer cette méthode de connexion ?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 282
+ 279
@@ -1586,7 +1586,7 @@
Paramètres régionaux
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 509
+ 512
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -1714,7 +1714,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 375
+ 381
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -1762,7 +1762,7 @@
Données du marché
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 397
+ 403
libs/common/src/lib/routes/routes.ts
@@ -1994,7 +1994,7 @@
Marchés
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 378
+ 381
apps/client/src/app/components/footer/footer.component.html
@@ -2066,7 +2066,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 342
+ 348
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2098,7 +2098,7 @@
Current week
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
@@ -2162,7 +2162,7 @@
Import des données...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 175
+ 174
@@ -2170,7 +2170,7 @@
L’import est terminé
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 185
+ 184
@@ -2186,7 +2186,7 @@
Validation des données...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 299
+ 293
@@ -2418,7 +2418,7 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 76
+ 75
libs/ui/src/lib/i18n.ts
@@ -2438,7 +2438,7 @@
Dépôt
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 385
+ 404
@@ -2446,7 +2446,7 @@
Mensuel
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 91
+ 90
@@ -2648,6 +2648,10 @@
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
88
+
+ libs/ui/src/lib/value/value.component.html
+ 18
+
Resources
@@ -2700,6 +2704,10 @@
Overview
Aperçu
+
+ apps/client/src/app/components/admin-jobs/admin-jobs.html
+ 7
+
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
114
@@ -2858,7 +2866,7 @@
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 395
+ 414
libs/ui/src/lib/i18n.ts
@@ -2870,7 +2878,7 @@
Épargne
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 405
+ 424
@@ -2934,7 +2942,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 326
+ 327
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -2966,7 +2974,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 342
+ 343
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -3006,7 +3014,7 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 449
+ 451
@@ -3014,7 +3022,7 @@
Symbole
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 68
+ 77
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -3030,7 +3038,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 315
+ 318
libs/ui/src/lib/i18n.ts
@@ -3242,11 +3250,11 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 451
+ 453
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 465
+ 467
libs/ui/src/lib/top-holdings/top-holdings.component.html
@@ -3278,7 +3286,7 @@
Annuel
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 92
+ 91
@@ -3286,7 +3294,7 @@
Importer Dividendes
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 137
+ 136
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -3302,7 +3310,7 @@
Valide jusqu’au
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 74
+ 86
libs/ui/src/lib/membership-card/membership-card.component.html
@@ -3346,7 +3354,7 @@
No Activities
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 146
+ 145
@@ -3622,11 +3630,11 @@
Could not save asset profile
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 588
+ 604
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 591
+ 607
@@ -3821,6 +3829,14 @@
306
+
+ Explore
+ Explore
+
+ apps/client/src/app/pages/resources/overview/resources-overview.component.html
+ 11
+
+
By
By
@@ -3842,7 +3858,7 @@
Current year
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
@@ -3858,11 +3874,11 @@
Lien
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 419
+ 422
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 550
+ 553
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -3878,7 +3894,7 @@
Asset profile has been saved
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 578
+ 594
@@ -3886,7 +3902,7 @@
Voulez-vous vraiment supprimer cette plateforme ?
apps/client/src/app/components/admin-platform/admin-platform.component.ts
- 106
+ 111
@@ -3894,7 +3910,7 @@
Platformes
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 195
+ 212
@@ -4238,7 +4254,7 @@
Configuration du Scraper
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 471
+ 474
@@ -4482,7 +4498,7 @@
ETF sans Pays
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 136
+ 135
@@ -4490,7 +4506,7 @@
ETF sans Secteurs
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 141
+ 140
@@ -4670,7 +4686,7 @@
Job ID
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 34
+ 43
@@ -4726,7 +4742,7 @@
Devises
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 131
+ 130
apps/client/src/app/pages/public/public-page.html
@@ -4778,11 +4794,11 @@
Could not parse scraper configuration
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 509
+ 525
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 512
+ 528
@@ -5476,7 +5492,7 @@
Confirmez la suppression de ce tag ?
apps/client/src/app/components/admin-tag/admin-tag.component.ts
- 103
+ 108
@@ -5576,7 +5592,7 @@
Profil d’Actif
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 52
+ 61
@@ -5708,7 +5724,7 @@
Confirmer la suppresion de ce message système?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 206
+ 209
@@ -5768,7 +5784,7 @@
Le prix actuel du marché est
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 706
+ 722
@@ -5776,7 +5792,7 @@
Test
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 568
+ 571
@@ -5864,11 +5880,11 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 81
+ 80
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 97
+ 96
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
@@ -5888,7 +5904,7 @@
Close Holding
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 441
+ 447
@@ -5936,7 +5952,7 @@
WTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
libs/ui/src/lib/assistant/assistant.component.ts
@@ -5956,7 +5972,7 @@
MTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6004,7 +6020,7 @@
année
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
@@ -6024,7 +6040,7 @@
années
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6044,7 +6060,7 @@
Collecter les données
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 587
+ 594
apps/client/src/app/components/admin-overview/admin-overview.html
@@ -6056,7 +6072,7 @@
Général
apps/client/src/app/pages/faq/faq-page.component.ts
- 49
+ 41
@@ -6064,7 +6080,7 @@
Cloud
apps/client/src/app/pages/faq/faq-page.component.ts
- 54
+ 46
libs/common/src/lib/routes/routes.ts
@@ -6076,7 +6092,7 @@
Self-Hosting
apps/client/src/app/pages/faq/faq-page.component.ts
- 60
+ 52
libs/common/src/lib/routes/routes.ts
@@ -6117,7 +6133,7 @@
Actif
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 64
+ 63
@@ -6125,7 +6141,7 @@
Clôturé
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 65
+ 64
@@ -6157,7 +6173,7 @@
Execute la tâche
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 220
+ 229
@@ -6165,7 +6181,7 @@
Priorité
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 96
+ 105
@@ -6221,7 +6237,7 @@
Confirmer la suppresion de votre compte Ghostfolio ?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 208
+ 205
@@ -6269,7 +6285,7 @@
Include in
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 374
+ 377
@@ -6277,7 +6293,7 @@
Oops! Une erreur s’est produite lors de la configuration de l’authentification biométrique.
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 336
+ 333
@@ -6293,7 +6309,7 @@
Benchmarks
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 126
+ 125
@@ -6673,7 +6689,7 @@
Erreur
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 697
+ 713
@@ -6725,7 +6741,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 592
+ 599
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6777,7 +6793,7 @@
Fermer
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 594
+ 601
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6849,7 +6865,7 @@
Résumé du portefeuille
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 56
+ 65
@@ -6916,6 +6932,14 @@
42
+
+ has been copied to the clipboard
+ has been copied to the clipboard
+
+ libs/ui/src/lib/value/value.component.ts
+ 180
+
+
From the beginning
Depuis le début
@@ -7081,7 +7105,7 @@
Définir clé API
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 171
+ 188
@@ -7187,7 +7211,7 @@
sur
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 135
+ 152
@@ -7195,7 +7219,7 @@
requêtes journalières
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 137
+ 154
@@ -7203,7 +7227,7 @@
Retirer la clé API
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 161
+ 178
@@ -7211,7 +7235,7 @@
Voulez-vous vraiment supprimer la clé API?
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 127
+ 133
@@ -7303,7 +7327,7 @@
Sauvegarder
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 603
+ 610
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -7355,7 +7379,7 @@
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 260
+ 257
@@ -7379,7 +7403,7 @@
Veuillez saisir votre clé API Ghostfolio.
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 146
+ 152
@@ -7395,7 +7419,7 @@
Le prompt IA a été copié dans le presse-papiers
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 201
+ 199
@@ -7411,7 +7435,7 @@
Paresseux
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7419,7 +7443,7 @@
Instantané
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7427,7 +7451,7 @@
Prix du marché par défaut
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 481
+ 484
@@ -7435,7 +7459,7 @@
Mode
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 518
+ 521
@@ -7443,7 +7467,7 @@
Selecteur
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 534
+ 537
@@ -7451,7 +7475,7 @@
En-têtes de requête HTTP
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 494
+ 497
@@ -7459,7 +7483,7 @@
fin de journée
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7467,7 +7491,7 @@
temps réel
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7475,7 +7499,7 @@
Ouvrir Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 202
+ 200
@@ -7495,7 +7519,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
@@ -7507,7 +7531,7 @@
apps/client/src/app/components/home-overview/home-overview.component.ts
- 55
+ 54
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -7515,11 +7539,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 388
+ 390
@@ -7623,11 +7647,11 @@
Jeton de sécurité
apps/client/src/app/components/admin-users/admin-users.component.ts
- 239
+ 235
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 170
+ 167
@@ -7635,7 +7659,7 @@
Voulez-vous vraiment générer un nouveau jeton de sécurité pour cet utilisateur ?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 244
+ 240
@@ -7708,7 +7732,7 @@
( ) est déjà utilisé.
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 633
+ 649
@@ -7716,7 +7740,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
- 641
+ 657
@@ -7780,7 +7804,7 @@
quelqu’un
apps/client/src/app/pages/public/public-page.component.ts
- 59
+ 61
@@ -7812,7 +7836,7 @@
Voulez-vous vraiment supprimer cet élément?
libs/ui/src/lib/benchmark/benchmark.component.ts
- 144
+ 139
@@ -7853,7 +7877,7 @@
Le compte utilisateur de démonstration a été synchronisé.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 274
+ 277
@@ -8067,7 +8091,7 @@
Current month
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
@@ -8075,7 +8099,7 @@
new
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 67
+ 79
apps/client/src/app/pages/admin/admin-page.component.ts
@@ -8236,7 +8260,7 @@
Voulez-vous vraiment générer un nouveau jeton de sécurité?
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 175
+ 172
@@ -8260,7 +8284,7 @@
Actions
apps/client/src/app/components/markets/markets.component.ts
- 52
+ 51
apps/client/src/app/pages/features/features-page.html
@@ -8272,7 +8296,7 @@
Crypto-monnaies
apps/client/src/app/components/markets/markets.component.ts
- 53
+ 52
apps/client/src/app/pages/features/features-page.html
@@ -8292,7 +8316,7 @@
Gérer le profil d’actif
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 465
+ 471
diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf
index 20bfd1b33..b143bbde3 100644
--- a/apps/client/src/locales/messages.it.xlf
+++ b/apps/client/src/locales/messages.it.xlf
@@ -51,7 +51,7 @@
Tipo
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 48
+ 57
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -107,7 +107,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 309
+ 310
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -119,7 +119,7 @@
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 46
+ 58
apps/client/src/app/components/admin-tag/admin-tag.component.html
@@ -235,11 +235,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 74
+ 78
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 67
+ 71
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -267,11 +267,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 85
+ 89
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 78
+ 82
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -307,7 +307,7 @@
Elimina i lavori
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 193
+ 202
@@ -315,7 +315,7 @@
Sorgente dei dati
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 82
+ 91
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -339,7 +339,7 @@
Tentativi
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 120
+ 129
@@ -347,7 +347,7 @@
Creato
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 134
+ 143
@@ -355,7 +355,7 @@
Finito
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 143
+ 152
@@ -363,11 +363,11 @@
Stato
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 152
+ 161
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 92
+ 104
@@ -383,7 +383,7 @@
Profilo dell’asset
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 106
+ 123
libs/ui/src/lib/assistant/assistant.html
@@ -395,11 +395,11 @@
Dati storici del mercato
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 54
+ 63
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 448
+ 451
@@ -407,7 +407,7 @@
Visualizza i dati
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 208
+ 217
@@ -415,7 +415,7 @@
Visualizza Stacktrace
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 216
+ 225
@@ -423,7 +423,7 @@
Elimina il lavoro
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 224
+ 233
@@ -515,7 +515,7 @@
Vuoi davvero eliminare questo buono?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 193
+ 196
@@ -523,7 +523,7 @@
Vuoi davvero svuotare la cache?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 230
+ 233
@@ -531,7 +531,7 @@
Imposta il messaggio di sistema:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 250
+ 253
@@ -635,7 +635,7 @@
Vuoi davvero eliminare questo utente?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 218
+ 215
@@ -743,7 +743,7 @@
apps/client/src/app/components/header/header.component.ts
- 297
+ 298
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
@@ -763,15 +763,15 @@
Ops! Token di sicurezza errato.
apps/client/src/app/components/header/header.component.ts
- 312
+ 313
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 154
+ 152
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 193
+ 191
@@ -779,7 +779,7 @@
Gestione delle attività
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 64
@@ -971,7 +971,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 396
+ 399
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -991,7 +991,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 407
+ 410
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -1003,7 +1003,7 @@
Tag
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 201
+ 218
libs/ui/src/lib/tags-selector/tags-selector.component.html
@@ -1019,7 +1019,7 @@
Segnala un’anomalia dei dati
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 450
+ 456
@@ -1067,7 +1067,7 @@
anno corrente
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1079,7 +1079,7 @@
1 anno
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1091,7 +1091,7 @@
5 anni
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1111,7 +1111,7 @@
Massimo
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 211
+ 217
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1131,7 +1131,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 196
+ 195
@@ -1223,7 +1223,7 @@
Vuoi davvero rimuovere questo metodo di accesso?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 282
+ 279
@@ -1283,7 +1283,7 @@
Locale
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 509
+ 512
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -1379,7 +1379,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 375
+ 381
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -1423,7 +1423,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 316
+ 317
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -1661,6 +1661,10 @@
Overview
Panoramica
+
+ apps/client/src/app/components/admin-jobs/admin-jobs.html
+ 7
+
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
114
@@ -1699,7 +1703,7 @@
Mercati
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 378
+ 381
apps/client/src/app/components/footer/footer.component.html
@@ -1919,7 +1923,7 @@
Current week
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
@@ -2003,7 +2007,7 @@
Nota
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 432
+ 435
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
@@ -2043,7 +2047,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 342
+ 348
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2067,7 +2071,7 @@
Importazione dei dati...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 175
+ 174
@@ -2075,7 +2079,7 @@
L’importazione è stata completata
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 185
+ 184
@@ -2193,6 +2197,10 @@
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
88
+
+ libs/ui/src/lib/value/value.component.html
+ 18
+
Resources
@@ -2379,7 +2387,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 193
+ 192
@@ -2395,7 +2403,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 195
+ 194
@@ -2515,7 +2523,7 @@
Risparmio
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 405
+ 424
@@ -2531,7 +2539,7 @@
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 395
+ 414
libs/ui/src/lib/i18n.ts
@@ -2551,7 +2559,7 @@
Deposito
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 385
+ 404
@@ -2559,7 +2567,7 @@
Mensile
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 91
+ 90
@@ -2583,11 +2591,11 @@
Paura
apps/client/src/app/components/home-market/home-market.component.ts
- 42
+ 41
apps/client/src/app/components/markets/markets.component.ts
- 47
+ 46
libs/ui/src/lib/i18n.ts
@@ -2599,11 +2607,11 @@
Avidità
apps/client/src/app/components/home-market/home-market.component.ts
- 43
+ 42
apps/client/src/app/components/markets/markets.component.ts
- 48
+ 47
libs/ui/src/lib/i18n.ts
@@ -2615,7 +2623,7 @@
Filtra per...
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 390
+ 383
@@ -2651,7 +2659,7 @@
Benchmark
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 376
+ 379
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
@@ -2663,11 +2671,11 @@
Could not validate form
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 554
+ 570
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 557
+ 573
@@ -2699,7 +2707,7 @@
Auto
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 70
+ 69
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -2787,7 +2795,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 326
+ 327
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -2811,7 +2819,7 @@
Simbolo
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 68
+ 77
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -2827,7 +2835,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 315
+ 318
libs/ui/src/lib/i18n.ts
@@ -2983,7 +2991,7 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 449
+ 451
@@ -3003,11 +3011,11 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 451
+ 453
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 465
+ 467
libs/ui/src/lib/top-holdings/top-holdings.component.html
@@ -3111,7 +3119,7 @@
Mappatura dei simboli
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 384
+ 387
@@ -3147,7 +3155,7 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 76
+ 75
libs/ui/src/lib/i18n.ts
@@ -3175,7 +3183,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 342
+ 343
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -3203,7 +3211,7 @@
Convalida dei dati...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 299
+ 293
@@ -3227,7 +3235,7 @@
Dati del mercato
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 397
+ 403
libs/common/src/lib/routes/routes.ts
@@ -3279,7 +3287,7 @@
Annuale
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 92
+ 91
@@ -3287,7 +3295,7 @@
Importa i dividendi
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 137
+ 136
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -3303,7 +3311,7 @@
Valido fino a
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 74
+ 86
libs/ui/src/lib/membership-card/membership-card.component.html
@@ -3347,7 +3355,7 @@
No Activities
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 146
+ 145
@@ -3623,11 +3631,11 @@
Could not save asset profile
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 588
+ 604
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 591
+ 607
@@ -3822,6 +3830,14 @@
306
+
+ Explore
+ Explore
+
+ apps/client/src/app/pages/resources/overview/resources-overview.component.html
+ 11
+
+
By
By
@@ -3843,7 +3859,7 @@
Current year
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
@@ -3859,11 +3875,11 @@
Url
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 419
+ 422
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 550
+ 553
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -3879,7 +3895,7 @@
Asset profile has been saved
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 578
+ 594
@@ -3887,7 +3903,7 @@
Vuoi davvero eliminare questa piattaforma?
apps/client/src/app/components/admin-platform/admin-platform.component.ts
- 106
+ 111
@@ -3895,7 +3911,7 @@
Piattaforme
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 195
+ 212
@@ -4239,7 +4255,7 @@
Configurazione dello scraper
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 471
+ 474
@@ -4483,7 +4499,7 @@
ETF senza paesi
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 136
+ 135
@@ -4491,7 +4507,7 @@
ETF senza settori
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 141
+ 140
@@ -4671,7 +4687,7 @@
Job ID
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 34
+ 43
@@ -4727,7 +4743,7 @@
Valute
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 131
+ 130
apps/client/src/app/pages/public/public-page.html
@@ -4779,11 +4795,11 @@
Could not parse scraper configuration
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 509
+ 525
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 512
+ 528
@@ -5477,7 +5493,7 @@
Sei sicuro di voler eliminare questo tag?
apps/client/src/app/components/admin-tag/admin-tag.component.ts
- 103
+ 108
@@ -5577,7 +5593,7 @@
Profilo dell’asset
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 52
+ 61
@@ -5709,7 +5725,7 @@
Confermi di voler cancellare questo messaggio di sistema?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 206
+ 209
@@ -5769,7 +5785,7 @@
L’attuale prezzo di mercato è
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 706
+ 722
@@ -5777,7 +5793,7 @@
Prova
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 568
+ 571
@@ -5865,11 +5881,11 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 81
+ 80
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 97
+ 96
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
@@ -5889,7 +5905,7 @@
Close Holding
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 441
+ 447
@@ -5937,7 +5953,7 @@
Settimana corrente
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
libs/ui/src/lib/assistant/assistant.component.ts
@@ -5957,7 +5973,7 @@
Mese corrente
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6005,7 +6021,7 @@
anno
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
@@ -6025,7 +6041,7 @@
anni
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6045,7 +6061,7 @@
Raccolta Dati
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 587
+ 594
apps/client/src/app/components/admin-overview/admin-overview.html
@@ -6057,7 +6073,7 @@
Generale
apps/client/src/app/pages/faq/faq-page.component.ts
- 49
+ 41
@@ -6065,7 +6081,7 @@
Cloud
apps/client/src/app/pages/faq/faq-page.component.ts
- 54
+ 46
libs/common/src/lib/routes/routes.ts
@@ -6077,7 +6093,7 @@
Self-Hosting
apps/client/src/app/pages/faq/faq-page.component.ts
- 60
+ 52
libs/common/src/lib/routes/routes.ts
@@ -6118,7 +6134,7 @@
Attivo
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 64
+ 63
@@ -6126,7 +6142,7 @@
Chiuso
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 65
+ 64
@@ -6158,7 +6174,7 @@
Esegui il lavoro
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 220
+ 229
@@ -6166,7 +6182,7 @@
Priorità
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 96
+ 105
@@ -6222,7 +6238,7 @@
Confermi di voler chiudere il tuo account Ghostfolio?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 208
+ 205
@@ -6270,7 +6286,7 @@
Include in
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 374
+ 377
@@ -6278,7 +6294,7 @@
Ops! C’è stato un errore impostando l’autenticazione biometrica.
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 336
+ 333
@@ -6294,7 +6310,7 @@
Benchmarks
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 126
+ 125
@@ -6674,7 +6690,7 @@
Errore
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 697
+ 713
@@ -6726,7 +6742,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 592
+ 599
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6778,7 +6794,7 @@
Chiudi
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 594
+ 601
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6850,7 +6866,7 @@
Stato del Portfolio
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 56
+ 65
@@ -6917,6 +6933,14 @@
42
+
+ has been copied to the clipboard
+ has been copied to the clipboard
+
+ libs/ui/src/lib/value/value.component.ts
+ 180
+
+
From the beginning
Dall’inizio
@@ -7082,7 +7106,7 @@
Imposta API Key
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 171
+ 188
@@ -7188,7 +7212,7 @@
di
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 135
+ 152
@@ -7196,7 +7220,7 @@
richieste giornaliere
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 137
+ 154
@@ -7204,7 +7228,7 @@
Rimuovi API key
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 161
+ 178
@@ -7212,7 +7236,7 @@
Vuoi davvero eliminare l’API key?
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 127
+ 133
@@ -7304,7 +7328,7 @@
Salva
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 603
+ 610
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -7356,7 +7380,7 @@
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 260
+ 257
@@ -7380,7 +7404,7 @@
Inserisci la tua API key di Ghostfolio.
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 146
+ 152
@@ -7396,7 +7420,7 @@
L’AI prompt è stato copiato negli appunti
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 201
+ 199
@@ -7412,7 +7436,7 @@
Pigro
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7420,7 +7444,7 @@
Istantaneo
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7428,7 +7452,7 @@
Prezzo di mercato predefinito
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 481
+ 484
@@ -7436,7 +7460,7 @@
Modalità
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 518
+ 521
@@ -7444,7 +7468,7 @@
Selettore
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 534
+ 537
@@ -7452,7 +7476,7 @@
Intestazioni della richiesta HTTP
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 494
+ 497
@@ -7460,7 +7484,7 @@
fine giornata
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7468,7 +7492,7 @@
in tempo reale
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7476,7 +7500,7 @@
Apri Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 202
+ 200
@@ -7496,7 +7520,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
@@ -7508,7 +7532,7 @@
apps/client/src/app/components/home-overview/home-overview.component.ts
- 55
+ 54
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -7516,11 +7540,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 388
+ 390
@@ -7624,11 +7648,11 @@
Token di sicurezza
apps/client/src/app/components/admin-users/admin-users.component.ts
- 239
+ 235
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 170
+ 167
@@ -7636,7 +7660,7 @@
Vuoi davvero generare un nuovo token di sicurezza per questo utente?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 244
+ 240
@@ -7709,7 +7733,7 @@
( ) e gia in uso.
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 633
+ 649
@@ -7717,7 +7741,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
- 641
+ 657
@@ -7781,7 +7805,7 @@
qualcuno
apps/client/src/app/pages/public/public-page.component.ts
- 59
+ 61
@@ -7813,7 +7837,7 @@
Vuoi davvero eliminare questo elemento?
libs/ui/src/lib/benchmark/benchmark.component.ts
- 144
+ 139
@@ -7854,7 +7878,7 @@
L’account utente demo è stato sincronizzato.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 274
+ 277
@@ -8068,7 +8092,7 @@
Current month
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
@@ -8076,7 +8100,7 @@
nuovo
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 67
+ 79
apps/client/src/app/pages/admin/admin-page.component.ts
@@ -8237,7 +8261,7 @@
Vuoi davvero generare un nuovo token di sicurezza?
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 175
+ 172
@@ -8261,7 +8285,7 @@
Azioni
apps/client/src/app/components/markets/markets.component.ts
- 52
+ 51
apps/client/src/app/pages/features/features-page.html
@@ -8273,7 +8297,7 @@
criptovalute
apps/client/src/app/components/markets/markets.component.ts
- 53
+ 52
apps/client/src/app/pages/features/features-page.html
@@ -8293,7 +8317,7 @@
Gestisci profilo risorsa
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 465
+ 471
diff --git a/apps/client/src/locales/messages.ko.xlf b/apps/client/src/locales/messages.ko.xlf
index 9b7c4192e..4f544e4aa 100644
--- a/apps/client/src/locales/messages.ko.xlf
+++ b/apps/client/src/locales/messages.ko.xlf
@@ -252,7 +252,7 @@
유형
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 48
+ 57
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -360,7 +360,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 309
+ 310
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -372,7 +372,7 @@
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 46
+ 58
apps/client/src/app/components/admin-tag/admin-tag.component.html
@@ -432,7 +432,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 316
+ 317
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -520,11 +520,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 74
+ 78
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 67
+ 71
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -552,11 +552,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 85
+ 89
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 78
+ 82
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -592,7 +592,7 @@
자산 프로필
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 52
+ 61
@@ -600,11 +600,11 @@
과거 시장 데이터
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 54
+ 63
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 448
+ 451
@@ -612,7 +612,7 @@
데이터 소스
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 82
+ 91
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -636,7 +636,7 @@
시도 횟수
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 120
+ 129
@@ -644,7 +644,7 @@
생성됨
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 134
+ 143
@@ -652,7 +652,7 @@
완료됨
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 143
+ 152
@@ -660,11 +660,11 @@
상태
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 152
+ 161
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 92
+ 104
@@ -680,7 +680,7 @@
작업 삭제
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 193
+ 202
@@ -688,7 +688,7 @@
데이터 보기
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 208
+ 217
@@ -696,7 +696,7 @@
스택트레이스 보기
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 216
+ 225
@@ -704,7 +704,7 @@
작업 삭제
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 224
+ 233
@@ -756,7 +756,7 @@
통화
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 131
+ 130
apps/client/src/app/pages/public/public-page.html
@@ -768,7 +768,7 @@
국가 정보 없는 ETF
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 136
+ 135
@@ -776,7 +776,7 @@
섹터 정보 없는 ETF
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 141
+ 140
@@ -792,7 +792,7 @@
다음 기준으로 필터...
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 390
+ 383
@@ -960,7 +960,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 396
+ 399
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -980,7 +980,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 407
+ 410
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -992,7 +992,7 @@
심볼 매핑
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 384
+ 387
@@ -1008,7 +1008,7 @@
스크래퍼 설정
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 471
+ 474
@@ -1016,7 +1016,7 @@
메모
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 432
+ 435
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
@@ -1076,7 +1076,7 @@
이 쿠폰을 정말 삭제하시겠습니까?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 193
+ 196
@@ -1084,7 +1084,7 @@
이 시스템 메시지를 정말 삭제하시겠습니까?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 206
+ 209
@@ -1092,7 +1092,7 @@
정말로 캐시를 플러시하시겠습니까?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 230
+ 233
@@ -1100,7 +1100,7 @@
시스템 메시지를 설정하십시오:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 250
+ 253
@@ -1224,11 +1224,11 @@
링크
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 419
+ 422
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 550
+ 553
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -1244,7 +1244,7 @@
Asset profile has been saved
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 578
+ 594
@@ -1252,7 +1252,15 @@
정말로 이 플랫폼을 삭제하시겠습니까?
apps/client/src/app/components/admin-platform/admin-platform.component.ts
- 106
+ 111
+
+
+
+ Explore
+ Explore
+
+ apps/client/src/app/pages/resources/overview/resources-overview.component.html
+ 11
@@ -1276,7 +1284,7 @@
올해
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
@@ -1292,7 +1300,7 @@
플랫폼
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 195
+ 212
@@ -1300,7 +1308,7 @@
태그
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 201
+ 218
libs/ui/src/lib/tags-selector/tags-selector.component.html
@@ -1324,7 +1332,7 @@
이 태그를 정말로 삭제하시겠습니까?
apps/client/src/app/components/admin-tag/admin-tag.component.ts
- 103
+ 108
@@ -1348,7 +1356,7 @@
이 사용자를 정말로 삭제하시겠습니까?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 218
+ 215
@@ -1416,11 +1424,11 @@
Could not validate form
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 554
+ 570
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 557
+ 573
@@ -1468,7 +1476,7 @@
기준
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 376
+ 379
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
@@ -1504,7 +1512,7 @@
apps/client/src/app/components/header/header.component.ts
- 297
+ 298
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
@@ -1524,15 +1532,15 @@
이런! 잘못된 보안 토큰.
apps/client/src/app/components/header/header.component.ts
- 312
+ 313
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 154
+ 152
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 193
+ 191
@@ -1540,7 +1548,7 @@
활동 관리
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 64
@@ -1548,11 +1556,11 @@
두려움
apps/client/src/app/components/home-market/home-market.component.ts
- 42
+ 41
apps/client/src/app/components/markets/markets.component.ts
- 47
+ 46
libs/ui/src/lib/i18n.ts
@@ -1564,11 +1572,11 @@
탐욕
apps/client/src/app/components/home-market/home-market.component.ts
- 43
+ 42
apps/client/src/app/components/markets/markets.component.ts
- 48
+ 47
libs/ui/src/lib/i18n.ts
@@ -1672,7 +1680,7 @@
이번주
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
@@ -1952,7 +1960,7 @@
데이터 결함 보고
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 450
+ 456
@@ -2140,7 +2148,7 @@
연초 대비
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2152,7 +2160,7 @@
1년
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2164,7 +2172,7 @@
5년
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2184,7 +2192,7 @@
맥스
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 211
+ 217
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2288,7 +2296,7 @@
자동
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 70
+ 69
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -2300,7 +2308,7 @@
이 로그인 방법을 정말로 제거하시겠습니까?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 282
+ 279
@@ -2340,7 +2348,7 @@
장소
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 509
+ 512
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -2484,7 +2492,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 195
+ 194
@@ -2496,7 +2504,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 193
+ 192
@@ -2512,7 +2520,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 196
+ 195
@@ -2640,7 +2648,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 375
+ 381
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2736,7 +2744,7 @@
시장 데이터
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 397
+ 403
libs/common/src/lib/routes/routes.ts
@@ -2770,6 +2778,10 @@
Overview
개요
+
+ apps/client/src/app/components/admin-jobs/admin-jobs.html
+ 7
+
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
114
@@ -2916,11 +2928,11 @@
Could not parse scraper configuration
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 509
+ 525
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 512
+ 528
@@ -3160,7 +3172,7 @@
시장
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 378
+ 381
apps/client/src/app/components/footer/footer.component.html
@@ -3616,7 +3628,7 @@
작업 ID
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 34
+ 43
@@ -3672,7 +3684,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 342
+ 348
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -3800,7 +3812,7 @@
배당금 가져오기
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 137
+ 136
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -3816,7 +3828,7 @@
데이터 가져오는 중...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 175
+ 174
@@ -3824,7 +3836,7 @@
가져오기가 완료되었습니다.
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 185
+ 184
@@ -3840,7 +3852,7 @@
데이터 유효성을 검사하는 중...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 299
+ 293
@@ -4140,7 +4152,7 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 76
+ 75
libs/ui/src/lib/i18n.ts
@@ -4160,7 +4172,7 @@
보증금
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 385
+ 404
@@ -4168,7 +4180,7 @@
월간
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 91
+ 90
@@ -4176,7 +4188,7 @@
매년
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 92
+ 91
@@ -4456,11 +4468,11 @@
Could not save asset profile
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 588
+ 604
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 591
+ 607
@@ -4530,6 +4542,10 @@
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
88
+
+ libs/ui/src/lib/value/value.component.html
+ 18
+
Personal Finance Tools
@@ -5005,7 +5021,7 @@
자산 프로필
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 106
+ 123
libs/ui/src/lib/assistant/assistant.html
@@ -5121,7 +5137,7 @@
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 395
+ 414
libs/ui/src/lib/i18n.ts
@@ -5133,7 +5149,7 @@
저금
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 405
+ 424
@@ -5205,7 +5221,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 326
+ 327
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -5237,7 +5253,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 342
+ 343
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -5365,7 +5381,7 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 449
+ 451
@@ -5381,7 +5397,7 @@
No Activities
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 146
+ 145
@@ -5413,7 +5429,7 @@
상징
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 68
+ 77
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -5429,7 +5445,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 315
+ 318
libs/ui/src/lib/i18n.ts
@@ -5737,7 +5753,7 @@
유효기간
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 74
+ 86
libs/ui/src/lib/membership-card/membership-card.component.html
@@ -5769,11 +5785,11 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 451
+ 453
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 465
+ 467
libs/ui/src/lib/top-holdings/top-holdings.component.html
@@ -5801,7 +5817,7 @@
현재 시장가격은
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 706
+ 722
@@ -5809,7 +5825,7 @@
시험
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 568
+ 571
@@ -5889,7 +5905,7 @@
닫기 보유
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 441
+ 447
@@ -5913,11 +5929,11 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 81
+ 80
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 97
+ 96
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
@@ -5977,7 +5993,7 @@
MTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
libs/ui/src/lib/assistant/assistant.component.ts
@@ -5989,7 +6005,7 @@
WTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6029,7 +6045,7 @@
년도
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
@@ -6049,7 +6065,7 @@
연령
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6082,7 +6098,7 @@
셀프 호스팅
apps/client/src/app/pages/faq/faq-page.component.ts
- 60
+ 52
libs/common/src/lib/routes/routes.ts
@@ -6094,7 +6110,7 @@
데이터 수집
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 587
+ 594
apps/client/src/app/components/admin-overview/admin-overview.html
@@ -6106,7 +6122,7 @@
일반적인
apps/client/src/app/pages/faq/faq-page.component.ts
- 49
+ 41
@@ -6114,7 +6130,7 @@
구름
apps/client/src/app/pages/faq/faq-page.component.ts
- 54
+ 46
libs/common/src/lib/routes/routes.ts
@@ -6142,7 +6158,7 @@
닫은
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 65
+ 64
@@ -6150,7 +6166,7 @@
활동적인
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 64
+ 63
@@ -6182,7 +6198,7 @@
작업 실행
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 220
+ 229
@@ -6198,7 +6214,7 @@
우선 사항
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 96
+ 105
@@ -6254,7 +6270,7 @@
정말로 Ghostfolio 계정을 폐쇄하시겠습니까?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 208
+ 205
@@ -6294,7 +6310,7 @@
포함
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 374
+ 377
@@ -6302,7 +6318,7 @@
이런! 생체 인증을 설정하는 중에 오류가 발생했습니다.
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 336
+ 333
@@ -6342,7 +6358,7 @@
벤치마크
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 126
+ 125
@@ -6698,7 +6714,7 @@
오류
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 697
+ 713
@@ -6710,7 +6726,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 592
+ 599
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6794,7 +6810,7 @@
닫다
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 594
+ 601
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6890,7 +6906,7 @@
포트폴리오 스냅샷
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 56
+ 65
@@ -6949,6 +6965,14 @@
42
+
+ has been copied to the clipboard
+ has been copied to the clipboard
+
+ libs/ui/src/lib/value/value.component.ts
+ 180
+
+
offers a free plan
은(는) 무료 요금제를 제공합니다
@@ -7106,7 +7130,7 @@
API 키 설정
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 171
+ 188
@@ -7220,7 +7244,7 @@
~의
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 135
+ 152
@@ -7228,7 +7252,7 @@
API 키를 정말로 삭제하시겠습니까?
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 127
+ 133
@@ -7236,7 +7260,7 @@
API 키 제거
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 161
+ 178
@@ -7244,7 +7268,7 @@
일일 요청
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 137
+ 154
@@ -7328,7 +7352,7 @@
구하다
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 603
+ 610
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -7396,7 +7420,7 @@
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 260
+ 257
@@ -7404,7 +7428,7 @@
Ghostfolio API 키를 입력하세요.
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 146
+ 152
@@ -7420,7 +7444,7 @@
AI 프롬프트가 클립보드에 복사되었습니다.
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 201
+ 199
@@ -7436,7 +7460,7 @@
방법
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 518
+ 521
@@ -7444,7 +7468,7 @@
기본 시장 가격
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 481
+ 484
@@ -7452,7 +7476,7 @@
선택자
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 534
+ 537
@@ -7460,7 +7484,7 @@
즉각적인
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7468,7 +7492,7 @@
게으른
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7476,7 +7500,7 @@
HTTP 요청 헤더
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 494
+ 497
@@ -7484,7 +7508,7 @@
실시간
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7492,7 +7516,7 @@
하루의 끝
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7500,7 +7524,7 @@
오픈 Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 202
+ 200
@@ -7520,7 +7544,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
@@ -7532,7 +7556,7 @@
apps/client/src/app/components/home-overview/home-overview.component.ts
- 55
+ 54
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -7540,11 +7564,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 388
+ 390
@@ -7648,7 +7672,7 @@
정말로 이 사용자에 대한 새 보안 토큰을 생성하시겠습니까?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 244
+ 240
@@ -7664,11 +7688,11 @@
보안 토큰
apps/client/src/app/components/admin-users/admin-users.component.ts
- 239
+ 235
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 170
+ 167
@@ -7733,7 +7757,7 @@
( )은(는) 이미 사용 중입니다.
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 633
+ 649
@@ -7741,7 +7765,7 @@
( )로 업데이트하는 동안 오류가 발생했습니다.
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 641
+ 657
@@ -7781,7 +7805,7 @@
누구
apps/client/src/app/pages/public/public-page.component.ts
- 59
+ 61
@@ -7813,7 +7837,7 @@
이 항목을 정말로 삭제하시겠습니까?
libs/ui/src/lib/benchmark/benchmark.component.ts
- 144
+ 139
@@ -7862,7 +7886,7 @@
데모 사용자 계정이 동기화되었습니다.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 274
+ 277
@@ -8068,7 +8092,7 @@
이번 달
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
@@ -8076,7 +8100,7 @@
새로운
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 67
+ 79
apps/client/src/app/pages/admin/admin-page.component.ts
@@ -8253,7 +8277,7 @@
정말로 새로운 보안 토큰을 생성하시겠습니까?
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 175
+ 172
@@ -8261,7 +8285,7 @@
암호화폐
apps/client/src/app/components/markets/markets.component.ts
- 53
+ 52
apps/client/src/app/pages/features/features-page.html
@@ -8273,7 +8297,7 @@
주식
apps/client/src/app/components/markets/markets.component.ts
- 52
+ 51
apps/client/src/app/pages/features/features-page.html
@@ -8293,7 +8317,7 @@
자산 프로필 관리
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 465
+ 471
diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf
index 158ff4fb1..039969da0 100644
--- a/apps/client/src/locales/messages.nl.xlf
+++ b/apps/client/src/locales/messages.nl.xlf
@@ -50,7 +50,7 @@
Type
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 48
+ 57
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -106,7 +106,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 309
+ 310
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -118,7 +118,7 @@
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 46
+ 58
apps/client/src/app/components/admin-tag/admin-tag.component.html
@@ -234,11 +234,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 74
+ 78
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 67
+ 71
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -266,11 +266,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 85
+ 89
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 78
+ 82
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -306,7 +306,7 @@
Taken verwijderen
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 193
+ 202
@@ -314,7 +314,7 @@
Gegevensbron
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 82
+ 91
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -338,7 +338,7 @@
Pogingen
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 120
+ 129
@@ -346,7 +346,7 @@
Aangemaakt
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 134
+ 143
@@ -354,7 +354,7 @@
Voltooid
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 143
+ 152
@@ -362,11 +362,11 @@
Status
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 152
+ 161
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 92
+ 104
@@ -382,7 +382,7 @@
Activa Profiel
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 106
+ 123
libs/ui/src/lib/assistant/assistant.html
@@ -394,11 +394,11 @@
Historische marktgegevens
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 54
+ 63
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 448
+ 451
@@ -406,7 +406,7 @@
Bekijk gegevens
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 208
+ 217
@@ -414,7 +414,7 @@
Bekijk Stacktrace
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 216
+ 225
@@ -422,7 +422,7 @@
Taak verwijderen
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 224
+ 233
@@ -514,7 +514,7 @@
Wil je deze coupon echt verwijderen?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 193
+ 196
@@ -522,7 +522,7 @@
Wil je echt de cache legen?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 230
+ 233
@@ -530,7 +530,7 @@
Stel je systeemboodschap in:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 250
+ 253
@@ -634,7 +634,7 @@
Wilt je deze gebruiker echt verwijderen?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 218
+ 215
@@ -742,7 +742,7 @@
apps/client/src/app/components/header/header.component.ts
- 297
+ 298
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
@@ -762,15 +762,15 @@
Oeps! Onjuiste beveiligingstoken.
apps/client/src/app/components/header/header.component.ts
- 312
+ 313
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 154
+ 152
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 193
+ 191
@@ -778,7 +778,7 @@
Activiteiten beheren
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 64
@@ -970,7 +970,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 396
+ 399
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -990,7 +990,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 407
+ 410
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -1002,7 +1002,7 @@
Tags
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 201
+ 218
libs/ui/src/lib/tags-selector/tags-selector.component.html
@@ -1018,7 +1018,7 @@
Gegevensstoring melden
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 450
+ 456
@@ -1066,7 +1066,7 @@
YTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1078,7 +1078,7 @@
1J
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1090,7 +1090,7 @@
5J
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1110,7 +1110,7 @@
Max
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 211
+ 217
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1130,7 +1130,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 196
+ 195
@@ -1222,7 +1222,7 @@
Wil je deze aanmeldingsmethode echt verwijderen?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 282
+ 279
@@ -1282,7 +1282,7 @@
Locatie
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 509
+ 512
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -1378,7 +1378,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 375
+ 381
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -1422,7 +1422,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 316
+ 317
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -1660,6 +1660,10 @@
Overview
Overzicht
+
+ apps/client/src/app/components/admin-jobs/admin-jobs.html
+ 7
+
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
114
@@ -1698,7 +1702,7 @@
Markten
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 378
+ 381
apps/client/src/app/components/footer/footer.component.html
@@ -1918,7 +1922,7 @@
Huidige week
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
@@ -2002,7 +2006,7 @@
Opmerking
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 432
+ 435
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
@@ -2042,7 +2046,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 342
+ 348
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2066,7 +2070,7 @@
Gegevens importeren...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 175
+ 174
@@ -2074,7 +2078,7 @@
Importeren is voltooid
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 185
+ 184
@@ -2192,6 +2196,10 @@
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
88
+
+ libs/ui/src/lib/value/value.component.html
+ 18
+
Resources
@@ -2378,7 +2386,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 193
+ 192
@@ -2394,7 +2402,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 195
+ 194
@@ -2514,7 +2522,7 @@
Besparingen
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 405
+ 424
@@ -2530,7 +2538,7 @@
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 395
+ 414
libs/ui/src/lib/i18n.ts
@@ -2550,7 +2558,7 @@
Storting
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 385
+ 404
@@ -2558,7 +2566,7 @@
Maandelijks
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 91
+ 90
@@ -2582,11 +2590,11 @@
Angst
apps/client/src/app/components/home-market/home-market.component.ts
- 42
+ 41
apps/client/src/app/components/markets/markets.component.ts
- 47
+ 46
libs/ui/src/lib/i18n.ts
@@ -2598,11 +2606,11 @@
Hebzucht
apps/client/src/app/components/home-market/home-market.component.ts
- 43
+ 42
apps/client/src/app/components/markets/markets.component.ts
- 48
+ 47
libs/ui/src/lib/i18n.ts
@@ -2614,7 +2622,7 @@
Filter op...
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 390
+ 383
@@ -2650,7 +2658,7 @@
Benchmark
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 376
+ 379
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
@@ -2662,11 +2670,11 @@
Het formulier kon niet worden gevalideerd.
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 554
+ 570
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 557
+ 573
@@ -2698,7 +2706,7 @@
Automatisch
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 70
+ 69
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -2786,7 +2794,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 326
+ 327
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -2810,7 +2818,7 @@
Symbool
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 68
+ 77
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -2826,7 +2834,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 315
+ 318
libs/ui/src/lib/i18n.ts
@@ -2982,7 +2990,7 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 449
+ 451
@@ -3002,11 +3010,11 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 451
+ 453
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 465
+ 467
libs/ui/src/lib/top-holdings/top-holdings.component.html
@@ -3110,7 +3118,7 @@
Symbool toewijzen
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 384
+ 387
@@ -3146,7 +3154,7 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 76
+ 75
libs/ui/src/lib/i18n.ts
@@ -3174,7 +3182,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 342
+ 343
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -3202,7 +3210,7 @@
Gegevens valideren...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 299
+ 293
@@ -3226,7 +3234,7 @@
Marktgegevens
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 397
+ 403
libs/common/src/lib/routes/routes.ts
@@ -3278,7 +3286,7 @@
Jaarlijks
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 92
+ 91
@@ -3286,7 +3294,7 @@
Importeer dividenden
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 137
+ 136
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -3302,7 +3310,7 @@
Geldig tot
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 74
+ 86
libs/ui/src/lib/membership-card/membership-card.component.html
@@ -3346,7 +3354,7 @@
Geen activiteiten
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 146
+ 145
@@ -3622,11 +3630,11 @@
Kon het assetprofiel niet opslaan
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 588
+ 604
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 591
+ 607
@@ -3821,9 +3829,17 @@
306
+
+ Explore
+ Explore
+
+ apps/client/src/app/pages/resources/overview/resources-overview.component.html
+ 11
+
+
By
- Door
+ Tegen
apps/client/src/app/pages/portfolio/fire/fire-page.html
139
@@ -3842,7 +3858,7 @@
Huidig jaar
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
@@ -3858,11 +3874,11 @@
Url
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 419
+ 422
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 550
+ 553
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -3878,7 +3894,7 @@
Het activaprofiel is opgeslagen.
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 578
+ 594
@@ -3886,7 +3902,7 @@
Wil je dit platform echt verwijderen?
apps/client/src/app/components/admin-platform/admin-platform.component.ts
- 106
+ 111
@@ -3894,7 +3910,7 @@
Platforms
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 195
+ 212
@@ -4238,7 +4254,7 @@
Scraper instellingen
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 471
+ 474
@@ -4482,7 +4498,7 @@
ETF’s zonder Landen
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 136
+ 135
@@ -4490,7 +4506,7 @@
ETF’s zonder Sectoren
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 141
+ 140
@@ -4670,7 +4686,7 @@
Opdracht ID
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 34
+ 43
@@ -4726,7 +4742,7 @@
Valuta
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 131
+ 130
apps/client/src/app/pages/public/public-page.html
@@ -4778,11 +4794,11 @@
De scraperconfiguratie kon niet worden geparseerd
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 509
+ 525
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 512
+ 528
@@ -5476,7 +5492,7 @@
Weet u zetker dat u dit label wilt verwijderen?
apps/client/src/app/components/admin-tag/admin-tag.component.ts
- 103
+ 108
@@ -5576,7 +5592,7 @@
Bezittingen Profiel
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 52
+ 61
@@ -5708,7 +5724,7 @@
Wilt u dit systeembericht echt verwijderen?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 206
+ 209
@@ -5768,7 +5784,7 @@
De huidige markt waarde is
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 706
+ 722
@@ -5776,7 +5792,7 @@
Test
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 568
+ 571
@@ -5821,7 +5837,7 @@
Argentina
- Argentinië
+ Argentinië
libs/ui/src/lib/i18n.ts
78
@@ -5864,11 +5880,11 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 81
+ 80
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 97
+ 96
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
@@ -5888,7 +5904,7 @@
Sluit Holding
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 441
+ 447
@@ -5936,7 +5952,7 @@
Week tot nu toe
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
libs/ui/src/lib/assistant/assistant.component.ts
@@ -5956,7 +5972,7 @@
MTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6004,7 +6020,7 @@
jaar
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
@@ -6024,7 +6040,7 @@
jaren
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6044,7 +6060,7 @@
Data Verzamelen
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 587
+ 594
apps/client/src/app/components/admin-overview/admin-overview.html
@@ -6056,7 +6072,7 @@
Algemeen
apps/client/src/app/pages/faq/faq-page.component.ts
- 49
+ 41
@@ -6064,7 +6080,7 @@
Cloud
apps/client/src/app/pages/faq/faq-page.component.ts
- 54
+ 46
libs/common/src/lib/routes/routes.ts
@@ -6076,7 +6092,7 @@
Zelf Hosten
apps/client/src/app/pages/faq/faq-page.component.ts
- 60
+ 52
libs/common/src/lib/routes/routes.ts
@@ -6117,7 +6133,7 @@
Actief
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 64
+ 63
@@ -6125,7 +6141,7 @@
Gesloten
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 65
+ 64
@@ -6157,7 +6173,7 @@
Opdracht Uitvoeren
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 220
+ 229
@@ -6165,7 +6181,7 @@
Prioriteit
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 96
+ 105
@@ -6221,7 +6237,7 @@
Wilt u uw Ghostfolio account echt sluiten?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 208
+ 205
@@ -6269,7 +6285,7 @@
Opnemen in
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 374
+ 377
@@ -6277,7 +6293,7 @@
Oeps! Er is een fout opgetreden met het instellen van de biometrische authenticatie.
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 336
+ 333
@@ -6293,7 +6309,7 @@
Benchmarks
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 126
+ 125
@@ -6673,7 +6689,7 @@
Fout
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 697
+ 713
@@ -6702,7 +6718,7 @@
, based on your total assets of
- opnemen, dit is gebaseerd op uw totale vermogen van
+ opnemen, dit is gebaseerd op uw totale vermogen van
apps/client/src/app/pages/portfolio/fire/fire-page.html
96
@@ -6725,7 +6741,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 592
+ 599
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6777,7 +6793,7 @@
Sluiten
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 594
+ 601
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6849,7 +6865,7 @@
Portfolio Momentopname
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 56
+ 65
@@ -6916,6 +6932,14 @@
42
+
+ has been copied to the clipboard
+ has been copied to the clipboard
+
+ libs/ui/src/lib/value/value.component.ts
+ 180
+
+
From the beginning
Vanaf het begin
@@ -7054,7 +7078,7 @@
Ghostfolio is a lightweight wealth management application for individuals to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions.
- Ghostfolio is een gebruiksvriendelijke applicatie voor vermogensbeheer waarmee particulieren hun aandelen, ETF's of cryptovaluta kunnen volgen en weloverwogen, datagestuurde beleggingsbeslissingen kunnen nemen.
+ Ghostfolio is een gebruiksvriendelijke applicatie voor vermogensbeheer waarmee particulieren hun aandelen, ETF's of cryptovaluta kunnen volgen en weloverwogen, datagestuurde beleggingsbeslissingen kunnen nemen.
apps/client/src/app/pages/about/overview/about-overview-page.html
10
@@ -7081,7 +7105,7 @@
API-sleutel instellen
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 171
+ 188
@@ -7187,7 +7211,7 @@
van
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 135
+ 152
@@ -7195,7 +7219,7 @@
dagelijkse verzoeken
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 137
+ 154
@@ -7203,7 +7227,7 @@
Verwijder API-sleutel
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 161
+ 178
@@ -7211,7 +7235,7 @@
Wilt u de API-sleutel echt verwijderen?
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 127
+ 133
@@ -7303,7 +7327,7 @@
Opslaan
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 603
+ 610
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -7355,7 +7379,7 @@
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 260
+ 257
@@ -7379,7 +7403,7 @@
Voer uw Ghostfolio API-sleutel in.
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 146
+ 152
@@ -7395,7 +7419,7 @@
AI-prompt is naar het klembord gekopieerd
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 201
+ 199
@@ -7411,7 +7435,7 @@
Lui
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7419,7 +7443,7 @@
Direct
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7427,7 +7451,7 @@
Standaard Marktprijs
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 481
+ 484
@@ -7435,7 +7459,7 @@
Modus
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 518
+ 521
@@ -7443,7 +7467,7 @@
Kiezer
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 534
+ 537
@@ -7451,7 +7475,7 @@
HTTP Verzoek Headers
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 494
+ 497
@@ -7459,7 +7483,7 @@
eind van de dag
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7467,7 +7491,7 @@
real-time
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7475,7 +7499,7 @@
Open Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 202
+ 200
@@ -7495,7 +7519,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
@@ -7507,7 +7531,7 @@
apps/client/src/app/components/home-overview/home-overview.component.ts
- 55
+ 54
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -7515,11 +7539,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 388
+ 390
@@ -7623,11 +7647,11 @@
Beveiligingstoken
apps/client/src/app/components/admin-users/admin-users.component.ts
- 239
+ 235
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 170
+ 167
@@ -7635,7 +7659,7 @@
Wilt u echt een nieuw beveiligingstoken voor deze gebruiker aanmaken?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 244
+ 240
@@ -7708,7 +7732,7 @@
( ) is al in gebruik.
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 633
+ 649
@@ -7716,7 +7740,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
- 641
+ 657
@@ -7780,7 +7804,7 @@
iemand
apps/client/src/app/pages/public/public-page.component.ts
- 59
+ 61
@@ -7812,7 +7836,7 @@
Wilt u dit item echt verwijderen?
libs/ui/src/lib/benchmark/benchmark.component.ts
- 144
+ 139
@@ -7853,7 +7877,7 @@
Demo-gebruikersaccount is gesynchroniseerd.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 274
+ 277
@@ -8067,7 +8091,7 @@
Huidige maand
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
@@ -8075,7 +8099,7 @@
nieuw
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 67
+ 79
apps/client/src/app/pages/admin/admin-page.component.ts
@@ -8236,7 +8260,7 @@
Wilt u echt een nieuwe securitytoken genereren?
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 175
+ 172
@@ -8260,7 +8284,7 @@
Aandelen
apps/client/src/app/components/markets/markets.component.ts
- 52
+ 51
apps/client/src/app/pages/features/features-page.html
@@ -8272,7 +8296,7 @@
Cryptovaluta
apps/client/src/app/components/markets/markets.component.ts
- 53
+ 52
apps/client/src/app/pages/features/features-page.html
@@ -8292,7 +8316,7 @@
Beheer activaprofiel
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 465
+ 471
diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf
index bc8b948cd..a15609e6a 100644
--- a/apps/client/src/locales/messages.pl.xlf
+++ b/apps/client/src/locales/messages.pl.xlf
@@ -240,7 +240,7 @@
please
- please
+ proszę
apps/client/src/app/pages/pricing/pricing-page.html
333
@@ -251,7 +251,7 @@
Typ
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 48
+ 57
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -284,7 +284,7 @@
with
- with
+ z
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
87
@@ -351,7 +351,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 309
+ 310
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -363,7 +363,7 @@
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 46
+ 58
apps/client/src/app/components/admin-tag/admin-tag.component.html
@@ -423,7 +423,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 316
+ 317
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -511,11 +511,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 74
+ 78
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 67
+ 71
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -543,11 +543,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 85
+ 89
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 78
+ 82
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -583,7 +583,7 @@
Profil Aktywów
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 52
+ 61
@@ -591,11 +591,11 @@
Historyczne Dane Rynkowe
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 54
+ 63
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 448
+ 451
@@ -603,7 +603,7 @@
Źródło Danych
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 82
+ 91
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -627,7 +627,7 @@
Próby
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 120
+ 129
@@ -635,7 +635,7 @@
Utworzono
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 134
+ 143
@@ -643,7 +643,7 @@
Zakończono
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 143
+ 152
@@ -651,16 +651,16 @@
Status
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 152
+ 161
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 92
+ 104
and is driven by the efforts of its contributors
- and is driven by the efforts of its contributors
+ i jest rozwijany dzięki pracy jego współtwórców
apps/client/src/app/pages/about/overview/about-overview-page.html
49
@@ -671,7 +671,7 @@
Usuń Zadania
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 193
+ 202
@@ -679,7 +679,7 @@
Zobacz Dane
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 208
+ 217
@@ -687,7 +687,7 @@
Wyświetl Stos Wywołań
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 216
+ 225
@@ -695,7 +695,7 @@
Usuń Zadanie
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 224
+ 233
@@ -747,7 +747,7 @@
Waluty
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 131
+ 130
apps/client/src/app/pages/public/public-page.html
@@ -759,7 +759,7 @@
ETF-y bez Krajów
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 136
+ 135
@@ -767,7 +767,7 @@
ETF-y bez Sektorów
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 141
+ 140
@@ -783,7 +783,7 @@
Filtruj według...
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 390
+ 383
@@ -927,7 +927,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 396
+ 399
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -947,7 +947,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 407
+ 410
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -959,7 +959,7 @@
Mapowanie Symboli
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 384
+ 387
@@ -975,7 +975,7 @@
Konfiguracja Scrapera
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 471
+ 474
@@ -983,7 +983,7 @@
Notatka
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 432
+ 435
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
@@ -1043,7 +1043,7 @@
Czy naprawdę chcesz usunąć ten kupon?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 193
+ 196
@@ -1051,7 +1051,7 @@
Czy naprawdę chcesz usunąć tę wiadomość systemową?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 206
+ 209
@@ -1059,7 +1059,7 @@
Czy naprawdę chcesz wyczyścić pamięć podręczną?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 230
+ 233
@@ -1067,7 +1067,7 @@
Proszę ustawić swoją wiadomość systemową:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 250
+ 253
@@ -1191,11 +1191,11 @@
Url
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 419
+ 422
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 550
+ 553
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -1208,10 +1208,10 @@
Asset profile has been saved
- Asset profile has been saved
+ Profil zasobu został zapisany
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 578
+ 594
@@ -1219,12 +1219,20 @@
Czy naprawdę chcesz usunąć tę platformę?
apps/client/src/app/components/admin-platform/admin-platform.component.ts
- 106
+ 111
+
+
+
+ Explore
+ Eksploruj
+
+ apps/client/src/app/pages/resources/overview/resources-overview.component.html
+ 11
By
- By
+ Przez
apps/client/src/app/pages/portfolio/fire/fire-page.html
139
@@ -1240,10 +1248,10 @@
Current year
- Current year
+ Obecny rok
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
@@ -1259,7 +1267,7 @@
Platformy
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 195
+ 212
@@ -1267,7 +1275,7 @@
Tagi
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 201
+ 218
libs/ui/src/lib/tags-selector/tags-selector.component.html
@@ -1291,7 +1299,7 @@
Czy naprawdę chcesz usunąć ten tag?
apps/client/src/app/components/admin-tag/admin-tag.component.ts
- 103
+ 108
@@ -1315,7 +1323,7 @@
Czy na pewno chcesz usunąć tego użytkownika?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 218
+ 215
@@ -1336,7 +1344,7 @@
No auto-renewal on membership.
- No auto-renewal on membership.
+ Brak automatycznego odnawiania członkostwa.
apps/client/src/app/components/user-account-membership/user-account-membership.html
74
@@ -1383,11 +1391,11 @@
Could not validate form
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 554
+ 570
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 557
+ 573
@@ -1435,7 +1443,7 @@
Poziom Odniesienia (Benchmark)
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 376
+ 379
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
@@ -1471,7 +1479,7 @@
apps/client/src/app/components/header/header.component.ts
- 297
+ 298
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
@@ -1491,15 +1499,15 @@
Ups! Nieprawidłowy token bezpieczeństwa.
apps/client/src/app/components/header/header.component.ts
- 312
+ 313
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 154
+ 152
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 193
+ 191
@@ -1507,7 +1515,7 @@
Zarządzaj Aktywnościami
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 64
@@ -1515,11 +1523,11 @@
Zagrożenie
apps/client/src/app/components/home-market/home-market.component.ts
- 42
+ 41
apps/client/src/app/components/markets/markets.component.ts
- 47
+ 46
libs/ui/src/lib/i18n.ts
@@ -1531,11 +1539,11 @@
Zachłanność
apps/client/src/app/components/home-market/home-market.component.ts
- 43
+ 42
apps/client/src/app/components/markets/markets.component.ts
- 48
+ 47
libs/ui/src/lib/i18n.ts
@@ -1572,7 +1580,7 @@
The source code is fully available as open source software (OSS) under the AGPL-3.0 license
- The source code is fully available as open source software (OSS) under the AGPL-3.0 license
+ Kod źródłowy jest w pełni dostępny jako oprogramowanie open source (OSS) na licencji AGPL-3.0 license
apps/client/src/app/pages/about/overview/about-overview-page.html
16
@@ -1636,10 +1644,10 @@
Current week
- Current week
+ Obecny tydzień
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
@@ -1919,7 +1927,7 @@
Zgłoś Błąd Danych
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 450
+ 456
@@ -2107,7 +2115,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
- 199
+ 205
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2119,7 +2127,7 @@
1 rok
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2131,7 +2139,7 @@
5 lat
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2140,7 +2148,7 @@
Performance with currency effect
- Performance with currency effect
+ Wynik z efektem walutowym
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
135
@@ -2151,7 +2159,7 @@
Maksimum
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 211
+ 217
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2255,7 +2263,7 @@
Auto
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 70
+ 69
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -2267,7 +2275,7 @@
Czy na pewno chcesz usunąć tą metode logowania?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 282
+ 279
@@ -2307,7 +2315,7 @@
Ustawienia Regionalne
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 509
+ 512
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -2368,7 +2376,7 @@
this is projected to increase to
- this is projected to increase to
+ prognozuje się wzrost tej kwoty do
apps/client/src/app/pages/portfolio/fire/fire-page.html
147
@@ -2451,7 +2459,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 195
+ 194
@@ -2463,7 +2471,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 193
+ 192
@@ -2479,7 +2487,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 196
+ 195
@@ -2580,7 +2588,7 @@
for
- for
+ dla
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
128
@@ -2607,7 +2615,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 375
+ 381
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2703,7 +2711,7 @@
Dane Rynkowe
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 397
+ 403
libs/common/src/lib/routes/routes.ts
@@ -2737,6 +2745,10 @@
Overview
Przegląd
+
+ apps/client/src/app/components/admin-jobs/admin-jobs.html
+ 7
+
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
114
@@ -2880,14 +2892,14 @@
Could not parse scraper configuration
- Could not parse scraper configuration
+ Nie udało się przetworzyć konfiguracji scrapera
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 509
+ 525
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 512
+ 528
@@ -3036,7 +3048,7 @@
per week
- per week
+ na tydzień
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
130
@@ -3127,7 +3139,7 @@
Rynki
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 378
+ 381
apps/client/src/app/components/footer/footer.component.html
@@ -3212,7 +3224,7 @@
Edit access
- Edit access
+ Edytuj dostęp
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
11
@@ -3316,7 +3328,7 @@
Get access to 80’000+ tickers from over 50 exchanges
- Get access to 80’000+ tickers from over 50 exchanges
+ Uzyskaj dostęp do 80 000+ tickerów z ponad 50 giełd
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
84
@@ -3452,7 +3464,7 @@
less than
- less than
+ mniej niż
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
129
@@ -3516,7 +3528,7 @@
Ghostfolio Status
- Ghostfolio Status
+ Ghostfolio Status
apps/client/src/app/pages/about/overview/about-overview-page.html
62
@@ -3524,7 +3536,7 @@
with your university e-mail address
- with your university e-mail address
+ używając swojego adresu e-mail uczelni
apps/client/src/app/pages/pricing/pricing-page.html
348
@@ -3556,7 +3568,7 @@
and a safe withdrawal rate (SWR) of
- 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
108
@@ -3583,7 +3595,7 @@
Job ID
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 34
+ 43
@@ -3639,7 +3651,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 342
+ 348
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -3767,7 +3779,7 @@
Impotruj Dywidendy
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 137
+ 136
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -3783,7 +3795,7 @@
Importowanie danych...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 175
+ 174
@@ -3791,12 +3803,12 @@
Importowanie zakończone
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 185
+ 184
or start a discussion at
- or start a discussion at
+ lub rozpocznij dyskusję n
apps/client/src/app/pages/about/overview/about-overview-page.html
94
@@ -3807,7 +3819,7 @@
Weryfikacja danych...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 299
+ 293
@@ -4008,7 +4020,7 @@
Latest activities
- Latest activities
+ Ostatnie transakcje
apps/client/src/app/pages/public/public-page.html
210
@@ -4076,7 +4088,7 @@
Looking for a student discount?
- Looking for a student discount?
+ Szukasz zniżki studenckiej?
apps/client/src/app/pages/pricing/pricing-page.html
342
@@ -4107,7 +4119,7 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 76
+ 75
libs/ui/src/lib/i18n.ts
@@ -4116,7 +4128,7 @@
annual interest rate
- annual interest rate
+ rocznej stopy zwrotu
apps/client/src/app/pages/portfolio/fire/fire-page.html
185
@@ -4127,7 +4139,7 @@
Depozyt
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 385
+ 404
@@ -4135,7 +4147,7 @@
Miesięcznie
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 91
+ 90
@@ -4143,7 +4155,7 @@
Rocznie
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 92
+ 91
@@ -4423,11 +4435,11 @@
Could not save asset profile
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 588
+ 604
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 591
+ 607
@@ -4456,7 +4468,7 @@
Sustainable retirement income
- Sustainable retirement income
+ Zrównoważony dochód na emeryturze
apps/client/src/app/pages/portfolio/fire/fire-page.html
41
@@ -4497,6 +4509,10 @@
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
88
+
+ libs/ui/src/lib/value/value.component.html
+ 18
+
Personal Finance Tools
@@ -4589,7 +4605,7 @@
per month
- per month
+ miesięcznie
apps/client/src/app/pages/portfolio/fire/fire-page.html
94
@@ -4609,7 +4625,7 @@
Website of Thomas Kaul
- Website of Thomas Kaul
+ Strona internetowa Thomas'a Kaul'a
apps/client/src/app/pages/about/overview/about-overview-page.html
44
@@ -4841,7 +4857,7 @@
Request it
- Request it
+ Porpoś o
apps/client/src/app/pages/pricing/pricing-page.html
344
@@ -4952,7 +4968,7 @@
Profile aktywów
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 106
+ 123
libs/ui/src/lib/assistant/assistant.html
@@ -4961,7 +4977,7 @@
,
- ,
+ ,
apps/client/src/app/pages/portfolio/fire/fire-page.html
145
@@ -4985,7 +5001,7 @@
contact us
- contact us
+ skontaktuj się z nami
apps/client/src/app/pages/pricing/pricing-page.html
336
@@ -5041,7 +5057,7 @@
Interest
- Udział
+ Odsetki
apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html
69
@@ -5052,7 +5068,7 @@
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 395
+ 414
libs/ui/src/lib/i18n.ts
@@ -5064,7 +5080,7 @@
Oszczędności
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 405
+ 424
@@ -5136,7 +5152,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 326
+ 327
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -5168,7 +5184,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 342
+ 343
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -5296,7 +5312,7 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 449
+ 451
@@ -5309,10 +5325,10 @@
No Activities
- No Activities
+ Brak transakcji
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 146
+ 145
@@ -5344,7 +5360,7 @@
Symbol
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 68
+ 77
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -5360,7 +5376,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 315
+ 318
libs/ui/src/lib/i18n.ts
@@ -5389,7 +5405,7 @@
View Details
- View Details
+ Zobacz szczegóły
apps/client/src/app/components/admin-users/admin-users.html
225
@@ -5409,7 +5425,7 @@
Sign in with OpenID Connect
- Sign in with OpenID Connect
+ Zaloguj się za pomocą OpenID Connect
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
55
@@ -5417,7 +5433,7 @@
Buy
- Zakup
+ Kupno
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
31
@@ -5461,7 +5477,7 @@
Sell
- Sprzedaj
+ Sprzedaż
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
44
@@ -5521,7 +5537,7 @@
Authentication
- Authentication
+ Uwierzytelnianie
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
54
@@ -5617,7 +5633,7 @@
If you retire today, you would be able to withdraw
- If you retire today, you would be able to withdraw
+ Gdybyś przeszedł na emeryturę dziś, mógłbyś wypłacać
apps/client/src/app/pages/portfolio/fire/fire-page.html
68
@@ -5668,7 +5684,7 @@
Ważność do
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 74
+ 86
libs/ui/src/lib/membership-card/membership-card.component.html
@@ -5700,11 +5716,11 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 451
+ 453
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 465
+ 467
libs/ui/src/lib/top-holdings/top-holdings.component.html
@@ -5768,7 +5784,7 @@
Obecna cena rynkowa wynosi
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 706
+ 722
@@ -5776,7 +5792,7 @@
Test
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 568
+ 571
@@ -5821,7 +5837,7 @@
Argentina
- Argentina
+ Argentyna
libs/ui/src/lib/i18n.ts
78
@@ -5864,11 +5880,11 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 81
+ 80
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 97
+ 96
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
@@ -5877,7 +5893,7 @@
here
- here
+ tutaj
apps/client/src/app/pages/pricing/pricing-page.html
347
@@ -5885,10 +5901,10 @@
Close Holding
- Close Holding
+ Zamknij pozycję
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 441
+ 447
@@ -5936,7 +5952,7 @@
WTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
libs/ui/src/lib/assistant/assistant.component.ts
@@ -5956,7 +5972,7 @@
MTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6004,7 +6020,7 @@
rok
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
@@ -6024,7 +6040,7 @@
lata
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6044,7 +6060,7 @@
Gromadzenie Danych
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 587
+ 594
apps/client/src/app/components/admin-overview/admin-overview.html
@@ -6056,7 +6072,7 @@
Informacje Ogólne
apps/client/src/app/pages/faq/faq-page.component.ts
- 49
+ 41
@@ -6064,7 +6080,7 @@
Rozwiązanie w Chmurze
apps/client/src/app/pages/faq/faq-page.component.ts
- 54
+ 46
libs/common/src/lib/routes/routes.ts
@@ -6076,7 +6092,7 @@
Własny Hosting
apps/client/src/app/pages/faq/faq-page.component.ts
- 60
+ 52
libs/common/src/lib/routes/routes.ts
@@ -6117,7 +6133,7 @@
Antywne
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 64
+ 63
@@ -6125,7 +6141,7 @@
Zamknięte
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 65
+ 64
@@ -6157,7 +6173,7 @@
Wykonaj Zadanie
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 220
+ 229
@@ -6165,7 +6181,7 @@
Priorytet
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 96
+ 105
@@ -6221,7 +6237,7 @@
Czy na pewno chcesz zamknąć swoje konto Ghostfolio?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 208
+ 205
@@ -6266,10 +6282,10 @@
Include in
- Include in
+ Uwzględnij w
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 374
+ 377
@@ -6277,7 +6293,7 @@
Ups! Wystąpił błąd podczas konfigurowania uwierzytelniania biometrycznego.
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 336
+ 333
@@ -6293,7 +6309,7 @@
Punkty Odniesienia
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 126
+ 125
@@ -6550,7 +6566,7 @@
View Holding
- View Holding
+ Podgląd inwestycji
libs/ui/src/lib/activities-table/activities-table.component.html
450
@@ -6673,7 +6689,7 @@
Błąd
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 697
+ 713
@@ -6694,7 +6710,7 @@
Oops! Could not update access.
- Oops! Could not update access.
+ Ups! Nie udało się zaktualizować dostępu.
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts
178
@@ -6702,7 +6718,7 @@
, based on your total assets of
- , 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
96
@@ -6725,7 +6741,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 592
+ 599
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6777,7 +6793,7 @@
Zamknij
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 594
+ 601
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6822,7 +6838,7 @@
Role
- Role
+ Rola
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
33
@@ -6849,7 +6865,7 @@
Przegląd portfela
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 56
+ 65
@@ -6862,7 +6878,7 @@
If you plan to open an account at
- If you plan to open an account at
+ Jeśli planujesz otworzyć konto w
apps/client/src/app/pages/pricing/pricing-page.html
312
@@ -6894,7 +6910,7 @@
send an e-mail to
- send an e-mail to
+ wyślij e-mail do
apps/client/src/app/pages/about/overview/about-overview-page.html
87
@@ -6916,6 +6932,14 @@
42
+
+ has been copied to the clipboard
+ has been copied to the clipboard
+
+ libs/ui/src/lib/value/value.component.ts
+ 180
+
+
From the beginning
Od samego początku
@@ -6966,7 +6990,7 @@
, assuming a
- , assuming a
+ , przyjmując
apps/client/src/app/pages/portfolio/fire/fire-page.html
174
@@ -6974,7 +6998,7 @@
to use our referral link and get a Ghostfolio Premium membership for one year
- to use our referral link and get a Ghostfolio Premium membership for one year
+ aby skorzystać z naszego linku polecającego i otrzymać roczną subskrypcję Ghostfolio Premium
apps/client/src/app/pages/pricing/pricing-page.html
340
@@ -6982,7 +7006,7 @@
can be self-hosted
- może być hostowany samodzielnie
+ może być hostowana samodzielnie
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
178
@@ -7006,7 +7030,7 @@
can be used anonymously
- może być używany anonimowo
+ może być używana anonimowo
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
217
@@ -7018,7 +7042,7 @@
cannot be used anonymously
- nie może być używany anonimowo
+ nie może być używana anonimowo
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
224
@@ -7054,7 +7078,7 @@
Ghostfolio is a lightweight wealth management application for individuals to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions.
- Ghostfolio is a lightweight wealth management application for individuals to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions.
+ Ghostfolio to aplikacja do zarządzania majątkiem, przeznaczona dla osób prywatnych do śledzenia akcji, ETF‑ów i kryptowalut oraz podejmowania solidnych, opartych na danych decyzji inwestycyjnych.
apps/client/src/app/pages/about/overview/about-overview-page.html
10
@@ -7081,7 +7105,7 @@
Skonfiguruj klucz API
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 171
+ 188
@@ -7187,7 +7211,7 @@
z
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 135
+ 152
@@ -7195,7 +7219,7 @@
codzienne żądania
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 137
+ 154
@@ -7203,7 +7227,7 @@
Usuń klucz API
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 161
+ 178
@@ -7211,7 +7235,7 @@
Czy na pewno chcesz usunąć klucz API??
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 127
+ 133
@@ -7303,7 +7327,7 @@
Zapisz
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 603
+ 610
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -7355,7 +7379,7 @@
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 260
+ 257
@@ -7368,7 +7392,7 @@
Check the system status at
- Check the system status at
+ Sprawdź status systemu n
apps/client/src/app/pages/about/overview/about-overview-page.html
57
@@ -7379,12 +7403,12 @@
Wprowadź swój klucz API Ghostfolio.
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 146
+ 152
Change with currency effect
- Change with currency effect
+ Zmiana z efektem walutowym
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
116
@@ -7395,7 +7419,7 @@
Prompt AI został skopiowany do schowka
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 201
+ 199
@@ -7411,7 +7435,7 @@
Leniwy
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7419,7 +7443,7 @@
Natychmiastowy
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7427,7 +7451,7 @@
Domyślna cena rynkowa
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 481
+ 484
@@ -7435,7 +7459,7 @@
Tryb
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 518
+ 521
@@ -7443,7 +7467,7 @@
Selektor
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 534
+ 537
@@ -7451,7 +7475,7 @@
Nagłówki żądań HTTP
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 494
+ 497
@@ -7459,7 +7483,7 @@
koniec dnia
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7467,7 +7491,7 @@
w czasie rzeczywistym
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7475,7 +7499,7 @@
Otwórz Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 202
+ 200
@@ -7495,7 +7519,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
@@ -7507,7 +7531,7 @@
apps/client/src/app/components/home-overview/home-overview.component.ts
- 55
+ 54
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -7515,16 +7539,16 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 388
+ 390
The project has been initiated by
- The project has been initiated by
+ Projekt został zainicjowany przez
apps/client/src/app/pages/about/overview/about-overview-page.html
40
@@ -7548,7 +7572,7 @@
Total amount
- Total amount
+ Wartość portfela
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
95
@@ -7623,11 +7647,11 @@
Token bezpieczeństwa
apps/client/src/app/components/admin-users/admin-users.component.ts
- 239
+ 235
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 170
+ 167
@@ -7635,12 +7659,12 @@
Czy napewno chcesz wygenerować nowy token bezpieczeństwa dla tego użytkownika?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 244
+ 240
Find account, holding or page...
- Find account, holding or page...
+ Znajdź konto, pozycję lub stronę...
libs/ui/src/lib/assistant/assistant.component.ts
115
@@ -7708,7 +7732,7 @@
( ) jest już w użyciu.
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 633
+ 649
@@ -7716,7 +7740,7 @@
Wystąpił błąd podczas aktualizacji do ( ).
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 641
+ 657
@@ -7780,7 +7804,7 @@
ktoś
apps/client/src/app/pages/public/public-page.component.ts
- 59
+ 61
@@ -7812,7 +7836,7 @@
Czy na pewno chcesz usunąć ten element?
libs/ui/src/lib/benchmark/benchmark.component.ts
- 144
+ 139
@@ -7853,7 +7877,7 @@
Konto użytkownika demonstracyjnego zostało zsynchronizowane.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 274
+ 277
@@ -7890,7 +7914,7 @@
Fee Ratio
- Fee Ratio
+ Wskaźnik opłat
apps/client/src/app/pages/i18n/i18n-page.html
152
@@ -7898,7 +7922,7 @@
The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
- The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
+ Opłaty przekraczają ${thresholdMax}% twojej całkowitej wartości inwestycji (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
154
@@ -7906,7 +7930,7 @@
The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
- The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%)
+ Opłaty nie przekraczają ${thresholdMax}% twojej całkowitej wartości inwestycji (${feeRatio}%)
apps/client/src/app/pages/i18n/i18n-page.html
158
@@ -8064,10 +8088,10 @@
Current month
- Current month
+ Bieżący miesiąc
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
@@ -8075,7 +8099,7 @@
nowy
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 67
+ 79
apps/client/src/app/pages/admin/admin-page.component.ts
@@ -8236,7 +8260,7 @@
Czy na pewno chcesz wygenerować nowy token bezpieczeństwa?
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 175
+ 172
@@ -8260,7 +8284,7 @@
Akcje
apps/client/src/app/components/markets/markets.component.ts
- 52
+ 51
apps/client/src/app/pages/features/features-page.html
@@ -8272,7 +8296,7 @@
Kryptowaluty
apps/client/src/app/components/markets/markets.component.ts
- 53
+ 52
apps/client/src/app/pages/features/features-page.html
@@ -8292,7 +8316,7 @@
Zarządzaj profilem aktywów
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 465
+ 471
@@ -8325,7 +8349,7 @@
Account Cluster Risks
- Account Cluster Risks
+ Ryzyka skupienia w obrębie rachunków
apps/client/src/app/pages/i18n/i18n-page.html
14
@@ -8333,7 +8357,7 @@
Asset Class Cluster Risks
- Asset Class Cluster Risks
+ Ryzyka skupienia w obrębie klas aktywów
apps/client/src/app/pages/i18n/i18n-page.html
39
@@ -8341,7 +8365,7 @@
Currency Cluster Risks
- Currency Cluster Risks
+ Ryzyka koncentracji walutowej
apps/client/src/app/pages/i18n/i18n-page.html
83
@@ -8349,7 +8373,7 @@
Economic Market Cluster Risks
- Economic Market Cluster Risks
+ Ryzyka skupienia w obrębie segmentów rynku gospodarczego
apps/client/src/app/pages/i18n/i18n-page.html
106
@@ -8357,7 +8381,7 @@
Emergency Fund
- Emergency Fund
+ Fundusz Awaryjny
apps/client/src/app/pages/i18n/i18n-page.html
144
@@ -8365,7 +8389,7 @@
Fees
- Fees
+ Opłaty
apps/client/src/app/pages/i18n/i18n-page.html
161
@@ -8373,7 +8397,7 @@
Liquidity
- Liquidity
+ Płynność
apps/client/src/app/pages/i18n/i18n-page.html
70
@@ -8381,7 +8405,7 @@
Buying Power
- Buying Power
+ Siła nabywcza
apps/client/src/app/pages/i18n/i18n-page.html
71
@@ -8389,7 +8413,7 @@
Your buying power is below ${thresholdMin} ${baseCurrency}
- Your buying power is below ${thresholdMin} ${baseCurrency}
+ Twoja siła nabywcza jest niższa niż ${thresholdMin} ${baseCurrency}
apps/client/src/app/pages/i18n/i18n-page.html
73
@@ -8397,7 +8421,7 @@
Your buying power is 0 ${baseCurrency}
- Your buying power is 0 ${baseCurrency}
+ Twoja siła nabywcza to 0 ${baseCurrency}
apps/client/src/app/pages/i18n/i18n-page.html
77
@@ -8405,7 +8429,7 @@
Your buying power exceeds ${thresholdMin} ${baseCurrency}
- Your buying power exceeds ${thresholdMin} ${baseCurrency}
+ Twoja siła nabywcza przekracza ${thresholdMin} ${baseCurrency}
apps/client/src/app/pages/i18n/i18n-page.html
80
@@ -8413,7 +8437,7 @@
Regional Market Cluster Risks
- Regional Market Cluster Risks
+ Ryzyka skupienia w obrębie regionów rynkowych
apps/client/src/app/pages/i18n/i18n-page.html
163
@@ -8421,7 +8445,7 @@
No results found...
- No results found...
+ Nie znaleziono wyników...
libs/ui/src/lib/assistant/assistant.html
51
@@ -8429,7 +8453,7 @@
Developed Markets
- Developed Markets
+ Rynki rozwinięte
apps/client/src/app/pages/i18n/i18n-page.html
109
@@ -8437,7 +8461,7 @@
The developed markets contribution of your current investment (${developedMarketsValueRatio}%) exceeds ${thresholdMax}%
- The developed markets contribution of your current investment (${developedMarketsValueRatio}%) exceeds ${thresholdMax}%
+ Udział rynków rozwiniętych w Twojej obecnej inwestycji (${developedMarketsValueRatio}%) przekracza ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
112
@@ -8445,7 +8469,7 @@
The developed markets contribution of your current investment (${developedMarketsValueRatio}%) is below ${thresholdMin}%
- The developed markets contribution of your current investment (${developedMarketsValueRatio}%) is below ${thresholdMin}%
+ Udział rynków rozwiniętych w Twojej obecnej inwestycji (${developedMarketsValueRatio}%) jest poniżej ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
117
@@ -8453,7 +8477,7 @@
The developed markets contribution of your current investment (${developedMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- The developed markets contribution of your current investment (${developedMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
+ Udział rynków rozwiniętych w Twojej obecnej inwestycji (${developedMarketsValueRatio}%) mieści się w zakresie ${thresholdMin}% i ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
122
@@ -8461,7 +8485,7 @@
Emerging Markets
- Emerging Markets
+ Rynki wschodzące
apps/client/src/app/pages/i18n/i18n-page.html
127
@@ -8469,7 +8493,7 @@
The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) exceeds ${thresholdMax}%
- The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) exceeds ${thresholdMax}%
+ Udział rynków wschodzących w obecnej inwestycji (${emergingMarketsValueRatio}%) przekracza ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
130
@@ -8477,7 +8501,7 @@
The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) is below ${thresholdMin}%
- The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) is below ${thresholdMin}%
+ Udział rynków wschodzących w obecnej inwestycji (${emergingMarketsValueRatio}%) jest poniżej ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
135
@@ -8485,7 +8509,7 @@
The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
+ Udział rynków wschodzących w obecnej inwestycji (${emergingMarketsValueRatio}%) mieści się w zakresie ${thresholdMin}% i ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
140
@@ -8493,7 +8517,7 @@
No accounts have been set up
- No accounts have been set up
+ Nie utworzono żadnych kont
apps/client/src/app/pages/i18n/i18n-page.html
21
@@ -8501,7 +8525,7 @@
Your net worth is managed by 0 accounts
- Your net worth is managed by 0 accounts
+ Twój majątek jest zarządzany przez 0 kont
apps/client/src/app/pages/i18n/i18n-page.html
33
@@ -8509,7 +8533,7 @@
Asia-Pacific
- Asia-Pacific
+ Asia-Pacific
apps/client/src/app/pages/i18n/i18n-page.html
165
@@ -8517,7 +8541,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
- The Asia-Pacific market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
+ Udział rynku Azji i Pacyfiku w Twojej obecnej inwestycji (${valueRatio}%) przekracza ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
167
@@ -8525,7 +8549,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
- The Asia-Pacific market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
+ Udział rynku Azji i Pacyfiku w Twojej obecnej inwestycji (${valueRatio}%) jest poniżej ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
171
@@ -8533,7 +8557,7 @@
The Asia-Pacific market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- The Asia-Pacific market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
+ Udział rynku Azji i Pacyfiku w Twojej obecnej inwestycji (${valueRatio}%) mieści się w zakresie ${thresholdMin}% i ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
175
@@ -8541,7 +8565,7 @@
Emerging Markets
- Emerging Markets
+ Rynki wschodzące
apps/client/src/app/pages/i18n/i18n-page.html
180
@@ -8549,7 +8573,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
- The Emerging Markets contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
+ Udział rynków wschodzących w Twojej obecnej inwestycji (${valueRatio}%) przekracza ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
183
@@ -8557,7 +8581,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
- The Emerging Markets contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
+ Udział rynków wschodzących w Twojej obecnej inwestycji (${valueRatio}%) jest poniżej ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
187
@@ -8565,7 +8589,7 @@
The Emerging Markets contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- The Emerging Markets contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
+ Udział rynków wschodzących w Twojej obecnej inwestycji (${valueRatio}%) mieści się w zakresie ${thresholdMin}% i ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
191
@@ -8573,7 +8597,7 @@
Europe
- Europe
+ Europa
apps/client/src/app/pages/i18n/i18n-page.html
195
@@ -8581,7 +8605,7 @@
The Europe market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
- The Europe market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
+ Udział rynku europejskiego w obecnej inwestycji (${valueRatio}%) przekracza ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
197
@@ -8589,7 +8613,7 @@
The Europe market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
- The Europe market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
+ Udział rynku europejskiego w obecnej inwestycji (${valueRatio}%) jest poniżej ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
201
@@ -8597,7 +8621,7 @@
The Europe market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- The Europe market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
+ Udział rynku europejskiego w obecnej inwestycji (${valueRatio}%) mieści się w zakresie ${thresholdMin}% i ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
205
@@ -8605,7 +8629,7 @@
Japan
- Japan
+ Japonia
apps/client/src/app/pages/i18n/i18n-page.html
209
@@ -8613,7 +8637,7 @@
The Japan market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
- The Japan market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
+ Udział rynku japońskiego w obecnej inwestycj (${valueRatio}%) przekracza ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
211
@@ -8621,7 +8645,7 @@
The Japan market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
- The Japan market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
+ Udział rynku japońskiego w obecnej inwestycj (${valueRatio}%) jest poniżej ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
215
@@ -8629,7 +8653,7 @@
The Japan market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- The Japan market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
+ Udział rynku japońskiego w obecnej inwestycj (${valueRatio}%) mieści się w zakresie ${thresholdMin}% i ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
219
@@ -8637,7 +8661,7 @@
North America
- North America
+ Północna Ameryka
apps/client/src/app/pages/i18n/i18n-page.html
223
@@ -8645,7 +8669,7 @@
The North America market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
- The North America market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}%
+ Udział rynku Ameryki Północnej w obecnej inwestycji (${valueRatio}%) przekracza ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
225
@@ -8653,7 +8677,7 @@
The North America market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
- The North America market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}%
+ Udział rynku Ameryki Północnej w obecnej inwestycji (${valueRatio}%) jest poniżej ${thresholdMin}%
apps/client/src/app/pages/i18n/i18n-page.html
229
@@ -8661,7 +8685,7 @@
The North America market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
- The North America market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}%
+ Udział rynku Ameryki Północnej w obecnej inwestycji (${valueRatio}%) mieści się w zakresie ${thresholdMin}% i ${thresholdMax}%
apps/client/src/app/pages/i18n/i18n-page.html
233
@@ -8669,7 +8693,7 @@
Find Ghostfolio on GitHub
- Find Ghostfolio on GitHub
+ Znajdź Ghostfolio na GitHub
apps/client/src/app/pages/about/overview/about-overview-page.html
99
@@ -8681,7 +8705,7 @@
Join the Ghostfolio Slack community
- Join the Ghostfolio Slack community
+ Dołącz do społeczności Ghostfolio na Slacku
apps/client/src/app/pages/about/overview/about-overview-page.html
109
@@ -8689,7 +8713,7 @@
Follow Ghostfolio on X (formerly Twitter)
- Follow Ghostfolio on X (formerly Twitter)
+ Śledź Ghostfolio na X (poprzednio Twitter)
apps/client/src/app/pages/about/overview/about-overview-page.html
118
@@ -8697,7 +8721,7 @@
Send an e-mail
- Send an e-mail
+ Wyślij e-mail
apps/client/src/app/pages/about/overview/about-overview-page.html
89
@@ -8709,7 +8733,7 @@
Registration Date
- Registration Date
+ Data rejestracji
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
45
@@ -8717,7 +8741,7 @@
Follow Ghostfolio on LinkedIn
- Follow Ghostfolio on LinkedIn
+ Śledź Ghostfolio na LinkedIn
apps/client/src/app/pages/about/overview/about-overview-page.html
147
@@ -8725,7 +8749,7 @@
Ghostfolio is an independent & bootstrapped business
- Ghostfolio is an independent & bootstrapped business
+ Ghostfolio to niezależna & samofinansująca się firma
apps/client/src/app/pages/about/overview/about-overview-page.html
157
@@ -8733,7 +8757,7 @@
Support Ghostfolio
- Support Ghostfolio
+ Wesprzyj Ghostfolio
apps/client/src/app/pages/about/overview/about-overview-page.html
166
diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf
index e49f13b96..3531f84d7 100644
--- a/apps/client/src/locales/messages.pt.xlf
+++ b/apps/client/src/locales/messages.pt.xlf
@@ -42,7 +42,7 @@
Tipo
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 48
+ 57
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -114,7 +114,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 309
+ 310
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -126,7 +126,7 @@
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 46
+ 58
apps/client/src/app/components/admin-tag/admin-tag.component.html
@@ -186,7 +186,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 316
+ 317
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -290,11 +290,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 74
+ 78
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 67
+ 71
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -322,11 +322,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 85
+ 89
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 78
+ 82
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -362,7 +362,7 @@
Fonte de dados
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 82
+ 91
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -386,7 +386,7 @@
Tentativas
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 120
+ 129
@@ -394,7 +394,7 @@
Criado
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 134
+ 143
@@ -402,7 +402,7 @@
Terminado
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 143
+ 152
@@ -410,11 +410,11 @@
Estado
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 152
+ 161
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 92
+ 104
@@ -430,7 +430,7 @@
Eliminar Tarefas
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 193
+ 202
@@ -438,7 +438,7 @@
Perfil de Ativos
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 106
+ 123
libs/ui/src/lib/assistant/assistant.html
@@ -450,11 +450,11 @@
Histórico de Dados de Mercado
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 54
+ 63
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 448
+ 451
@@ -462,7 +462,7 @@
Visualizar dados
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 208
+ 217
@@ -470,7 +470,7 @@
Ver Stacktrace
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 216
+ 225
@@ -478,7 +478,7 @@
Apagar Tarefa
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 224
+ 233
@@ -530,7 +530,7 @@
Filtrar por...
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 390
+ 383
@@ -606,7 +606,7 @@
Deseja realmente eliminar este cupão?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 193
+ 196
@@ -614,7 +614,7 @@
Deseja realmente limpar a cache?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 230
+ 233
@@ -622,7 +622,7 @@
Por favor, defina a sua mensagem do sistema:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 250
+ 253
@@ -714,7 +714,7 @@
Deseja realmente excluir este utilizador?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 218
+ 215
@@ -766,11 +766,11 @@
Could not validate form
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 554
+ 570
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 557
+ 573
@@ -810,7 +810,7 @@
Referência
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 376
+ 379
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
@@ -846,7 +846,7 @@
apps/client/src/app/components/header/header.component.ts
- 297
+ 298
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
@@ -866,15 +866,15 @@
Oops! Token de Segurança Incorreto.
apps/client/src/app/components/header/header.component.ts
- 312
+ 313
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 154
+ 152
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 193
+ 191
@@ -882,7 +882,7 @@
Gerir Atividades
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 64
@@ -890,11 +890,11 @@
Medo
apps/client/src/app/components/home-market/home-market.component.ts
- 42
+ 41
apps/client/src/app/components/markets/markets.component.ts
- 47
+ 46
libs/ui/src/lib/i18n.ts
@@ -906,11 +906,11 @@
Ganância
apps/client/src/app/components/home-market/home-market.component.ts
- 43
+ 42
apps/client/src/app/components/markets/markets.component.ts
- 48
+ 47
libs/ui/src/lib/i18n.ts
@@ -942,7 +942,7 @@
Depósito
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 385
+ 404
@@ -1214,7 +1214,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 396
+ 399
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -1234,7 +1234,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 407
+ 410
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -1246,7 +1246,7 @@
Marcadores
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 201
+ 218
libs/ui/src/lib/tags-selector/tags-selector.component.html
@@ -1262,7 +1262,7 @@
Dados do Relatório com Problema
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 450
+ 456
@@ -1310,7 +1310,7 @@
AATD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1322,7 +1322,7 @@
1A
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1334,7 +1334,7 @@
5A
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1354,7 +1354,7 @@
Máx
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 211
+ 217
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1382,7 +1382,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 195
+ 194
@@ -1394,7 +1394,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 193
+ 192
@@ -1410,7 +1410,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 196
+ 195
@@ -1470,7 +1470,7 @@
Auto
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 70
+ 69
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -1514,7 +1514,7 @@
Deseja realmente remover este método de início de sessão?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 282
+ 279
@@ -1590,7 +1590,7 @@
Localidade
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 509
+ 512
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -1718,7 +1718,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 375
+ 381
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -1936,6 +1936,10 @@
Overview
Visão geral
+
+ apps/client/src/app/components/admin-jobs/admin-jobs.html
+ 7
+
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
114
@@ -1974,7 +1978,7 @@
Mercados
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 378
+ 381
apps/client/src/app/components/footer/footer.component.html
@@ -2046,7 +2050,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 342
+ 348
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2078,7 +2082,7 @@
Current week
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
@@ -2142,7 +2146,7 @@
Nota
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 432
+ 435
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
@@ -2158,7 +2162,7 @@
A importar dados...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 175
+ 174
@@ -2166,7 +2170,7 @@
A importação foi concluída
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 185
+ 184
@@ -2362,7 +2366,7 @@
Mensalmente
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 91
+ 90
@@ -2584,6 +2588,10 @@
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
88
+
+ libs/ui/src/lib/value/value.component.html
+ 18
+
Resources
@@ -2758,7 +2766,7 @@
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 395
+ 414
libs/ui/src/lib/i18n.ts
@@ -2770,7 +2778,7 @@
Poupanças
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 405
+ 424
@@ -2806,7 +2814,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 326
+ 327
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -2850,7 +2858,7 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 449
+ 451
@@ -2858,7 +2866,7 @@
Símbolo
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 68
+ 77
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -2874,7 +2882,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 315
+ 318
libs/ui/src/lib/i18n.ts
@@ -3086,11 +3094,11 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 451
+ 453
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 465
+ 467
libs/ui/src/lib/top-holdings/top-holdings.component.html
@@ -3118,7 +3126,7 @@
Mapeamento de Símbolo
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 384
+ 387
@@ -3134,7 +3142,7 @@
Dados de Mercado
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 397
+ 403
libs/common/src/lib/routes/routes.ts
@@ -3158,7 +3166,7 @@
A validar dados...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 299
+ 293
@@ -3210,7 +3218,7 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 76
+ 75
libs/ui/src/lib/i18n.ts
@@ -3238,7 +3246,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 342
+ 343
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -3278,7 +3286,7 @@
Anualmente
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 92
+ 91
@@ -3286,7 +3294,7 @@
Importar Dividendos
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 137
+ 136
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -3302,7 +3310,7 @@
Válido até
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 74
+ 86
libs/ui/src/lib/membership-card/membership-card.component.html
@@ -3346,7 +3354,7 @@
No Activities
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 146
+ 145
@@ -3622,11 +3630,11 @@
Could not save asset profile
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 588
+ 604
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 591
+ 607
@@ -3821,6 +3829,14 @@
306
+
+ Explore
+ Explore
+
+ apps/client/src/app/pages/resources/overview/resources-overview.component.html
+ 11
+
+
By
By
@@ -3842,7 +3858,7 @@
Current year
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
@@ -3858,11 +3874,11 @@
Url
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 419
+ 422
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 550
+ 553
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -3878,7 +3894,7 @@
Asset profile has been saved
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 578
+ 594
@@ -3886,7 +3902,7 @@
Deseja mesmo eliminar esta plataforma?
apps/client/src/app/components/admin-platform/admin-platform.component.ts
- 106
+ 111
@@ -3894,7 +3910,7 @@
Plataformas
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 195
+ 212
@@ -4238,7 +4254,7 @@
Configuração do raspador
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 471
+ 474
@@ -4482,7 +4498,7 @@
ETFs sem países
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 136
+ 135
@@ -4490,7 +4506,7 @@
ETFs sem setores
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 141
+ 140
@@ -4670,7 +4686,7 @@
Job ID
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 34
+ 43
@@ -4726,7 +4742,7 @@
Moedas
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 131
+ 130
apps/client/src/app/pages/public/public-page.html
@@ -4778,11 +4794,11 @@
Could not parse scraper configuration
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 509
+ 525
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 512
+ 528
@@ -5476,7 +5492,7 @@
Você realmente deseja excluir esta tag?
apps/client/src/app/components/admin-tag/admin-tag.component.ts
- 103
+ 108
@@ -5576,7 +5592,7 @@
Perfil de ativos
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 52
+ 61
@@ -5708,7 +5724,7 @@
Você realmente deseja excluir esta mensagem do sistema?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 206
+ 209
@@ -5768,7 +5784,7 @@
O preço de mercado atual é
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 706
+ 722
@@ -5776,7 +5792,7 @@
Teste
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 568
+ 571
@@ -5864,11 +5880,11 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 81
+ 80
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 97
+ 96
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
@@ -5888,7 +5904,7 @@
Close Holding
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 441
+ 447
@@ -5936,7 +5952,7 @@
WTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
libs/ui/src/lib/assistant/assistant.component.ts
@@ -5956,7 +5972,7 @@
MTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6004,7 +6020,7 @@
ano
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
@@ -6024,7 +6040,7 @@
anos
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6044,7 +6060,7 @@
Coleta de dados
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 587
+ 594
apps/client/src/app/components/admin-overview/admin-overview.html
@@ -6056,7 +6072,7 @@
geral
apps/client/src/app/pages/faq/faq-page.component.ts
- 49
+ 41
@@ -6064,7 +6080,7 @@
Nuvem
apps/client/src/app/pages/faq/faq-page.component.ts
- 54
+ 46
libs/common/src/lib/routes/routes.ts
@@ -6076,7 +6092,7 @@
Auto-hospedagem
apps/client/src/app/pages/faq/faq-page.component.ts
- 60
+ 52
libs/common/src/lib/routes/routes.ts
@@ -6117,7 +6133,7 @@
Ativo
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 64
+ 63
@@ -6125,7 +6141,7 @@
Fechado
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 65
+ 64
@@ -6157,7 +6173,7 @@
Executar trabalho
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 220
+ 229
@@ -6165,7 +6181,7 @@
Prioridade
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 96
+ 105
@@ -6221,7 +6237,7 @@
Você realmente deseja encerrar sua conta Ghostfolio?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 208
+ 205
@@ -6269,7 +6285,7 @@
Include in
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 374
+ 377
@@ -6277,7 +6293,7 @@
Ops! Ocorreu um erro ao configurar a autenticação biométrica.
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 336
+ 333
@@ -6293,7 +6309,7 @@
Referências
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 126
+ 125
@@ -6673,7 +6689,7 @@
Erro
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 697
+ 713
@@ -6725,7 +6741,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 592
+ 599
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6777,7 +6793,7 @@
Fechar
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 594
+ 601
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6849,7 +6865,7 @@
Visão geral do portfólio
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 56
+ 65
@@ -6916,6 +6932,14 @@
42
+
+ has been copied to the clipboard
+ has been copied to the clipboard
+
+ libs/ui/src/lib/value/value.component.ts
+ 180
+
+
From the beginning
Desde o início
@@ -7081,7 +7105,7 @@
Definir chave de API
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 171
+ 188
@@ -7187,7 +7211,7 @@
de
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 135
+ 152
@@ -7195,7 +7219,7 @@
solicitações diárias
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 137
+ 154
@@ -7203,7 +7227,7 @@
Remover chave de API
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 161
+ 178
@@ -7211,7 +7235,7 @@
Você realmente deseja excluir a chave de API?
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 127
+ 133
@@ -7303,7 +7327,7 @@
Guardar
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 603
+ 610
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -7355,7 +7379,7 @@
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 260
+ 257
@@ -7379,7 +7403,7 @@
Please enter your Ghostfolio API key.
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 146
+ 152
@@ -7395,7 +7419,7 @@
AI prompt has been copied to the clipboard
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 201
+ 199
@@ -7411,7 +7435,7 @@
Lazy
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7419,7 +7443,7 @@
Instant
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7427,7 +7451,7 @@
Preço de mercado padrão
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 481
+ 484
@@ -7435,7 +7459,7 @@
Mode
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 518
+ 521
@@ -7443,7 +7467,7 @@
Selector
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 534
+ 537
@@ -7451,7 +7475,7 @@
HTTP Request Headers
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 494
+ 497
@@ -7459,7 +7483,7 @@
end of day
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7467,7 +7491,7 @@
real-time
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7475,7 +7499,7 @@
Open Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 202
+ 200
@@ -7495,7 +7519,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
@@ -7507,7 +7531,7 @@
apps/client/src/app/components/home-overview/home-overview.component.ts
- 55
+ 54
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -7515,11 +7539,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 388
+ 390
@@ -7623,11 +7647,11 @@
Security token
apps/client/src/app/components/admin-users/admin-users.component.ts
- 239
+ 235
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 170
+ 167
@@ -7635,7 +7659,7 @@
Do you really want to generate a new security token for this user?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 244
+ 240
@@ -7708,7 +7732,7 @@
( ) is already in use.
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 633
+ 649
@@ -7716,7 +7740,7 @@
An error occurred while updating to ( ).
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 641
+ 657
@@ -7780,7 +7804,7 @@
someone
apps/client/src/app/pages/public/public-page.component.ts
- 59
+ 61
@@ -7812,7 +7836,7 @@
Do you really want to delete this item?
libs/ui/src/lib/benchmark/benchmark.component.ts
- 144
+ 139
@@ -7853,7 +7877,7 @@
Demo user account has been synced.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 274
+ 277
@@ -8067,7 +8091,7 @@
Current month
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
@@ -8075,7 +8099,7 @@
new
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 67
+ 79
apps/client/src/app/pages/admin/admin-page.component.ts
@@ -8236,7 +8260,7 @@
Do you really want to generate a new security token?
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 175
+ 172
@@ -8260,7 +8284,7 @@
Stocks
apps/client/src/app/components/markets/markets.component.ts
- 52
+ 51
apps/client/src/app/pages/features/features-page.html
@@ -8272,7 +8296,7 @@
Criptomoedas
apps/client/src/app/components/markets/markets.component.ts
- 53
+ 52
apps/client/src/app/pages/features/features-page.html
@@ -8292,7 +8316,7 @@
Gerenciar perfil de ativos
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 465
+ 471
diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf
index abe33aa80..e4547a2de 100644
--- a/apps/client/src/locales/messages.tr.xlf
+++ b/apps/client/src/locales/messages.tr.xlf
@@ -223,7 +223,7 @@
Tip
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 48
+ 57
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -311,7 +311,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 309
+ 310
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -323,7 +323,7 @@
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 46
+ 58
apps/client/src/app/components/admin-tag/admin-tag.component.html
@@ -383,7 +383,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 316
+ 317
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -471,11 +471,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 74
+ 78
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 67
+ 71
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -503,11 +503,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 85
+ 89
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 78
+ 82
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -543,7 +543,7 @@
Veri Kaynağı
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 82
+ 91
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -567,7 +567,7 @@
Deneme
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 120
+ 129
@@ -575,7 +575,7 @@
Oluşturuldu
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 134
+ 143
@@ -583,7 +583,7 @@
Tamamlandı
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 143
+ 152
@@ -591,11 +591,11 @@
Durum
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 152
+ 161
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 92
+ 104
@@ -611,7 +611,7 @@
İşleri Sil
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 193
+ 202
@@ -619,7 +619,7 @@
Varlık Profili
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 106
+ 123
libs/ui/src/lib/assistant/assistant.html
@@ -631,11 +631,11 @@
Tarihsel Piyasa Verisi
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 54
+ 63
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 448
+ 451
@@ -643,7 +643,7 @@
Veri Gör
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 208
+ 217
@@ -651,7 +651,7 @@
Hata İzini Görüntüle
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 216
+ 225
@@ -659,7 +659,7 @@
İşleri Sil
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 224
+ 233
@@ -711,7 +711,7 @@
Para Birimleri
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 131
+ 130
apps/client/src/app/pages/public/public-page.html
@@ -723,7 +723,7 @@
Ülkesi Olmayan ETF’ler
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 136
+ 135
@@ -731,7 +731,7 @@
Sektörü Olmayan ETF’ler
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 141
+ 140
@@ -739,7 +739,7 @@
Filtrele...
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 390
+ 383
@@ -859,7 +859,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 396
+ 399
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -879,7 +879,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 407
+ 410
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -891,7 +891,7 @@
Sembol Eşleştirme
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 384
+ 387
@@ -907,7 +907,7 @@
Veri Toplayıcı Yapılandırması
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 471
+ 474
@@ -915,7 +915,7 @@
Not
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 432
+ 435
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
@@ -959,7 +959,7 @@
Bu kuponu gerçekten silmek istiyor musunuz?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 193
+ 196
@@ -967,7 +967,7 @@
Önbelleği temizlemeyi gerçekten istiyor musunuz?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 230
+ 233
@@ -975,7 +975,7 @@
Lütfen sistem mesajınızı belirleyin:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 250
+ 253
@@ -1015,7 +1015,7 @@
Etiketler
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 201
+ 218
libs/ui/src/lib/tags-selector/tags-selector.component.html
@@ -1107,11 +1107,11 @@
Url
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 419
+ 422
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 550
+ 553
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -1127,7 +1127,7 @@
Asset profile has been saved
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 578
+ 594
@@ -1135,7 +1135,15 @@
Bu platformu silmeyi gerçekten istiyor musunuz?
apps/client/src/app/components/admin-platform/admin-platform.component.ts
- 106
+ 111
+
+
+
+ Explore
+ Explore
+
+ apps/client/src/app/pages/resources/overview/resources-overview.component.html
+ 11
@@ -1159,7 +1167,7 @@
Current year
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
@@ -1175,7 +1183,7 @@
Platformlar
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 195
+ 212
@@ -1183,7 +1191,7 @@
Bu kullanıcıyı silmeyi gerçekten istiyor musunuz?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 218
+ 215
@@ -1251,11 +1259,11 @@
Could not validate form
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 554
+ 570
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 557
+ 573
@@ -1303,7 +1311,7 @@
Karşılaştırma Ölçütü
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 376
+ 379
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
@@ -1339,7 +1347,7 @@
apps/client/src/app/components/header/header.component.ts
- 297
+ 298
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
@@ -1359,15 +1367,15 @@
Hay Allah! Güvenlik anahtarı yanlış.
apps/client/src/app/components/header/header.component.ts
- 312
+ 313
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 154
+ 152
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 193
+ 191
@@ -1375,7 +1383,7 @@
İşlemleri Yönet
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 64
@@ -1383,11 +1391,11 @@
Korku
apps/client/src/app/components/home-market/home-market.component.ts
- 42
+ 41
apps/client/src/app/components/markets/markets.component.ts
- 47
+ 46
libs/ui/src/lib/i18n.ts
@@ -1399,11 +1407,11 @@
Açgözlülük
apps/client/src/app/components/home-market/home-market.component.ts
- 43
+ 42
apps/client/src/app/components/markets/markets.component.ts
- 48
+ 47
libs/ui/src/lib/i18n.ts
@@ -1507,7 +1515,7 @@
Current week
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
@@ -1787,7 +1795,7 @@
Rapor Veri Sorunu
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 450
+ 456
@@ -1975,7 +1983,7 @@
YTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1987,7 +1995,7 @@
1Y
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1999,7 +2007,7 @@
5Y
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2019,7 +2027,7 @@
Maks.
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 211
+ 217
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2047,7 +2055,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 195
+ 194
@@ -2059,7 +2067,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 193
+ 192
@@ -2075,7 +2083,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 196
+ 195
@@ -2203,7 +2211,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 375
+ 381
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2267,7 +2275,7 @@
Piyasa Verileri
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 397
+ 403
libs/common/src/lib/routes/routes.ts
@@ -2301,6 +2309,10 @@
Overview
Özet
+
+ apps/client/src/app/components/admin-jobs/admin-jobs.html
+ 7
+
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
114
@@ -2447,11 +2459,11 @@
Could not parse scraper configuration
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 509
+ 525
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 512
+ 528
@@ -2703,7 +2715,7 @@
Piyasalar
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 378
+ 381
apps/client/src/app/components/footer/footer.component.html
@@ -3091,7 +3103,7 @@
Job ID
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 34
+ 43
@@ -3139,7 +3151,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 342
+ 348
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -3243,7 +3255,7 @@
Temettüleri İçe Aktar
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 137
+ 136
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -3259,7 +3271,7 @@
Veri içe aktarılıyor...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 175
+ 174
@@ -3267,7 +3279,7 @@
İçe aktarma tamamlandı
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 185
+ 184
@@ -3283,7 +3295,7 @@
Veri doğrulanıyor...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 299
+ 293
@@ -3591,7 +3603,7 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 76
+ 75
libs/ui/src/lib/i18n.ts
@@ -3611,7 +3623,7 @@
Para Yatırma
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 385
+ 404
@@ -3619,7 +3631,7 @@
Aylık
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 91
+ 90
@@ -3627,7 +3639,7 @@
Yıllık
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 92
+ 91
@@ -3907,11 +3919,11 @@
Could not save asset profile
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 588
+ 604
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 591
+ 607
@@ -4001,6 +4013,10 @@
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
88
+
+ libs/ui/src/lib/value/value.component.html
+ 18
+
Personal Finance Tools
@@ -4340,7 +4356,7 @@
Otomatik
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 70
+ 69
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -4384,7 +4400,7 @@
Bu giriş yöntemini kaldırmayı gerçekten istiyor musunuz?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 282
+ 279
@@ -4392,7 +4408,7 @@
Geçerli tarih
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 74
+ 86
libs/ui/src/lib/membership-card/membership-card.component.html
@@ -4472,7 +4488,7 @@
Yerel Ayarlar
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 509
+ 512
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -4748,7 +4764,7 @@
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 395
+ 414
libs/ui/src/lib/i18n.ts
@@ -4760,7 +4776,7 @@
Tasarruflar
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 405
+ 424
@@ -4832,7 +4848,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 326
+ 327
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -4864,7 +4880,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 342
+ 343
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -4992,7 +5008,7 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 449
+ 451
@@ -5008,7 +5024,7 @@
No Activities
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 146
+ 145
@@ -5040,7 +5056,7 @@
Sembol
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 68
+ 77
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -5056,7 +5072,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 315
+ 318
libs/ui/src/lib/i18n.ts
@@ -5344,11 +5360,11 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 451
+ 453
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 465
+ 467
libs/ui/src/lib/top-holdings/top-holdings.component.html
@@ -5476,7 +5492,7 @@
Bu etiketi silmeyi gerçekten istiyor musunuz?
apps/client/src/app/components/admin-tag/admin-tag.component.ts
- 103
+ 108
@@ -5576,7 +5592,7 @@
Varlık Profili
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 52
+ 61
@@ -5708,7 +5724,7 @@
Bu sistem mesajını silmeyi gerçekten istiyor musunuz?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 206
+ 209
@@ -5768,7 +5784,7 @@
Şu anki piyasa fiyatı
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 706
+ 722
@@ -5776,7 +5792,7 @@
Test
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 568
+ 571
@@ -5864,11 +5880,11 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 81
+ 80
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 97
+ 96
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
@@ -5888,7 +5904,7 @@
Close Holding
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 441
+ 447
@@ -5936,7 +5952,7 @@
WTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
libs/ui/src/lib/assistant/assistant.component.ts
@@ -5956,7 +5972,7 @@
MTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6004,7 +6020,7 @@
Yıl
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
@@ -6024,7 +6040,7 @@
Yıllar
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6044,7 +6060,7 @@
Veri Toplama
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 587
+ 594
apps/client/src/app/components/admin-overview/admin-overview.html
@@ -6056,7 +6072,7 @@
Genel
apps/client/src/app/pages/faq/faq-page.component.ts
- 49
+ 41
@@ -6064,7 +6080,7 @@
Bulut
apps/client/src/app/pages/faq/faq-page.component.ts
- 54
+ 46
libs/common/src/lib/routes/routes.ts
@@ -6076,7 +6092,7 @@
Kendini Barındırma
apps/client/src/app/pages/faq/faq-page.component.ts
- 60
+ 52
libs/common/src/lib/routes/routes.ts
@@ -6117,7 +6133,7 @@
Aktif
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 64
+ 63
@@ -6125,7 +6141,7 @@
Kapalı
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 65
+ 64
@@ -6157,7 +6173,7 @@
İşlemi Yürüt
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 220
+ 229
@@ -6165,7 +6181,7 @@
Öncelik
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 96
+ 105
@@ -6221,7 +6237,7 @@
Ghostfolio hesabınızı kapatmak istediğinize emin misiniz?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 208
+ 205
@@ -6269,7 +6285,7 @@
Include in
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 374
+ 377
@@ -6277,7 +6293,7 @@
Oops! Biyometrik kimlik doğrulama ayarlanırken bir hata oluştu.
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 336
+ 333
@@ -6293,7 +6309,7 @@
Kıyaslamalar
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 126
+ 125
@@ -6673,7 +6689,7 @@
Hata
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 697
+ 713
@@ -6725,7 +6741,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 592
+ 599
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6777,7 +6793,7 @@
Kapat
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 594
+ 601
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6849,7 +6865,7 @@
Portföy Anlık Görüntüsü
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 56
+ 65
@@ -6916,6 +6932,14 @@
42
+
+ has been copied to the clipboard
+ has been copied to the clipboard
+
+ libs/ui/src/lib/value/value.component.ts
+ 180
+
+
From the beginning
Başlangıçtan beri
@@ -7081,7 +7105,7 @@
API anahtarını ayarla
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 171
+ 188
@@ -7187,7 +7211,7 @@
ın
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 135
+ 152
@@ -7195,7 +7219,7 @@
günlük istekler
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 137
+ 154
@@ -7203,7 +7227,7 @@
API anahtarını kaldır
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 161
+ 178
@@ -7211,7 +7235,7 @@
API anahtarını silmek istediğinize emin misiniz?
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 127
+ 133
@@ -7303,7 +7327,7 @@
Kaydet
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 603
+ 610
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -7355,7 +7379,7 @@
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 260
+ 257
@@ -7379,7 +7403,7 @@
Lütfen Ghostfolio API anahtarınızı girin.
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 146
+ 152
@@ -7395,7 +7419,7 @@
Yapay zeka istemi panoya kopyalandı
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 201
+ 199
@@ -7411,7 +7435,7 @@
Tembel
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7419,7 +7443,7 @@
Anında
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7427,7 +7451,7 @@
Varsayılan Piyasa Fiyatı
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 481
+ 484
@@ -7435,7 +7459,7 @@
Mod
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 518
+ 521
@@ -7443,7 +7467,7 @@
Seçici
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 534
+ 537
@@ -7451,7 +7475,7 @@
HTTP İstek Başlıkları
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 494
+ 497
@@ -7459,7 +7483,7 @@
gün sonu
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7467,7 +7491,7 @@
gerçek zamanlı
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7475,7 +7499,7 @@
Duck.ai’yi aç
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 202
+ 200
@@ -7495,7 +7519,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
@@ -7507,7 +7531,7 @@
apps/client/src/app/components/home-overview/home-overview.component.ts
- 55
+ 54
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -7515,11 +7539,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 388
+ 390
@@ -7623,11 +7647,11 @@
Güvenlik belirteci
apps/client/src/app/components/admin-users/admin-users.component.ts
- 239
+ 235
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 170
+ 167
@@ -7635,7 +7659,7 @@
Bu kullanıcı için yeni bir güvenlik belirteci oluşturmak istediğinize emin misiniz?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 244
+ 240
@@ -7708,7 +7732,7 @@
( ) is already in use.
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 633
+ 649
@@ -7716,7 +7740,7 @@
Güncelleştirilirken bir hata oluştu ( ).
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 641
+ 657
@@ -7780,7 +7804,7 @@
birisi
apps/client/src/app/pages/public/public-page.component.ts
- 59
+ 61
@@ -7812,7 +7836,7 @@
Bu öğeyi silmek istediğinize emin misiniz?
libs/ui/src/lib/benchmark/benchmark.component.ts
- 144
+ 139
@@ -7853,7 +7877,7 @@
Demo kullanıcı hesabı senkronize edildi.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 274
+ 277
@@ -8067,7 +8091,7 @@
Current month
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
@@ -8075,7 +8099,7 @@
yeni
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 67
+ 79
apps/client/src/app/pages/admin/admin-page.component.ts
@@ -8236,7 +8260,7 @@
Do you really want to generate a new security token?
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 175
+ 172
@@ -8260,7 +8284,7 @@
Stocks
apps/client/src/app/components/markets/markets.component.ts
- 52
+ 51
apps/client/src/app/pages/features/features-page.html
@@ -8272,7 +8296,7 @@
Cryptocurrencies
apps/client/src/app/components/markets/markets.component.ts
- 53
+ 52
apps/client/src/app/pages/features/features-page.html
@@ -8292,7 +8316,7 @@
Manage Asset Profile
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 465
+ 471
diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf
index 95ad50c7c..12b5c2bc3 100644
--- a/apps/client/src/locales/messages.uk.xlf
+++ b/apps/client/src/locales/messages.uk.xlf
@@ -38,7 +38,7 @@
apps/client/src/app/components/header/header.component.ts
- 297
+ 298
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
@@ -443,7 +443,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 309
+ 310
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -455,7 +455,7 @@
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 46
+ 58
apps/client/src/app/components/admin-tag/admin-tag.component.html
@@ -515,7 +515,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 316
+ 317
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -603,11 +603,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 74
+ 78
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 67
+ 71
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -635,11 +635,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 85
+ 89
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 78
+ 82
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -675,7 +675,7 @@
Тип
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 48
+ 57
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -695,7 +695,7 @@
Профіль активу
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 52
+ 61
@@ -703,11 +703,11 @@
Історичні ринкові дані
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 54
+ 63
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 448
+ 451
@@ -715,7 +715,7 @@
Знімок портфеля
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 56
+ 65
@@ -723,7 +723,7 @@
Джерело даних
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 82
+ 91
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -747,7 +747,7 @@
Пріоритет
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 96
+ 105
@@ -755,7 +755,7 @@
Спроби
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 120
+ 129
@@ -763,7 +763,7 @@
Створено
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 134
+ 143
@@ -771,7 +771,7 @@
Завершено
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 143
+ 152
@@ -779,11 +779,11 @@
Статус
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 152
+ 161
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 92
+ 104
@@ -799,7 +799,7 @@
Видалити завдання
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 193
+ 202
@@ -807,7 +807,7 @@
Переглянути дані
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 208
+ 217
@@ -815,7 +815,7 @@
Переглянути трасування
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 216
+ 225
@@ -823,7 +823,7 @@
Виконати завдання
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 220
+ 229
@@ -831,7 +831,7 @@
Видалити завдання
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 224
+ 233
@@ -839,7 +839,7 @@
Порівняльні показники
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 126
+ 125
@@ -847,7 +847,7 @@
Валюти
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 131
+ 130
apps/client/src/app/pages/public/public-page.html
@@ -859,7 +859,7 @@
ETF без країн
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 136
+ 135
@@ -867,7 +867,7 @@
ETF без секторів
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 141
+ 140
@@ -875,7 +875,7 @@
Фільтрувати за...
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 390
+ 383
@@ -999,7 +999,7 @@
Помилка
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 697
+ 713
@@ -1007,7 +1007,7 @@
Поточна ринкова ціна
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 706
+ 722
@@ -1059,7 +1059,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 396
+ 399
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -1079,7 +1079,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 407
+ 410
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -1091,7 +1091,7 @@
Зіставлення символів
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 384
+ 387
@@ -1107,7 +1107,7 @@
Конфігурація скребка
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 471
+ 474
@@ -1115,7 +1115,7 @@
Тест
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 568
+ 571
@@ -1123,11 +1123,11 @@
URL
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 419
+ 422
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 550
+ 553
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -1143,7 +1143,7 @@
Asset profile has been saved
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 578
+ 594
@@ -1151,7 +1151,7 @@
Примітка
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 432
+ 435
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
@@ -1227,7 +1227,7 @@
Ви дійсно хочете видалити цей купон?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 193
+ 196
@@ -1235,7 +1235,7 @@
Ви дійсно хочете видалити це системне повідомлення?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 206
+ 209
@@ -1243,7 +1243,7 @@
Ви дійсно хочете очистити кеш?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 230
+ 233
@@ -1251,7 +1251,7 @@
Будь ласка, встановіть ваше системне повідомлення:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 250
+ 253
@@ -1307,7 +1307,7 @@
Збір даних
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 587
+ 594
apps/client/src/app/components/admin-overview/admin-overview.html
@@ -1379,7 +1379,15 @@
Ви дійсно хочете видалити цю платформу?
apps/client/src/app/components/admin-platform/admin-platform.component.ts
- 106
+ 111
+
+
+
+ Explore
+ Explore
+
+ apps/client/src/app/pages/resources/overview/resources-overview.component.html
+ 11
@@ -1403,7 +1411,7 @@
Current year
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
@@ -1427,7 +1435,7 @@
Дійсне до
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 74
+ 86
libs/ui/src/lib/membership-card/membership-card.component.html
@@ -1439,7 +1447,7 @@
з
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 135
+ 152
@@ -1447,7 +1455,7 @@
щоденних запитів
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 137
+ 154
@@ -1455,7 +1463,7 @@
Вилучити ключ API
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 161
+ 178
@@ -1463,7 +1471,7 @@
Встановити ключ API
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 171
+ 188
@@ -1471,7 +1479,7 @@
Платформи
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 195
+ 212
@@ -1479,7 +1487,7 @@
Теги
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 201
+ 218
libs/ui/src/lib/tags-selector/tags-selector.component.html
@@ -1495,7 +1503,7 @@
Ви дійсно хочете видалити ключ API?
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 127
+ 133
@@ -1503,7 +1511,7 @@
Будь ласка, введіть ваш ключ API Ghostfolio.
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 146
+ 152
@@ -1587,7 +1595,7 @@
Ви дійсно хочете видалити цей тег?
apps/client/src/app/components/admin-tag/admin-tag.component.ts
- 103
+ 108
@@ -1611,7 +1619,7 @@
Ви дійсно хочете видалити цього користувача?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 218
+ 215
@@ -1667,11 +1675,11 @@
Could not validate form
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 554
+ 570
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 557
+ 573
@@ -1719,7 +1727,7 @@
Порівняльний показник
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 376
+ 379
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
@@ -1795,15 +1803,15 @@
Упс! Неправильний Секретний Токен.
apps/client/src/app/components/header/header.component.ts
- 312
+ 313
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 154
+ 152
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 193
+ 191
@@ -1907,7 +1915,7 @@
Повідомити про збій даних
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 450
+ 456
@@ -1915,7 +1923,7 @@
Активний
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 64
+ 63
@@ -1923,7 +1931,7 @@
Закритий
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 65
+ 64
@@ -1947,7 +1955,7 @@
Керування діяльністю
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 64
@@ -1955,11 +1963,11 @@
Страх
apps/client/src/app/components/home-market/home-market.component.ts
- 42
+ 41
apps/client/src/app/components/markets/markets.component.ts
- 47
+ 46
libs/ui/src/lib/i18n.ts
@@ -1971,11 +1979,11 @@
Жадібність
apps/client/src/app/components/home-market/home-market.component.ts
- 43
+ 42
apps/client/src/app/components/markets/markets.component.ts
- 48
+ 47
libs/ui/src/lib/i18n.ts
@@ -2079,7 +2087,7 @@
Current week
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
@@ -2283,7 +2291,7 @@
Зберегти
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 603
+ 610
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -2563,7 +2571,7 @@
З початку року
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2575,7 +2583,7 @@
1 рік
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2587,7 +2595,7 @@
5 років
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2607,7 +2615,7 @@
Максимум
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 211
+ 217
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2679,7 +2687,7 @@
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 260
+ 257
@@ -2727,7 +2735,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 196
+ 195
@@ -2827,7 +2835,7 @@
Автоматичний
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 70
+ 69
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -2839,7 +2847,7 @@
Ви дійсно хочете закрити ваш обліковий запис Ghostfolio?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 208
+ 205
@@ -2847,7 +2855,7 @@
Ви дійсно хочете вилучити цей спосіб входу?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 282
+ 279
@@ -2855,7 +2863,7 @@
Include in
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 374
+ 377
@@ -2863,7 +2871,7 @@
Упс! Виникла помилка під час налаштування біометричної автентифікації.
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 336
+ 333
@@ -2911,7 +2919,7 @@
Локалізація
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 509
+ 512
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -3055,7 +3063,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 195
+ 194
@@ -3075,7 +3083,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 193
+ 192
@@ -3211,7 +3219,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 375
+ 381
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -3315,7 +3323,7 @@
Ринкові дані
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 397
+ 403
libs/common/src/lib/routes/routes.ts
@@ -3349,6 +3357,10 @@
Overview
Огляд
+
+ apps/client/src/app/components/admin-jobs/admin-jobs.html
+ 7
+
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
114
@@ -3503,11 +3515,11 @@
Could not parse scraper configuration
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 509
+ 525
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 512
+ 528
@@ -3551,7 +3563,7 @@
Загальні
apps/client/src/app/pages/faq/faq-page.component.ts
- 49
+ 41
@@ -3559,7 +3571,7 @@
Хмара
apps/client/src/app/pages/faq/faq-page.component.ts
- 54
+ 46
libs/common/src/lib/routes/routes.ts
@@ -3571,7 +3583,7 @@
Самохостинг
apps/client/src/app/pages/faq/faq-page.component.ts
- 60
+ 52
libs/common/src/lib/routes/routes.ts
@@ -3772,7 +3784,7 @@
Ринки
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 378
+ 381
apps/client/src/app/components/footer/footer.component.html
@@ -4244,7 +4256,7 @@
Job ID
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 34
+ 43
@@ -4300,7 +4312,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 342
+ 348
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -4440,7 +4452,7 @@
Імпорт дивідендів
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 137
+ 136
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -4456,7 +4468,7 @@
Імпортуються дані...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 175
+ 174
@@ -4464,7 +4476,7 @@
Імпорт завершено
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 185
+ 184
@@ -4480,7 +4492,7 @@
Перевірка даних...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 299
+ 293
@@ -4812,7 +4824,7 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 76
+ 75
libs/ui/src/lib/i18n.ts
@@ -4832,11 +4844,11 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 81
+ 80
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 97
+ 96
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
@@ -4856,7 +4868,7 @@
Щомісячно
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 91
+ 90
@@ -4864,7 +4876,7 @@
Щорічно
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 92
+ 91
@@ -4872,7 +4884,7 @@
Close Holding
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 441
+ 447
@@ -5208,11 +5220,11 @@
Could not save asset profile
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 588
+ 604
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 591
+ 607
@@ -5239,6 +5251,14 @@
42
+
+ has been copied to the clipboard
+ has been copied to the clipboard
+
+ libs/ui/src/lib/value/value.component.ts
+ 180
+
+
From the beginning
З початку
@@ -5306,6 +5326,10 @@
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
88
+
+ libs/ui/src/lib/value/value.component.html
+ 18
+
Glossary
@@ -6163,7 +6187,7 @@
WTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6183,7 +6207,7 @@
MTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6203,7 +6227,7 @@
рік
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
@@ -6223,7 +6247,7 @@
роки
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6235,7 +6259,7 @@
Профілі активів
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 106
+ 123
libs/ui/src/lib/assistant/assistant.html
@@ -6375,7 +6399,7 @@
Депозит
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 385
+ 404
@@ -6391,7 +6415,7 @@
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 395
+ 414
libs/ui/src/lib/i18n.ts
@@ -6403,7 +6427,7 @@
Заощадження
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 405
+ 424
@@ -6491,7 +6515,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 326
+ 327
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -6523,7 +6547,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 342
+ 343
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -6555,7 +6579,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 592
+ 599
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6615,7 +6639,7 @@
Закрити
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 594
+ 601
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6755,7 +6779,7 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 449
+ 451
@@ -6779,7 +6803,7 @@
No Activities
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 146
+ 145
@@ -6811,7 +6835,7 @@
Символ
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 68
+ 77
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -6827,7 +6851,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 315
+ 318
libs/ui/src/lib/i18n.ts
@@ -7363,11 +7387,11 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 451
+ 453
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 465
+ 467
libs/ui/src/lib/top-holdings/top-holdings.component.html
@@ -7403,7 +7427,7 @@
Запит AI скопійовано в буфер обміну
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 201
+ 199
@@ -7411,7 +7435,7 @@
Lazy
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7419,7 +7443,7 @@
Instant
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7427,7 +7451,7 @@
Default Market Price
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 481
+ 484
@@ -7435,7 +7459,7 @@
Mode
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 518
+ 521
@@ -7443,7 +7467,7 @@
Selector
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 534
+ 537
@@ -7451,7 +7475,7 @@
HTTP Request Headers
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 494
+ 497
@@ -7459,7 +7483,7 @@
end of day
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7467,7 +7491,7 @@
real-time
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7475,7 +7499,7 @@
Open Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 202
+ 200
@@ -7495,7 +7519,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
@@ -7507,7 +7531,7 @@
apps/client/src/app/components/home-overview/home-overview.component.ts
- 55
+ 54
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -7515,11 +7539,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 388
+ 390
@@ -7623,11 +7647,11 @@
Security token
apps/client/src/app/components/admin-users/admin-users.component.ts
- 239
+ 235
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 170
+ 167
@@ -7635,7 +7659,7 @@
Do you really want to generate a new security token for this user?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 244
+ 240
@@ -7708,7 +7732,7 @@
( ) is already in use.
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 633
+ 649
@@ -7716,7 +7740,7 @@
An error occurred while updating to ( ).
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 641
+ 657
@@ -7780,7 +7804,7 @@
someone
apps/client/src/app/pages/public/public-page.component.ts
- 59
+ 61
@@ -7812,7 +7836,7 @@
Do you really want to delete this item?
libs/ui/src/lib/benchmark/benchmark.component.ts
- 144
+ 139
@@ -7853,7 +7877,7 @@
Demo user account has been synced.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 274
+ 277
@@ -8067,7 +8091,7 @@
Current month
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
@@ -8075,7 +8099,7 @@
new
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 67
+ 79
apps/client/src/app/pages/admin/admin-page.component.ts
@@ -8236,7 +8260,7 @@
Do you really want to generate a new security token?
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 175
+ 172
@@ -8260,7 +8284,7 @@
Stocks
apps/client/src/app/components/markets/markets.component.ts
- 52
+ 51
apps/client/src/app/pages/features/features-page.html
@@ -8272,7 +8296,7 @@
Cryptocurrencies
apps/client/src/app/components/markets/markets.component.ts
- 53
+ 52
apps/client/src/app/pages/features/features-page.html
@@ -8292,7 +8316,7 @@
Manage Asset Profile
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 465
+ 471
diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf
index b6a54edfe..fa9e6b874 100644
--- a/apps/client/src/locales/messages.xlf
+++ b/apps/client/src/locales/messages.xlf
@@ -235,7 +235,7 @@
Type
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 48
+ 57
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -334,7 +334,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 309
+ 310
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -346,7 +346,7 @@
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 46
+ 58
apps/client/src/app/components/admin-tag/admin-tag.component.html
@@ -404,7 +404,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 316
+ 317
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -490,11 +490,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 74
+ 78
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 67
+ 71
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -521,11 +521,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 85
+ 89
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 78
+ 82
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -559,25 +559,25 @@
Asset Profile
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 52
+ 61
Historical Market Data
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 54
+ 63
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 448
+ 451
Data Source
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 82
+ 91
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -600,32 +600,32 @@
Attempts
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 120
+ 129
Created
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 134
+ 143
Finished
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 143
+ 152
Status
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 152
+ 161
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 92
+ 104
@@ -639,28 +639,28 @@
Delete Jobs
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 193
+ 202
View Data
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 208
+ 217
View Stacktrace
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 216
+ 225
Delete Job
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 224
+ 233
@@ -708,7 +708,7 @@
Currencies
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 131
+ 130
apps/client/src/app/pages/public/public-page.html
@@ -719,14 +719,14 @@
ETFs without Countries
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 136
+ 135
ETFs without Sectors
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 141
+ 140
@@ -740,7 +740,7 @@
Filter by...
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 390
+ 383
@@ -893,7 +893,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 396
+ 399
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -912,7 +912,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 407
+ 410
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -923,7 +923,7 @@
Symbol Mapping
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 384
+ 387
@@ -937,14 +937,14 @@
Scraper Configuration
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 471
+ 474
Note
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 432
+ 435
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
@@ -999,28 +999,28 @@
Do you really want to delete this coupon?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 193
+ 196
Do you really want to delete this system message?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 206
+ 209
Do you really want to flush the cache?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 230
+ 233
Please set your system message:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 250
+ 253
@@ -1129,11 +1129,11 @@
Url
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 419
+ 422
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 550
+ 553
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -1148,14 +1148,21 @@
Asset profile has been saved
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 578
+ 594
Do you really want to delete this platform?
apps/client/src/app/components/admin-platform/admin-platform.component.ts
- 106
+ 111
+
+
+
+ Explore
+
+ apps/client/src/app/pages/resources/overview/resources-overview.component.html
+ 11
@@ -1176,7 +1183,7 @@
Current year
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
@@ -1190,14 +1197,14 @@
Platforms
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 195
+ 212
Tags
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 201
+ 218
libs/ui/src/lib/tags-selector/tags-selector.component.html
@@ -1219,7 +1226,7 @@
Do you really want to delete this tag?
apps/client/src/app/components/admin-tag/admin-tag.component.ts
- 103
+ 108
@@ -1240,7 +1247,7 @@
Do you really want to delete this user?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 218
+ 215
@@ -1301,11 +1308,11 @@
Could not validate form
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 554
+ 570
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 557
+ 573
@@ -1349,7 +1356,7 @@
Benchmark
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 376
+ 379
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
@@ -1382,7 +1389,7 @@
apps/client/src/app/components/header/header.component.ts
- 297
+ 298
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
@@ -1401,33 +1408,33 @@
Oops! Incorrect Security Token.
apps/client/src/app/components/header/header.component.ts
- 312
+ 313
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 154
+ 152
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 193
+ 191
Manage Activities
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 64
Fear
apps/client/src/app/components/home-market/home-market.component.ts
- 42
+ 41
apps/client/src/app/components/markets/markets.component.ts
- 47
+ 46
libs/ui/src/lib/i18n.ts
@@ -1438,11 +1445,11 @@
Greed
apps/client/src/app/components/home-market/home-market.component.ts
- 43
+ 42
apps/client/src/app/components/markets/markets.component.ts
- 48
+ 47
libs/ui/src/lib/i18n.ts
@@ -1534,7 +1541,7 @@
Current week
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
@@ -1790,7 +1797,7 @@
Report Data Glitch
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 450
+ 456
@@ -1965,7 +1972,7 @@
YTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1976,7 +1983,7 @@
1Y
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
libs/ui/src/lib/assistant/assistant.component.ts
@@ -1987,7 +1994,7 @@
5Y
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2005,7 +2012,7 @@
Max
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 211
+ 217
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2098,7 +2105,7 @@
Auto
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 70
+ 69
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -2109,7 +2116,7 @@
Do you really want to remove this sign in method?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 282
+ 279
@@ -2144,7 +2151,7 @@
Locale
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 509
+ 512
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -2273,7 +2280,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 195
+ 194
@@ -2284,7 +2291,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 193
+ 192
@@ -2299,7 +2306,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 196
+ 195
@@ -2418,7 +2425,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 375
+ 381
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2505,7 +2512,7 @@
Market Data
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 397
+ 403
libs/common/src/lib/routes/routes.ts
@@ -2536,6 +2543,10 @@
Overview
+
+ apps/client/src/app/components/admin-jobs/admin-jobs.html
+ 7
+
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
114
@@ -2680,11 +2691,11 @@
Could not parse scraper configuration
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 509
+ 525
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 512
+ 528
@@ -2903,7 +2914,7 @@
Markets
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 378
+ 381
apps/client/src/app/components/footer/footer.component.html
@@ -3316,7 +3327,7 @@
Job ID
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 34
+ 43
@@ -3368,7 +3379,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 342
+ 348
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -3484,7 +3495,7 @@
Import Dividends
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 137
+ 136
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -3499,14 +3510,14 @@
Importing data...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 175
+ 174
Import has been completed
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 185
+ 184
@@ -3520,7 +3531,7 @@
Validating data...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 299
+ 293
@@ -3790,7 +3801,7 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 76
+ 75
libs/ui/src/lib/i18n.ts
@@ -3808,21 +3819,21 @@
Deposit
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 385
+ 404
Monthly
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 91
+ 90
Yearly
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 92
+ 91
@@ -4074,11 +4085,11 @@
Could not save asset profile
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 588
+ 604
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 591
+ 607
@@ -4140,6 +4151,10 @@
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
88
+
+ libs/ui/src/lib/value/value.component.html
+ 18
+
Personal Finance Tools
@@ -4570,7 +4585,7 @@
Asset Profiles
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 106
+ 123
libs/ui/src/lib/assistant/assistant.html
@@ -4673,7 +4688,7 @@
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 395
+ 414
libs/ui/src/lib/i18n.ts
@@ -4684,7 +4699,7 @@
Savings
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 405
+ 424
@@ -4751,7 +4766,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 326
+ 327
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -4782,7 +4797,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 342
+ 343
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -4897,7 +4912,7 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 449
+ 451
@@ -4911,7 +4926,7 @@
No Activities
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 146
+ 145
@@ -4932,7 +4947,7 @@
Symbol
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 68
+ 77
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -4948,7 +4963,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 315
+ 318
libs/ui/src/lib/i18n.ts
@@ -5222,7 +5237,7 @@
Valid until
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 74
+ 86
libs/ui/src/lib/membership-card/membership-card.component.html
@@ -5252,11 +5267,11 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 451
+ 453
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 465
+ 467
libs/ui/src/lib/top-holdings/top-holdings.component.html
@@ -5281,14 +5296,14 @@
The current market price is
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 706
+ 722
Test
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 568
+ 571
@@ -5359,7 +5374,7 @@
Close Holding
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 441
+ 447
@@ -5381,11 +5396,11 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 81
+ 80
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 97
+ 96
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
@@ -5438,7 +5453,7 @@
MTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
libs/ui/src/lib/assistant/assistant.component.ts
@@ -5449,7 +5464,7 @@
WTD
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
libs/ui/src/lib/assistant/assistant.component.ts
@@ -5485,7 +5500,7 @@
year
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
@@ -5504,7 +5519,7 @@
years
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -5534,7 +5549,7 @@
Self-Hosting
apps/client/src/app/pages/faq/faq-page.component.ts
- 60
+ 52
libs/common/src/lib/routes/routes.ts
@@ -5545,7 +5560,7 @@
Data Gathering
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 587
+ 594
apps/client/src/app/components/admin-overview/admin-overview.html
@@ -5556,14 +5571,14 @@
General
apps/client/src/app/pages/faq/faq-page.component.ts
- 49
+ 41
Cloud
apps/client/src/app/pages/faq/faq-page.component.ts
- 54
+ 46
libs/common/src/lib/routes/routes.ts
@@ -5588,14 +5603,14 @@
Closed
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 65
+ 64
Active
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 64
+ 63
@@ -5623,7 +5638,7 @@
Execute Job
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 220
+ 229
@@ -5637,7 +5652,7 @@
Priority
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 96
+ 105
@@ -5686,7 +5701,7 @@
Do you really want to close your Ghostfolio account?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 208
+ 205
@@ -5721,14 +5736,14 @@
Include in
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 374
+ 377
Oops! There was an error setting up biometric authentication.
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 336
+ 333
@@ -5763,7 +5778,7 @@
Benchmarks
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 126
+ 125
@@ -6082,7 +6097,7 @@
Error
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 697
+ 713
@@ -6093,7 +6108,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 592
+ 599
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6172,7 +6187,7 @@
Close
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 594
+ 601
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6261,7 +6276,7 @@
Portfolio Snapshot
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 56
+ 65
@@ -6313,6 +6328,13 @@
42
+
+ has been copied to the clipboard
+
+ libs/ui/src/lib/value/value.component.ts
+ 180
+
+
offers a free plan
@@ -6454,7 +6476,7 @@
Set API key
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 171
+ 188
@@ -6557,28 +6579,28 @@
of
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 135
+ 152
Do you really want to delete the API key?
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 127
+ 133
Remove API key
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 161
+ 178
daily requests
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 137
+ 154
@@ -6652,7 +6674,7 @@
Save
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 603
+ 610
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6717,14 +6739,14 @@
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 260
+ 257
Please enter your Ghostfolio API key.
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 146
+ 152
@@ -6738,7 +6760,7 @@
AI prompt has been copied to the clipboard
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 201
+ 199
@@ -6752,63 +6774,63 @@
Mode
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 518
+ 521
Default Market Price
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 481
+ 484
Selector
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 534
+ 537
Instant
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
Lazy
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
HTTP Request Headers
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 494
+ 497
real-time
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
end of day
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
Open Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 202
+ 200
@@ -6826,7 +6848,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
@@ -6837,7 +6859,7 @@
apps/client/src/app/components/home-overview/home-overview.component.ts
- 55
+ 54
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -6845,11 +6867,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 388
+ 390
@@ -6940,7 +6962,7 @@
Do you really want to generate a new security token for this user?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 244
+ 240
@@ -6954,11 +6976,11 @@
Security token
apps/client/src/app/components/admin-users/admin-users.component.ts
- 239
+ 235
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 170
+ 167
@@ -7016,14 +7038,14 @@
( ) is already in use.
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 633
+ 649
An error occurred while updating to ( ).
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 641
+ 657
@@ -7058,7 +7080,7 @@
someone
apps/client/src/app/pages/public/public-page.component.ts
- 59
+ 61
@@ -7087,7 +7109,7 @@
Do you really want to delete this item?
libs/ui/src/lib/benchmark/benchmark.component.ts
- 144
+ 139
@@ -7131,7 +7153,7 @@
Demo user account has been synced.
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 274
+ 277
@@ -7315,14 +7337,14 @@
Current month
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
new
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 67
+ 79
apps/client/src/app/pages/admin/admin-page.component.ts
@@ -7478,14 +7500,14 @@
Do you really want to generate a new security token?
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 175
+ 172
Cryptocurrencies
apps/client/src/app/components/markets/markets.component.ts
- 53
+ 52
apps/client/src/app/pages/features/features-page.html
@@ -7496,7 +7518,7 @@
Stocks
apps/client/src/app/components/markets/markets.component.ts
- 52
+ 51
apps/client/src/app/pages/features/features-page.html
@@ -7514,7 +7536,7 @@
Manage Asset Profile
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 465
+ 471
diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf
index ac81eebc7..78c9b717d 100644
--- a/apps/client/src/locales/messages.zh.xlf
+++ b/apps/client/src/locales/messages.zh.xlf
@@ -252,7 +252,7 @@
类型
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 48
+ 57
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
@@ -360,7 +360,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 309
+ 310
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -372,7 +372,7 @@
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 46
+ 58
apps/client/src/app/components/admin-tag/admin-tag.component.html
@@ -432,7 +432,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 316
+ 317
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -520,11 +520,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 74
+ 78
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 67
+ 71
libs/ui/src/lib/accounts-table/accounts-table.component.html
@@ -552,11 +552,11 @@
apps/client/src/app/components/admin-platform/admin-platform.component.html
- 85
+ 89
apps/client/src/app/components/admin-tag/admin-tag.component.html
- 78
+ 82
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -592,7 +592,7 @@
资产概况
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 52
+ 61
@@ -600,11 +600,11 @@
历史市场数据
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 54
+ 63
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 448
+ 451
@@ -612,7 +612,7 @@
数据源
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 82
+ 91
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -636,7 +636,7 @@
尝试次数
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 120
+ 129
@@ -644,7 +644,7 @@
创建
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 134
+ 143
@@ -652,7 +652,7 @@
完成
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 143
+ 152
@@ -660,11 +660,11 @@
状态
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 152
+ 161
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 92
+ 104
@@ -680,7 +680,7 @@
删除任务
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 193
+ 202
@@ -688,7 +688,7 @@
查看数据
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 208
+ 217
@@ -696,7 +696,7 @@
查看堆栈跟踪
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 216
+ 225
@@ -704,7 +704,7 @@
删除任务
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 224
+ 233
@@ -756,7 +756,7 @@
货币
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 131
+ 130
apps/client/src/app/pages/public/public-page.html
@@ -768,7 +768,7 @@
没有国家的 ETF
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 136
+ 135
@@ -776,7 +776,7 @@
无行业类别的 ETF
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 141
+ 140
@@ -792,7 +792,7 @@
过滤...
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 390
+ 383
@@ -936,7 +936,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 396
+ 399
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -956,7 +956,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 407
+ 410
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -968,7 +968,7 @@
代码映射
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 384
+ 387
@@ -984,7 +984,7 @@
刮削配置
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 471
+ 474
@@ -992,7 +992,7 @@
笔记
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 432
+ 435
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
@@ -1052,7 +1052,7 @@
您确实要删除此优惠券吗?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 193
+ 196
@@ -1060,7 +1060,7 @@
您真的要删除这条系统消息吗?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 206
+ 209
@@ -1068,7 +1068,7 @@
您真的要刷新缓存吗?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 230
+ 233
@@ -1076,7 +1076,7 @@
请设置您的系统消息:
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 250
+ 253
@@ -1200,11 +1200,11 @@
网址
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 419
+ 422
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 550
+ 553
apps/client/src/app/components/admin-platform/admin-platform.component.html
@@ -1220,7 +1220,7 @@
资产概况已保存
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 578
+ 594
@@ -1228,7 +1228,15 @@
您真的要删除这个平台吗?
apps/client/src/app/components/admin-platform/admin-platform.component.ts
- 106
+ 111
+
+
+
+ Explore
+ Explore
+
+ apps/client/src/app/pages/resources/overview/resources-overview.component.html
+ 11
@@ -1252,7 +1260,7 @@
当前年份
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
@@ -1268,7 +1276,7 @@
平台
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 195
+ 212
@@ -1276,7 +1284,7 @@
标签
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 201
+ 218
libs/ui/src/lib/tags-selector/tags-selector.component.html
@@ -1300,7 +1308,7 @@
您真的要删除此标签吗?
apps/client/src/app/components/admin-tag/admin-tag.component.ts
- 103
+ 108
@@ -1324,7 +1332,7 @@
您真的要删除该用户吗?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 218
+ 215
@@ -1392,11 +1400,11 @@
无法验证表单
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 554
+ 570
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 557
+ 573
@@ -1444,7 +1452,7 @@
基准
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 376
+ 379
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
@@ -1480,7 +1488,7 @@
apps/client/src/app/components/header/header.component.ts
- 297
+ 298
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
@@ -1500,15 +1508,15 @@
哎呀!安全令牌不正确。
apps/client/src/app/components/header/header.component.ts
- 312
+ 313
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 154
+ 152
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 193
+ 191
@@ -1516,7 +1524,7 @@
管理活动
apps/client/src/app/components/home-holdings/home-holdings.html
- 65
+ 64
@@ -1524,11 +1532,11 @@
恐惧
apps/client/src/app/components/home-market/home-market.component.ts
- 42
+ 41
apps/client/src/app/components/markets/markets.component.ts
- 47
+ 46
libs/ui/src/lib/i18n.ts
@@ -1540,11 +1548,11 @@
贪婪
apps/client/src/app/components/home-market/home-market.component.ts
- 43
+ 42
apps/client/src/app/components/markets/markets.component.ts
- 48
+ 47
libs/ui/src/lib/i18n.ts
@@ -1648,7 +1656,7 @@
当前周
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
@@ -1928,7 +1936,7 @@
报告数据故障
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 450
+ 456
@@ -2116,7 +2124,7 @@
年初至今
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 199
+ 205
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2128,7 +2136,7 @@
1年
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2140,7 +2148,7 @@
5年
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2160,7 +2168,7 @@
最大限度
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 211
+ 217
libs/ui/src/lib/assistant/assistant.component.ts
@@ -2264,7 +2272,7 @@
自动
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 70
+ 69
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -2276,7 +2284,7 @@
您确实要删除此登录方法吗?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 282
+ 279
@@ -2316,7 +2324,7 @@
语言环境
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 509
+ 512
apps/client/src/app/components/user-account-settings/user-account-settings.html
@@ -2460,7 +2468,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 195
+ 194
@@ -2472,7 +2480,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 193
+ 192
@@ -2488,7 +2496,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 196
+ 195
@@ -2616,7 +2624,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 375
+ 381
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -2712,7 +2720,7 @@
市场数据
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 397
+ 403
libs/common/src/lib/routes/routes.ts
@@ -2746,6 +2754,10 @@
Overview
概述
+
+ apps/client/src/app/components/admin-jobs/admin-jobs.html
+ 7
+
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
114
@@ -2892,11 +2904,11 @@
无法解析抓取器配置
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 509
+ 525
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 512
+ 528
@@ -3136,7 +3148,7 @@
市场
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 378
+ 381
apps/client/src/app/components/footer/footer.component.html
@@ -3600,7 +3612,7 @@
作业 ID
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 34
+ 43
@@ -3656,7 +3668,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 342
+ 348
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
@@ -3784,7 +3796,7 @@
导入股息
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 137
+ 136
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -3800,7 +3812,7 @@
正在导入数据...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 175
+ 174
@@ -3808,7 +3820,7 @@
导入已完成
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 185
+ 184
@@ -3824,7 +3836,7 @@
验证数据...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 299
+ 293
@@ -4124,7 +4136,7 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 76
+ 75
libs/ui/src/lib/i18n.ts
@@ -4144,7 +4156,7 @@
存款
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 385
+ 404
@@ -4152,7 +4164,7 @@
每月
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 91
+ 90
@@ -4160,7 +4172,7 @@
每年
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 92
+ 91
@@ -4440,11 +4452,11 @@
无法保存资产概况
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 588
+ 604
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 591
+ 607
@@ -4514,6 +4526,10 @@
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
88
+
+ libs/ui/src/lib/value/value.component.html
+ 18
+
Personal Finance Tools
@@ -4989,7 +5005,7 @@
资产概况
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 106
+ 123
libs/ui/src/lib/assistant/assistant.html
@@ -5105,7 +5121,7 @@
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 395
+ 414
libs/ui/src/lib/i18n.ts
@@ -5117,7 +5133,7 @@
储蓄
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 405
+ 424
@@ -5189,7 +5205,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 326
+ 327
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -5221,7 +5237,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 342
+ 343
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
@@ -5349,7 +5365,7 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 449
+ 451
@@ -5365,7 +5381,7 @@
No Activities
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 146
+ 145
@@ -5389,7 +5405,7 @@
代码
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 68
+ 77
apps/client/src/app/components/admin-market-data/admin-market-data.html
@@ -5405,7 +5421,7 @@
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 315
+ 318
libs/ui/src/lib/i18n.ts
@@ -5713,7 +5729,7 @@
有效期至
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 74
+ 86
libs/ui/src/lib/membership-card/membership-card.component.html
@@ -5745,11 +5761,11 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 451
+ 453
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 465
+ 467
libs/ui/src/lib/top-holdings/top-holdings.component.html
@@ -5777,7 +5793,7 @@
当前市场价格为
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 706
+ 722
@@ -5785,7 +5801,7 @@
测试
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 568
+ 571
@@ -5865,7 +5881,7 @@
关闭持仓
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 441
+ 447
@@ -5889,11 +5905,11 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 81
+ 80
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 97
+ 96
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
@@ -5953,7 +5969,7 @@
本月至今
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
libs/ui/src/lib/assistant/assistant.component.ts
@@ -5965,7 +5981,7 @@
本周至今
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 191
+ 197
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6005,7 +6021,7 @@
年
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 203
+ 209
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
@@ -6025,7 +6041,7 @@
年
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 207
+ 213
libs/ui/src/lib/assistant/assistant.component.ts
@@ -6058,7 +6074,7 @@
自托管
apps/client/src/app/pages/faq/faq-page.component.ts
- 60
+ 52
libs/common/src/lib/routes/routes.ts
@@ -6070,7 +6086,7 @@
数据收集
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 587
+ 594
apps/client/src/app/components/admin-overview/admin-overview.html
@@ -6082,7 +6098,7 @@
一般的
apps/client/src/app/pages/faq/faq-page.component.ts
- 49
+ 41
@@ -6090,7 +6106,7 @@
云
apps/client/src/app/pages/faq/faq-page.component.ts
- 54
+ 46
libs/common/src/lib/routes/routes.ts
@@ -6118,7 +6134,7 @@
已关闭
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 65
+ 64
@@ -6126,7 +6142,7 @@
活跃
apps/client/src/app/components/home-holdings/home-holdings.component.ts
- 64
+ 63
@@ -6158,7 +6174,7 @@
执行作业
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 220
+ 229
@@ -6166,7 +6182,7 @@
优先级
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 96
+ 105
@@ -6222,7 +6238,7 @@
您确定要关闭您的 Ghostfolio 账户吗?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 208
+ 205
@@ -6270,7 +6286,7 @@
包含在
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 374
+ 377
@@ -6278,7 +6294,7 @@
哎呀!设置生物识别认证时发生错误。
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 336
+ 333
@@ -6294,7 +6310,7 @@
基准
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
- 126
+ 125
@@ -6674,7 +6690,7 @@
错误
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 697
+ 713
@@ -6726,7 +6742,7 @@
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 592
+ 599
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6778,7 +6794,7 @@
关闭
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 594
+ 601
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -6850,7 +6866,7 @@
投资组合快照
apps/client/src/app/components/admin-jobs/admin-jobs.html
- 56
+ 65
@@ -6917,6 +6933,14 @@
42
+
+ has been copied to the clipboard
+ has been copied to the clipboard
+
+ libs/ui/src/lib/value/value.component.ts
+ 180
+
+
From the beginning
从头开始
@@ -7082,7 +7106,7 @@
设置 API 密钥
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 171
+ 188
@@ -7188,7 +7212,7 @@
的
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 135
+ 152
@@ -7196,7 +7220,7 @@
每日请求
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 137
+ 154
@@ -7204,7 +7228,7 @@
移除 API 密钥
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 161
+ 178
@@ -7212,7 +7236,7 @@
您确定要删除此 API 密钥吗?
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 127
+ 133
@@ -7304,7 +7328,7 @@
保存
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 603
+ 610
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
@@ -7356,7 +7380,7 @@
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 260
+ 257
@@ -7380,7 +7404,7 @@
请输入您的 Ghostfolio API 密钥。
apps/client/src/app/components/admin-settings/admin-settings.component.ts
- 146
+ 152
@@ -7396,7 +7420,7 @@
AI 提示已复制到剪贴板
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 201
+ 199
@@ -7412,7 +7436,7 @@
延迟
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7420,7 +7444,7 @@
即时
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7428,7 +7452,7 @@
默认市场价格
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 481
+ 484
@@ -7436,7 +7460,7 @@
模式
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 518
+ 521
@@ -7444,7 +7468,7 @@
选择器
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 534
+ 537
@@ -7452,7 +7476,7 @@
HTTP 请求标头
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
- 494
+ 497
@@ -7460,7 +7484,7 @@
收盘
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 225
+ 231
@@ -7468,7 +7492,7 @@
实时
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 229
+ 235
@@ -7476,7 +7500,7 @@
打开 Duck.ai
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 202
+ 200
@@ -7496,7 +7520,7 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
@@ -7508,7 +7532,7 @@
apps/client/src/app/components/home-overview/home-overview.component.ts
- 55
+ 54
libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -7516,11 +7540,11 @@
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 375
+ 377
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
- 388
+ 390
@@ -7624,11 +7648,11 @@
安全令牌
apps/client/src/app/components/admin-users/admin-users.component.ts
- 239
+ 235
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 170
+ 167
@@ -7636,7 +7660,7 @@
您确定要为此用户生成新的安全令牌吗?
apps/client/src/app/components/admin-users/admin-users.component.ts
- 244
+ 240
@@ -7709,7 +7733,7 @@
( ) 已在使用中。
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 633
+ 649
@@ -7717,7 +7741,7 @@
在更新到 ( ) 时发生错误。
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 641
+ 657
@@ -7781,7 +7805,7 @@
某人
apps/client/src/app/pages/public/public-page.component.ts
- 59
+ 61
@@ -7813,7 +7837,7 @@
您确定要删除此项目吗?
libs/ui/src/lib/benchmark/benchmark.component.ts
- 144
+ 139
@@ -7854,7 +7878,7 @@
演示用户账户已同步。
apps/client/src/app/components/admin-overview/admin-overview.component.ts
- 274
+ 277
@@ -8068,7 +8092,7 @@
当前月份
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
- 195
+ 201
@@ -8076,7 +8100,7 @@
新增
apps/client/src/app/components/admin-settings/admin-settings.component.html
- 67
+ 79
apps/client/src/app/pages/admin/admin-page.component.ts
@@ -8237,7 +8261,7 @@
您真的想要生成一个新的安全令牌吗?
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 175
+ 172
@@ -8261,7 +8285,7 @@
股票
apps/client/src/app/components/markets/markets.component.ts
- 52
+ 51
apps/client/src/app/pages/features/features-page.html
@@ -8273,7 +8297,7 @@
加密货币
apps/client/src/app/components/markets/markets.component.ts
- 53
+ 52
apps/client/src/app/pages/features/features-page.html
@@ -8293,7 +8317,7 @@
管理资产概况
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 465
+ 471
diff --git a/apps/client/src/styles.scss b/apps/client/src/styles.scss
index 6256fe2df..ecb53b9ab 100644
--- a/apps/client/src/styles.scss
+++ b/apps/client/src/styles.scss
@@ -4,7 +4,7 @@
@import './styles/table';
@import './styles/variables';
-@import 'svgmap/dist/svgMap';
+@import 'svgmap/style.min';
:root {
--dark-background: rgb(25, 25, 25);
@@ -488,6 +488,10 @@ ngx-skeleton-loader {
padding: 9px 24px !important;
}
+.no-height {
+ height: unset !important;
+}
+
.no-min-width {
min-width: unset !important;
}
diff --git a/libs/common/src/lib/calculation-helper.ts b/libs/common/src/lib/calculation-helper.ts
index 76b38f9b2..2097fa52a 100644
--- a/libs/common/src/lib/calculation-helper.ts
+++ b/libs/common/src/lib/calculation-helper.ts
@@ -36,14 +36,16 @@ export function getAnnualizedPerformancePercent({
return new Big(0);
}
-export function getIntervalFromDateRange(
- aDateRange: DateRange,
- portfolioStart = new Date(0)
-) {
- let endDate = endOfDay(new Date());
- let startDate = portfolioStart;
+export function getIntervalFromDateRange(params: {
+ dateRange: DateRange;
+ endDate?: Date;
+ startDate?: Date;
+}) {
+ const { dateRange } = params;
+ let endDate = params.endDate ?? endOfDay(new Date());
+ let startDate = params.startDate ?? new Date(0);
- switch (aDateRange) {
+ switch (dateRange) {
case '1d':
startDate = max([startDate, subDays(resetHours(new Date()), 1)]);
break;
@@ -75,8 +77,8 @@ export function getIntervalFromDateRange(
break;
default:
// '2024', '2023', '2022', etc.
- endDate = endOfYear(new Date(aDateRange));
- startDate = max([startDate, new Date(aDateRange)]);
+ endDate = endOfYear(new Date(dateRange));
+ startDate = max([startDate, new Date(dateRange)]);
}
return { endDate, startDate };
diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts
index 5da0e0122..08fa2f030 100644
--- a/libs/common/src/lib/config.ts
+++ b/libs/common/src/lib/config.ts
@@ -51,6 +51,14 @@ export const ASSET_CLASS_MAPPING = new Map([
[AssetClass.REAL_ESTATE, []]
]);
+export const BULL_BOARD_COOKIE_NAME = 'bull_board_token';
+
+/**
+ * WARNING: This route is mirrored in `apps/client/proxy.conf.json`.
+ * If you update this value, you must also update the proxy configuration.
+ */
+export const BULL_BOARD_ROUTE = '/admin/queues';
+
export const CACHE_TTL_NO_CACHE = 1;
export const CACHE_TTL_INFINITE = 0;
diff --git a/libs/common/src/lib/helper.spec.ts b/libs/common/src/lib/helper.spec.ts
index 25779cf39..a339c6dab 100644
--- a/libs/common/src/lib/helper.spec.ts
+++ b/libs/common/src/lib/helper.spec.ts
@@ -25,7 +25,7 @@ describe('Helper', () => {
it('Get decimal number with group (dot notation)', () => {
expect(
- extractNumberFromString({ locale: 'de-CH', value: '99’999.99' })
+ extractNumberFromString({ locale: 'de-CH', value: `99'999.99` })
).toEqual(99999.99);
});
@@ -54,12 +54,12 @@ describe('Helper', () => {
});
it('Get de-CH number format group', () => {
- expect(getNumberFormatGroup('de-CH')).toEqual('’');
+ expect(getNumberFormatGroup('de-CH')).toEqual(`'`);
});
it('Get de-CH number format group when it is default', () => {
languageGetter.mockReturnValue('de-CH');
- expect(getNumberFormatGroup()).toEqual('’');
+ expect(getNumberFormatGroup()).toEqual(`'`);
});
it('Get de-DE number format group', () => {
diff --git a/libs/common/src/lib/interfaces/lookup-item.interface.ts b/libs/common/src/lib/interfaces/lookup-item.interface.ts
index fa91ed690..6cedeca09 100644
--- a/libs/common/src/lib/interfaces/lookup-item.interface.ts
+++ b/libs/common/src/lib/interfaces/lookup-item.interface.ts
@@ -7,7 +7,7 @@ export interface LookupItem {
assetSubClass: AssetSubClass;
currency: string;
dataProviderInfo: DataProviderInfo;
- dataSource: DataSource;
+ dataSource: DataSource | null;
name: string;
symbol: string;
}
diff --git a/libs/common/src/lib/interfaces/portfolio-position.interface.ts b/libs/common/src/lib/interfaces/portfolio-position.interface.ts
index 620cc00e9..c4ef2e3dc 100644
--- a/libs/common/src/lib/interfaces/portfolio-position.interface.ts
+++ b/libs/common/src/lib/interfaces/portfolio-position.interface.ts
@@ -3,19 +3,52 @@ import { Market, MarketAdvanced } from '@ghostfolio/common/types';
import { AssetClass, AssetSubClass, DataSource, Tag } from '@prisma/client';
import { Country } from './country.interface';
+import { EnhancedSymbolProfile } from './enhanced-symbol-profile.interface';
import { Holding } from './holding.interface';
import { Sector } from './sector.interface';
export interface PortfolioPosition {
activitiesCount: number;
allocationInPercentage: number;
+
+ /** @deprecated */
assetClass?: AssetClass;
+
+ /** @deprecated */
assetClassLabel?: string;
+
+ assetProfile: Pick<
+ EnhancedSymbolProfile,
+ | 'assetClass'
+ | 'assetSubClass'
+ | 'countries'
+ | 'currency'
+ | 'dataSource'
+ | 'holdings'
+ | 'name'
+ | 'sectors'
+ | 'symbol'
+ | 'url'
+ > & {
+ assetClassLabel?: string;
+ assetSubClassLabel?: string;
+ };
+
+ /** @deprecated */
assetSubClass?: AssetSubClass;
+
+ /** @deprecated */
assetSubClassLabel?: string;
+
+ /** @deprecated */
countries: Country[];
+
+ /** @deprecated */
currency: string;
+
+ /** @deprecated */
dataSource: DataSource;
+
dateOfFirstActivity: Date;
dividend: number;
exchange?: string;
@@ -23,24 +56,38 @@ export interface PortfolioPosition {
grossPerformancePercent: number;
grossPerformancePercentWithCurrencyEffect: number;
grossPerformanceWithCurrencyEffect: number;
+
+ /** @deprecated */
holdings: Holding[];
+
investment: number;
marketChange?: number;
marketChangePercent?: number;
marketPrice: number;
markets?: { [key in Market]: number };
marketsAdvanced?: { [key in MarketAdvanced]: number };
+
+ /** @deprecated */
name: string;
+
netPerformance: number;
netPerformancePercent: number;
netPerformancePercentWithCurrencyEffect: number;
netPerformanceWithCurrencyEffect: number;
quantity: number;
+
+ /** @deprecated */
sectors: Sector[];
+
+ /** @deprecated */
symbol: string;
+
tags?: Tag[];
type?: string;
+
+ /** @deprecated */
url?: string;
+
valueInBaseCurrency?: number;
valueInPercentage?: number;
}
diff --git a/libs/common/src/lib/interfaces/portfolio-summary.interface.ts b/libs/common/src/lib/interfaces/portfolio-summary.interface.ts
index 79fbf8707..8db6b39bb 100644
--- a/libs/common/src/lib/interfaces/portfolio-summary.interface.ts
+++ b/libs/common/src/lib/interfaces/portfolio-summary.interface.ts
@@ -6,10 +6,6 @@ export interface PortfolioSummary extends PortfolioPerformance {
annualizedPerformancePercent: number;
annualizedPerformancePercentWithCurrencyEffect: number;
cash: number;
-
- /** @deprecated use totalInvestmentValueWithCurrencyEffect instead */
- committedFunds: number;
-
dateOfFirstActivity: Date;
dividendInBaseCurrency: number;
emergencyFund: {
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 4a087ad16..eae14cec6 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
@@ -14,16 +14,31 @@ export interface PublicPortfolioResponse extends PublicPortfolioResponseV1 {
[symbol: string]: Pick<
PortfolioPosition,
| 'allocationInPercentage'
+
+ /** @deprecated */
| 'assetClass'
+ | 'assetProfile'
+
+ /** @deprecated */
| 'countries'
| 'currency'
+
+ /** @deprecated */
| 'dataSource'
| 'dateOfFirstActivity'
| 'markets'
+
+ /** @deprecated */
| 'name'
| 'netPerformancePercentWithCurrencyEffect'
+
+ /** @deprecated */
| 'sectors'
+
+ /** @deprecated */
| 'symbol'
+
+ /** @deprecated */
| 'url'
| 'valueInBaseCurrency'
| 'valueInPercentage'
diff --git a/libs/common/src/lib/permissions.ts b/libs/common/src/lib/permissions.ts
index cb4eb175b..f9cb19562 100644
--- a/libs/common/src/lib/permissions.ts
+++ b/libs/common/src/lib/permissions.ts
@@ -4,15 +4,16 @@ import { Role } from '@prisma/client';
export const permissions = {
accessAdminControl: 'accessAdminControl',
+ accessAdminControlBullBoard: 'accessAdminControlBullBoard',
accessAssistant: 'accessAssistant',
accessHoldingsChart: 'accessHoldingsChart',
createAccess: 'createAccess',
createAccount: 'createAccount',
createAccountBalance: 'createAccountBalance',
+ createActivity: 'createActivity',
createApiKey: 'createApiKey',
createMarketData: 'createMarketData',
createMarketDataOfOwnAssetProfile: 'createMarketDataOfOwnAssetProfile',
- createOrder: 'createOrder',
createOwnTag: 'createOwnTag',
createPlatform: 'createPlatform',
createTag: 'createTag',
@@ -21,8 +22,8 @@ export const permissions = {
deleteAccess: 'deleteAccess',
deleteAccount: 'deleteAccount',
deleteAccountBalance: 'deleteAccountBalance',
+ deleteActivity: 'deleteActivity',
deleteAuthDevice: 'deleteAuthDevice',
- deleteOrder: 'deleteOrder',
deleteOwnUser: 'deleteOwnUser',
deletePlatform: 'deletePlatform',
deleteTag: 'deleteTag',
@@ -53,10 +54,10 @@ export const permissions = {
toggleReadOnlyMode: 'toggleReadOnlyMode',
updateAccount: 'updateAccount',
updateAccess: 'updateAccess',
+ updateActivity: 'updateActivity',
updateAuthDevice: 'updateAuthDevice',
updateMarketData: 'updateMarketData',
updateMarketDataOfOwnAssetProfile: 'updateMarketDataOfOwnAssetProfile',
- updateOrder: 'updateOrder',
updateOwnAccessToken: 'updateOwnAccessToken',
updatePlatform: 'updatePlatform',
updateTag: 'updateTag',
@@ -74,19 +75,19 @@ export function getPermissions(aRole: Role): string[] {
permissions.createAccess,
permissions.createAccount,
permissions.createAccountBalance,
+ permissions.createActivity,
permissions.createWatchlistItem,
permissions.deleteAccountBalance,
permissions.deleteWatchlistItem,
permissions.createMarketData,
permissions.createMarketDataOfOwnAssetProfile,
- permissions.createOrder,
permissions.createOwnTag,
permissions.createPlatform,
permissions.createTag,
permissions.deleteAccess,
permissions.deleteAccount,
+ permissions.deleteActivity,
permissions.deleteAuthDevice,
- permissions.deleteOrder,
permissions.deletePlatform,
permissions.deleteTag,
permissions.deleteUser,
@@ -99,10 +100,10 @@ export function getPermissions(aRole: Role): string[] {
permissions.readWatchlist,
permissions.updateAccount,
permissions.updateAccess,
+ permissions.updateActivity,
permissions.updateAuthDevice,
permissions.updateMarketData,
permissions.updateMarketDataOfOwnAssetProfile,
- permissions.updateOrder,
permissions.updatePlatform,
permissions.updateTag,
permissions.updateUserSettings,
@@ -125,15 +126,15 @@ export function getPermissions(aRole: Role): string[] {
permissions.createAccess,
permissions.createAccount,
permissions.createAccountBalance,
+ permissions.createActivity,
permissions.createMarketDataOfOwnAssetProfile,
- permissions.createOrder,
permissions.createOwnTag,
permissions.createWatchlistItem,
permissions.deleteAccess,
permissions.deleteAccount,
permissions.deleteAccountBalance,
+ permissions.deleteActivity,
permissions.deleteAuthDevice,
- permissions.deleteOrder,
permissions.deleteWatchlistItem,
permissions.readAiPrompt,
permissions.readMarketDataOfOwnAssetProfile,
@@ -141,9 +142,9 @@ export function getPermissions(aRole: Role): string[] {
permissions.readWatchlist,
permissions.updateAccount,
permissions.updateAccess,
+ permissions.updateActivity,
permissions.updateAuthDevice,
permissions.updateMarketDataOfOwnAssetProfile,
- permissions.updateOrder,
permissions.updateUserSettings,
permissions.updateViewMode
];
@@ -194,7 +195,7 @@ export function hasReadRestrictedAccessPermission({
return false;
}
- const access = user.accessesGet?.find(({ id }) => {
+ const access = user?.accessesGet?.find(({ id }) => {
return id === impersonationId;
});
diff --git a/libs/common/src/lib/personal-finance-tools.ts b/libs/common/src/lib/personal-finance-tools.ts
index 6d0a85fb2..063b4254c 100644
--- a/libs/common/src/lib/personal-finance-tools.ts
+++ b/libs/common/src/lib/personal-finance-tools.ts
@@ -33,6 +33,15 @@ export const personalFinanceTools: Product[] = [
origin: 'Switzerland',
slogan: 'Simplicity for Complex Wealth'
},
+ {
+ founded: 2018,
+ hasFreePlan: false,
+ hasSelfHostingAbility: false,
+ key: 'altruist',
+ name: 'Altruist',
+ origin: 'United States',
+ slogan: 'The wealth platform built for independent advisors'
+ },
{
founded: 2023,
hasFreePlan: false,
@@ -116,6 +125,17 @@ export const personalFinanceTools: Product[] = [
origin: 'Switzerland',
slogan: 'Schweizer Budget App für einfache & smarte Budgetplanung'
},
+ {
+ founded: 2015,
+ hasFreePlan: true,
+ hasSelfHostingAbility: false,
+ key: 'boldin',
+ name: 'Boldin',
+ note: 'Originally named as NewRetirement',
+ origin: 'United States',
+ pricingPerYear: '$144',
+ slogan: 'Take control with retirement planning tools that begin with you'
+ },
{
key: 'budgetpulse',
name: 'BudgetPulse',
@@ -841,6 +861,16 @@ export const personalFinanceTools: Product[] = [
pricingPerYear: '$108',
slogan: 'Build Financial Plans You Love.'
},
+ {
+ founded: 2022,
+ hasFreePlan: false,
+ hasSelfHostingAbility: false,
+ key: 'prostocktracker',
+ name: 'Pro Stock Tracker',
+ origin: 'United Kingdom',
+ pricingPerYear: '$60',
+ slogan: 'The stock portfolio tracker built for long-term investors'
+ },
{
founded: 2015,
hasSelfHostingAbility: false,
@@ -1014,6 +1044,16 @@ export const personalFinanceTools: Product[] = [
regions: ['Austria', 'Germany', 'Switzerland'],
slogan: 'Dein Vermögen immer im Blick'
},
+ {
+ founded: 2025,
+ hasFreePlan: false,
+ hasSelfHostingAbility: false,
+ key: 'turbobulls',
+ name: 'Turbobulls',
+ origin: 'Romania',
+ pricingPerYear: '€39.99',
+ slogan: 'Your complete financial dashboard. Actually private.'
+ },
{
hasFreePlan: true,
hasSelfHostingAbility: false,
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 25fad683d..6b58e6aec 100644
--- a/libs/ui/src/lib/activities-filter/activities-filter.component.ts
+++ b/libs/ui/src/lib/activities-filter/activities-filter.component.ts
@@ -7,6 +7,7 @@ import {
CUSTOM_ELEMENTS_SCHEMA,
ChangeDetectionStrategy,
Component,
+ DestroyRef,
ElementRef,
Input,
OnChanges,
@@ -69,9 +70,9 @@ export class GfActivitiesFilterComponent implements OnChanges {
protected selectedFilters: Filter[] = [];
protected readonly separatorKeysCodes: number[] = [ENTER, COMMA];
- public constructor() {
+ public constructor(private destroyRef: DestroyRef) {
this.searchControl.valueChanges
- .pipe(takeUntilDestroyed())
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((filterOrSearchTerm) => {
if (filterOrSearchTerm) {
const searchTerm =
diff --git a/libs/ui/src/lib/activities-table/activities-table.component.html b/libs/ui/src/lib/activities-table/activities-table.component.html
index bdb1e6373..b8fe962d7 100644
--- a/libs/ui/src/lib/activities-table/activities-table.component.html
+++ b/libs/ui/src/lib/activities-table/activities-table.component.html
@@ -1,77 +1,101 @@
-@if (hasPermissionToCreateActivity) {
-
-
-
- Import Activities ...
-
- @if (hasPermissionToExportActivities) {
-
-
-
+
+
+ @if (hasPermissionToFilterByType) {
+
+ Type
+
+ @for (
+ activityType of activityTypesTranslationMap | keyvalue;
+ track activityType.key
+ ) {
+
+ {{ activityType.value }}
+
+ }
+
+
}
-
+
+
+ @if (hasPermissionToCreateActivity) {
+
-
-
- Import Dividends ...
-
+
+ Import Activities ...
@if (hasPermissionToExportActivities) {
+
+
+ }
+
+
-
- Export Activities
+
+ Import Dividends ...
- }
- @if (hasPermissionToExportActivities) {
+ @if (hasPermissionToExportActivities) {
+
+
+
+ Export Activities
+
+
+ }
+ @if (hasPermissionToExportActivities) {
+
+
+
+ Export Drafts as ICS
+
+
+ }
+
-
- Export Drafts as ICS
+
+ Delete Activities
- }
-
-
-
-
- Delete Activities
-
-
-
-
-}
+
+
+ }
+
();
@Output() selectedActivities = new EventEmitter();
@Output() sortChanged = new EventEmitter();
+ @Output() typesFilterChanged = new EventEmitter();
@ViewChild(MatPaginator) paginator: MatPaginator;
@ViewChild(MatSort) sort: MatSort;
+ public activityTypesTranslationMap = new Map();
public hasDrafts = false;
public hasErrors = false;
public isUUID = isUUID;
public selectedRows = new SelectionModel(true, []);
+ public typesFilter = new FormControl([]);
public readonly dataSource = input.required<
MatTableDataSource | undefined
@@ -186,9 +196,15 @@ export class GfActivitiesTableComponent
});
private readonly notificationService = inject(NotificationService);
- private readonly unsubscribeSubject = new Subject();
- public constructor() {
+ public constructor(private destroyRef: DestroyRef) {
+ for (const type of Object.keys(ActivityType) as ActivityType[]) {
+ this.activityTypesTranslationMap.set(
+ ActivityType[type],
+ translate(ActivityType[type])
+ );
+ }
+
addIcons({
alertCircleOutline,
calendarClearOutline,
@@ -209,11 +225,17 @@ export class GfActivitiesTableComponent
if (this.showCheckbox()) {
this.toggleAllRows();
this.selectedRows.changed
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((selectedRows) => {
this.selectedActivities.emit(selectedRows.source.selected);
});
}
+
+ this.typesFilter.valueChanges
+ .pipe(takeUntilDestroyed(this.destroyRef))
+ .subscribe((types) => {
+ this.typesFilterChanged.emit(types ?? []);
+ });
}
public ngAfterViewInit() {
@@ -342,9 +364,4 @@ export class GfActivitiesTableComponent
this.selectedActivities.emit(this.selectedRows.selected);
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/libs/ui/src/lib/assistant/assistant.html b/libs/ui/src/lib/assistant/assistant.html
index 7e19833a9..79e2f31a1 100644
--- a/libs/ui/src/lib/assistant/assistant.html
+++ b/libs/ui/src/lib/assistant/assistant.html
@@ -197,7 +197,7 @@
mat-button
type="button"
[disabled]="
- !portfolioFilterForm.hasFilters() || portfolioFilterForm.disabled
+ !portfolioFilterForm.hasFilters() || portfolioFilterForm.disabled()
"
(click)="onResetFilters()"
>
@@ -210,7 +210,7 @@
type="button"
[disabled]="
!portfolioFilterForm.filterForm.dirty ||
- portfolioFilterForm.disabled
+ portfolioFilterForm.disabled()
"
(click)="onApplyFilters()"
>
diff --git a/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts b/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts
index 2f4c18288..0c75b5954 100644
--- a/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts
+++ b/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts
@@ -12,18 +12,17 @@ import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
+ DestroyRef,
Inject,
- OnDestroy,
OnInit
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import {
MAT_DIALOG_DATA,
MatDialogModule,
MatDialogRef
} from '@angular/material/dialog';
import { format } from 'date-fns';
-import { Subject } from 'rxjs';
-import { takeUntil } from 'rxjs/operators';
import { GfLineChartComponent } from '../../line-chart/line-chart.component';
import { GfValueComponent } from '../../value/value.component';
@@ -44,16 +43,15 @@ import { BenchmarkDetailDialogParams } from './interfaces/interfaces';
styleUrls: ['./benchmark-detail-dialog.component.scss'],
templateUrl: 'benchmark-detail-dialog.html'
})
-export class GfBenchmarkDetailDialogComponent implements OnDestroy, OnInit {
+export class GfBenchmarkDetailDialogComponent implements OnInit {
public assetProfile: AdminMarketDataDetails['assetProfile'];
public historicalDataItems: LineChartItem[];
public value: number;
- private unsubscribeSubject = new Subject();
-
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
+ private destroyRef: DestroyRef,
public dialogRef: MatDialogRef,
@Inject(MAT_DIALOG_DATA) public data: BenchmarkDetailDialogParams
) {}
@@ -64,7 +62,7 @@ export class GfBenchmarkDetailDialogComponent implements OnDestroy, OnInit {
dataSource: this.data.dataSource,
symbol: this.data.symbol
})
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ assetProfile, marketData }) => {
this.assetProfile = assetProfile;
@@ -88,9 +86,4 @@ export class GfBenchmarkDetailDialogComponent implements OnDestroy, OnInit {
public onClose() {
this.dialogRef.close();
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/libs/ui/src/lib/benchmark/benchmark-detail-dialog/interfaces/interfaces.ts b/libs/ui/src/lib/benchmark/benchmark-detail-dialog/interfaces/interfaces.ts
index 291f4c973..b01403284 100644
--- a/libs/ui/src/lib/benchmark/benchmark-detail-dialog/interfaces/interfaces.ts
+++ b/libs/ui/src/lib/benchmark/benchmark-detail-dialog/interfaces/interfaces.ts
@@ -3,7 +3,7 @@ import { ColorScheme } from '@ghostfolio/common/types';
import { DataSource } from '@prisma/client';
export interface BenchmarkDetailDialogParams {
- colorScheme: ColorScheme;
+ colorScheme?: ColorScheme;
dataSource: DataSource;
deviceType: string;
locale: string;
diff --git a/libs/ui/src/lib/benchmark/benchmark.component.html b/libs/ui/src/lib/benchmark/benchmark.component.html
index ab6db8887..8820f2ec1 100644
--- a/libs/ui/src/lib/benchmark/benchmark.component.html
+++ b/libs/ui/src/lib/benchmark/benchmark.component.html
@@ -15,7 +15,7 @@
{{ element?.name }}
- @if (showSymbol) {
+ @if (showSymbol()) {
{{ element?.symbol }}
@@ -98,7 +98,7 @@
@if (element?.performances?.allTimeHigh?.date) {
}
@@ -123,7 +123,7 @@
- @if (hasPermissionToDeleteItem) {
+ @if (hasPermissionToDeleteItem()) {
-
+
-} @else if (benchmarks?.length === 0) {
+} @else if (benchmarks()?.length === 0) {
No data available
diff --git a/libs/ui/src/lib/benchmark/benchmark.component.ts b/libs/ui/src/lib/benchmark/benchmark.component.ts
index adef1f41b..5dbc4648b 100644
--- a/libs/ui/src/lib/benchmark/benchmark.component.ts
+++ b/libs/ui/src/lib/benchmark/benchmark.component.ts
@@ -16,13 +16,15 @@ import {
CUSTOM_ELEMENTS_SCHEMA,
ChangeDetectionStrategy,
Component,
- EventEmitter,
- Input,
- OnChanges,
- OnDestroy,
- Output,
- ViewChild
+ DestroyRef,
+ computed,
+ effect,
+ inject,
+ input,
+ output,
+ viewChild
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MatDialog } from '@angular/material/dialog';
import { MatMenuModule } from '@angular/material/menu';
@@ -34,7 +36,6 @@ import { addIcons } from 'ionicons';
import { ellipsisHorizontal, trashOutline } from 'ionicons/icons';
import { isNumber } from 'lodash';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
-import { Subject, takeUntil } from 'rxjs';
import { translate } from '../i18n';
import { GfTrendIndicatorComponent } from '../trend-indicator/trend-indicator.component';
@@ -61,41 +62,58 @@ import { BenchmarkDetailDialogParams } from './benchmark-detail-dialog/interface
styleUrls: ['./benchmark.component.scss'],
templateUrl: './benchmark.component.html'
})
-export class GfBenchmarkComponent implements OnChanges, OnDestroy {
- @Input() benchmarks: Benchmark[];
- @Input() deviceType: string;
- @Input() hasPermissionToDeleteItem: boolean;
- @Input() locale = getLocale();
- @Input() showSymbol = true;
- @Input() user: User;
-
- @Output() itemDeleted = new EventEmitter();
-
- @ViewChild(MatSort) sort: MatSort;
-
- public dataSource = new MatTableDataSource([]);
- public displayedColumns = [
- 'name',
- 'date',
- 'change',
- 'marketCondition',
- 'actions'
- ];
- public isLoading = true;
- public isNumber = isNumber;
- public resolveMarketCondition = resolveMarketCondition;
- public translate = translate;
-
- private unsubscribeSubject = new Subject();
-
- public constructor(
- private dialog: MatDialog,
- private notificationService: NotificationService,
- private route: ActivatedRoute,
- private router: Router
- ) {
+export class GfBenchmarkComponent {
+ public readonly benchmarks = input.required();
+ public readonly deviceType = input.required();
+ public readonly hasPermissionToDeleteItem = input();
+ public readonly locale = input(getLocale());
+ public readonly showSymbol = input(true);
+ public readonly user = input();
+
+ public readonly itemDeleted = output();
+
+ protected readonly sort = viewChild(MatSort);
+
+ protected readonly dataSource = new MatTableDataSource([]);
+ protected readonly displayedColumns = computed(() => {
+ return [
+ 'name',
+ ...(this.user()?.settings?.isExperimentalFeatures
+ ? ['trend50d', 'trend200d']
+ : []),
+ 'date',
+ 'change',
+ 'marketCondition',
+ 'actions'
+ ];
+ });
+ protected isLoading = true;
+ protected readonly isNumber = isNumber;
+ protected readonly resolveMarketCondition = resolveMarketCondition;
+ protected readonly translate = translate;
+
+ private readonly destroyRef = inject(DestroyRef);
+ private readonly dialog = inject(MatDialog);
+ private readonly notificationService = inject(NotificationService);
+ private readonly route = inject(ActivatedRoute);
+ private readonly router = inject(Router);
+
+ public constructor() {
+ effect(() => {
+ const benchmarks = this.benchmarks();
+
+ if (benchmarks) {
+ this.dataSource.data = benchmarks;
+ this.dataSource.sortingDataAccessor = getLowercase;
+
+ this.dataSource.sort = this.sort() ?? null;
+
+ this.isLoading = false;
+ }
+ });
+
this.route.queryParams
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((params) => {
if (
params['benchmarkDetailDialog'] &&
@@ -112,30 +130,7 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy {
addIcons({ ellipsisHorizontal, trashOutline });
}
- public ngOnChanges() {
- if (this.benchmarks) {
- this.dataSource.data = this.benchmarks;
- this.dataSource.sortingDataAccessor = getLowercase;
-
- this.dataSource.sort = this.sort;
-
- this.isLoading = false;
- }
-
- if (this.user?.settings?.isExperimentalFeatures) {
- this.displayedColumns = [
- 'name',
- 'trend50d',
- 'trend200d',
- 'date',
- 'change',
- 'marketCondition',
- 'actions'
- ];
- }
- }
-
- public onDeleteItem({ dataSource, symbol }: AssetProfileIdentifier) {
+ protected onDeleteItem({ dataSource, symbol }: AssetProfileIdentifier) {
this.notificationService.confirm({
confirmFn: () => {
this.itemDeleted.emit({ dataSource, symbol });
@@ -145,17 +140,15 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy {
});
}
- public onOpenBenchmarkDialog({ dataSource, symbol }: AssetProfileIdentifier) {
+ protected onOpenBenchmarkDialog({
+ dataSource,
+ symbol
+ }: AssetProfileIdentifier) {
this.router.navigate([], {
queryParams: { dataSource, symbol, benchmarkDetailDialog: true }
});
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private openBenchmarkDetailDialog({
dataSource,
symbol
@@ -167,17 +160,17 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy {
data: {
dataSource,
symbol,
- colorScheme: this.user?.settings?.colorScheme,
- deviceType: this.deviceType,
- locale: this.locale
+ colorScheme: this.user()?.settings?.colorScheme,
+ deviceType: this.deviceType(),
+ locale: this.locale()
},
- height: this.deviceType === 'mobile' ? '98vh' : undefined,
- width: this.deviceType === 'mobile' ? '100vw' : '50rem'
+ height: this.deviceType() === 'mobile' ? '98vh' : undefined,
+ width: this.deviceType() === 'mobile' ? '100vw' : '50rem'
});
dialogRef
.afterClosed()
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.router.navigate(['.'], { relativeTo: this.route });
});
diff --git a/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts b/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
index 8b472fc47..c8e281609 100644
--- a/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
+++ b/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
@@ -12,12 +12,13 @@ import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
+ DestroyRef,
ElementRef,
Input,
OnChanges,
OnDestroy,
- ViewChild,
- output
+ output,
+ viewChild
} from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import {
@@ -55,7 +56,7 @@ import {
startOfMonth,
sub
} from 'date-fns';
-import { isNil, isNumber } from 'lodash';
+import { isNumber } from 'lodash';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { debounceTime } from 'rxjs';
@@ -90,8 +91,6 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
@Input() retirementDate: Date;
@Input() savingsRate = 0;
- @ViewChild('chartCanvas') chartCanvas: ElementRef;
-
public calculatorForm = this.formBuilder.group({
annualInterestRate: new FormControl(null),
paymentPerPeriod: new FormControl(null),
@@ -99,25 +98,33 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
projectedTotalAmount: new FormControl(null),
retirementDate: new FormControl(null)
});
+
public chart: Chart<'bar'>;
public isLoading = true;
public minDate = addDays(new Date(), 1);
public periodsToRetire = 0;
protected readonly annualInterestRateChanged = output();
+
protected readonly calculationCompleted =
output();
+
protected readonly projectedTotalAmountChanged = output();
protected readonly retirementDateChanged = output();
protected readonly savingsRateChanged = output();
private readonly CONTRIBUTION_PERIOD = 12;
+
private readonly DEFAULT_RETIREMENT_DATE = startOfMonth(
addYears(new Date(), 10)
);
+ private readonly chartCanvas =
+ viewChild.required>('chartCanvas');
+
public constructor(
private changeDetectorRef: ChangeDetectorRef,
+ private destroyRef: DestroyRef,
private fireCalculatorService: FireCalculatorService,
private formBuilder: FormBuilder
) {
@@ -130,13 +137,13 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
);
this.calculatorForm.valueChanges
- .pipe(takeUntilDestroyed())
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.initialize();
});
this.calculatorForm.valueChanges
- .pipe(debounceTime(500), takeUntilDestroyed())
+ .pipe(debounceTime(500), takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
const { projectedTotalAmount, retirementDate } =
this.calculatorForm.getRawValue();
@@ -151,7 +158,10 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
this.calculatorForm
.get('annualInterestRate')
- ?.valueChanges.pipe(debounceTime(500), takeUntilDestroyed())
+ ?.valueChanges.pipe(
+ debounceTime(500),
+ takeUntilDestroyed(this.destroyRef)
+ )
.subscribe((annualInterestRate) => {
if (annualInterestRate !== null) {
this.annualInterestRateChanged.emit(annualInterestRate);
@@ -159,7 +169,10 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
});
this.calculatorForm
.get('paymentPerPeriod')
- ?.valueChanges.pipe(debounceTime(500), takeUntilDestroyed())
+ ?.valueChanges.pipe(
+ debounceTime(500),
+ takeUntilDestroyed(this.destroyRef)
+ )
.subscribe((savingsRate) => {
if (savingsRate !== null) {
this.savingsRateChanged.emit(savingsRate);
@@ -167,7 +180,10 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
});
this.calculatorForm
.get('projectedTotalAmount')
- ?.valueChanges.pipe(debounceTime(500), takeUntilDestroyed())
+ ?.valueChanges.pipe(
+ debounceTime(500),
+ takeUntilDestroyed(this.destroyRef)
+ )
.subscribe((projectedTotalAmount) => {
if (projectedTotalAmount !== null) {
this.projectedTotalAmountChanged.emit(projectedTotalAmount);
@@ -175,7 +191,10 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
});
this.calculatorForm
.get('retirementDate')
- ?.valueChanges.pipe(debounceTime(500), takeUntilDestroyed())
+ ?.valueChanges.pipe(
+ debounceTime(500),
+ takeUntilDestroyed(this.destroyRef)
+ )
.subscribe((retirementDate) => {
if (retirementDate !== null) {
this.retirementDateChanged.emit(retirementDate);
@@ -272,7 +291,7 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
const chartData = this.getChartData();
- if (this.chartCanvas) {
+ if (this.chartCanvas()) {
if (this.chart) {
this.chart.data.labels = chartData.labels;
@@ -282,7 +301,7 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
this.chart.update();
} else {
- this.chart = new Chart<'bar'>(this.chartCanvas.nativeElement, {
+ this.chart = new Chart<'bar'>(this.chartCanvas().nativeElement, {
data: chartData,
options: {
plugins: {
@@ -303,7 +322,7 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
}).format(totalAmount)}`;
},
label: (context) => {
- let label = context.dataset.label || '';
+ let label = context.dataset.label ?? '';
if (label) {
label += ': ';
@@ -473,7 +492,7 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
'projectedTotalAmount'
)?.value;
- if (!isNil(projectedTotalAmount)) {
+ if (projectedTotalAmount) {
return projectedTotalAmount;
}
diff --git a/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.component.ts b/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.component.ts
index 3e5e3b2e9..1b7b99fa2 100644
--- a/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.component.ts
+++ b/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.component.ts
@@ -25,6 +25,7 @@ import { MatInputModule } from '@angular/material/input';
import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { calendarClearOutline, refreshOutline } from 'ionicons/icons';
+import { isNil } from 'lodash';
import { HistoricalMarketDataEditorDialogParams } from './interfaces/interfaces';
@@ -90,7 +91,9 @@ export class GfHistoricalMarketDataEditorDialogComponent implements OnInit {
}
public onUpdate() {
- if (this.marketPrice() === undefined) {
+ const marketPrice = this.marketPrice();
+
+ if (isNil(marketPrice)) {
return;
}
@@ -100,8 +103,8 @@ export class GfHistoricalMarketDataEditorDialogComponent implements OnInit {
marketData: {
marketData: [
{
- date: this.data.dateString,
- marketPrice: this.marketPrice()
+ marketPrice,
+ date: this.data.dateString
}
]
},
diff --git a/libs/ui/src/lib/holdings-table/holdings-table.component.html b/libs/ui/src/lib/holdings-table/holdings-table.component.html
index 250eff578..3bb387ae4 100644
--- a/libs/ui/src/lib/holdings-table/holdings-table.component.html
+++ b/libs/ui/src/lib/holdings-table/holdings-table.component.html
@@ -193,7 +193,7 @@
-
+
@if (isLoading()) {
}
-@if (dataSource.data.length > pageSize && !isLoading()) {
+@if (dataSource.data.length > pageSize() && !isLoading()) {
Show all
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 bea555a0b..cc1a248e8 100644
--- a/libs/ui/src/lib/holdings-table/holdings-table.component.ts
+++ b/libs/ui/src/lib/holdings-table/holdings-table.component.ts
@@ -9,12 +9,11 @@ import {
CUSTOM_ELEMENTS_SCHEMA,
ChangeDetectionStrategy,
Component,
- EventEmitter,
- Input,
- Output,
computed,
effect,
input,
+ model,
+ output,
viewChild
} from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
@@ -47,17 +46,17 @@ import { GfValueComponent } from '../value/value.component';
templateUrl: './holdings-table.component.html'
})
export class GfHoldingsTableComponent {
- @Input() pageSize = Number.MAX_SAFE_INTEGER;
-
- @Output() holdingClicked = new EventEmitter();
-
public readonly hasPermissionToOpenDetails = input(true);
public readonly hasPermissionToShowQuantities = input(true);
public readonly hasPermissionToShowValues = input(true);
public readonly holdings = input.required();
public readonly locale = input(getLocale());
- public readonly paginator = viewChild.required(MatPaginator);
- public readonly sort = viewChild.required(MatSort);
+ public readonly pageSize = model(Number.MAX_SAFE_INTEGER);
+
+ public readonly holdingClicked = output();
+
+ protected readonly paginator = viewChild.required(MatPaginator);
+ protected readonly sort = viewChild.required(MatSort);
protected readonly dataSource = new MatTableDataSource([]);
@@ -106,7 +105,7 @@ export class GfHoldingsTableComponent {
protected canShowDetails(holding: PortfolioPosition): boolean {
return (
this.hasPermissionToOpenDetails() &&
- !this.ignoreAssetSubClasses.includes(holding.assetSubClass)
+ !this.ignoreAssetSubClasses.includes(holding.assetProfile.assetSubClass)
);
}
@@ -118,7 +117,7 @@ export class GfHoldingsTableComponent {
}
protected onShowAllHoldings() {
- this.pageSize = Number.MAX_SAFE_INTEGER;
+ this.pageSize.set(Number.MAX_SAFE_INTEGER);
setTimeout(() => {
this.dataSource.paginator = this.paginator();
diff --git a/libs/ui/src/lib/mocks/holdings.ts b/libs/ui/src/lib/mocks/holdings.ts
index 5ab3e89eb..b32eb527a 100644
--- a/libs/ui/src/lib/mocks/holdings.ts
+++ b/libs/ui/src/lib/mocks/holdings.ts
@@ -6,14 +6,36 @@ export const holdings: PortfolioPosition[] = [
allocationInPercentage: 0.042990776363386086,
assetClass: 'EQUITY',
assetClassLabel: 'Equity',
+ assetProfile: {
+ assetClass: 'EQUITY',
+ assetSubClass: 'STOCK',
+ countries: [
+ {
+ code: 'US',
+ continent: 'North America',
+ name: 'United States',
+ weight: 1
+ }
+ ],
+ currency: 'USD',
+ dataSource: 'YAHOO',
+ holdings: [],
+ sectors: [
+ {
+ name: 'Technology',
+ weight: 1
+ }
+ ],
+ symbol: 'AAPL'
+ },
assetSubClass: 'STOCK',
assetSubClassLabel: 'Stock',
countries: [
{
code: 'US',
- weight: 1,
continent: 'North America',
- name: 'United States'
+ name: 'United States',
+ weight: 1
}
],
currency: 'USD',
@@ -49,14 +71,36 @@ export const holdings: PortfolioPosition[] = [
allocationInPercentage: 0.02377401948293552,
assetClass: 'EQUITY',
assetClassLabel: 'Equity',
+ assetProfile: {
+ assetClass: 'EQUITY',
+ assetSubClass: 'STOCK',
+ countries: [
+ {
+ code: 'DE',
+ continent: 'Europe',
+ name: 'Germany',
+ weight: 1
+ }
+ ],
+ currency: 'EUR',
+ dataSource: 'YAHOO',
+ holdings: [],
+ sectors: [
+ {
+ name: 'Financial Services',
+ weight: 1
+ }
+ ],
+ symbol: 'ALV.DE'
+ },
assetSubClass: 'STOCK',
assetSubClassLabel: 'Stock',
countries: [
{
code: 'DE',
- weight: 1,
continent: 'Europe',
- name: 'Germany'
+ name: 'Germany',
+ weight: 1
}
],
currency: 'EUR',
@@ -92,14 +136,36 @@ export const holdings: PortfolioPosition[] = [
allocationInPercentage: 0.08038536990007467,
assetClass: 'EQUITY',
assetClassLabel: 'Equity',
+ assetProfile: {
+ assetClass: 'EQUITY',
+ assetSubClass: 'STOCK',
+ countries: [
+ {
+ code: 'US',
+ continent: 'North America',
+ name: 'United States',
+ weight: 1
+ }
+ ],
+ currency: 'USD',
+ dataSource: 'YAHOO',
+ holdings: [],
+ sectors: [
+ {
+ name: 'Consumer Discretionary',
+ weight: 1
+ }
+ ],
+ symbol: 'AMZN'
+ },
assetSubClass: 'STOCK',
assetSubClassLabel: 'Stock',
countries: [
{
code: 'US',
- weight: 1,
continent: 'North America',
- name: 'United States'
+ name: 'United States',
+ weight: 1
}
],
currency: 'USD',
@@ -135,6 +201,16 @@ export const holdings: PortfolioPosition[] = [
allocationInPercentage: 0.19216416482928922,
assetClass: 'LIQUIDITY',
assetClassLabel: 'Liquidity',
+ assetProfile: {
+ assetClass: 'LIQUIDITY',
+ assetSubClass: 'CASH',
+ countries: [],
+ currency: 'USD',
+ dataSource: 'COINGECKO',
+ holdings: [],
+ sectors: [],
+ symbol: 'bitcoin'
+ },
assetSubClass: 'CRYPTOCURRENCY',
assetSubClassLabel: 'Cryptocurrency',
countries: [],
@@ -166,14 +242,36 @@ export const holdings: PortfolioPosition[] = [
allocationInPercentage: 0.04307127421937313,
assetClass: 'EQUITY',
assetClassLabel: 'Equity',
+ assetProfile: {
+ assetClass: 'EQUITY',
+ assetSubClass: 'STOCK',
+ countries: [
+ {
+ code: 'US',
+ continent: 'North America',
+ name: 'United States',
+ weight: 1
+ }
+ ],
+ currency: 'USD',
+ dataSource: 'YAHOO',
+ holdings: [],
+ sectors: [
+ {
+ name: 'Technology',
+ weight: 1
+ }
+ ],
+ symbol: 'MSFT'
+ },
assetSubClass: 'STOCK',
assetSubClassLabel: 'Stock',
countries: [
{
code: 'US',
- weight: 1,
continent: 'North America',
- name: 'United States'
+ name: 'United States',
+ weight: 1
}
],
currency: 'USD',
@@ -209,14 +307,36 @@ export const holdings: PortfolioPosition[] = [
allocationInPercentage: 0.18762679306394897,
assetClass: 'EQUITY',
assetClassLabel: 'Equity',
+ assetProfile: {
+ assetClass: 'EQUITY',
+ assetSubClass: 'STOCK',
+ countries: [
+ {
+ code: 'US',
+ continent: 'North America',
+ name: 'United States',
+ weight: 1
+ }
+ ],
+ currency: 'USD',
+ dataSource: 'YAHOO',
+ holdings: [],
+ sectors: [
+ {
+ name: 'Consumer Discretionary',
+ weight: 1
+ }
+ ],
+ symbol: 'TSLA'
+ },
assetSubClass: 'STOCK',
assetSubClassLabel: 'Stock',
countries: [
{
code: 'US',
- weight: 1,
continent: 'North America',
- name: 'United States'
+ name: 'United States',
+ weight: 1
}
],
currency: 'USD',
@@ -252,6 +372,28 @@ export const holdings: PortfolioPosition[] = [
allocationInPercentage: 0.053051250766657634,
assetClass: 'EQUITY',
assetClassLabel: 'Equity',
+ assetProfile: {
+ assetClass: 'EQUITY',
+ assetSubClass: 'ETF',
+ countries: [
+ {
+ code: 'US',
+ continent: 'North America',
+ name: 'United States',
+ weight: 1
+ }
+ ],
+ currency: 'USD',
+ dataSource: 'YAHOO',
+ holdings: [],
+ sectors: [
+ {
+ name: 'Equity',
+ weight: 1
+ }
+ ],
+ symbol: 'VTI'
+ },
assetSubClass: 'ETF',
assetSubClassLabel: 'ETF',
countries: [
diff --git a/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts b/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts
index 8691dc998..9ca91d111 100644
--- a/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts
+++ b/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts
@@ -24,5 +24,5 @@ export class GfNoTransactionsInfoComponent {
@HostBinding('class.has-border') @Input() hasBorder = true;
public routerLinkPortfolioActivities =
- internalRoutes.portfolio.subRoutes.activities.routerLink;
+ internalRoutes.portfolio.subRoutes?.activities.routerLink;
}
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 7d0203e9c..2f5d9e4f7 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
@@ -13,12 +13,11 @@ import {
ChangeDetectionStrategy,
Component,
ElementRef,
- EventEmitter,
Input,
OnChanges,
OnDestroy,
- Output,
- ViewChild
+ output,
+ viewChild
} from '@angular/core';
import { DataSource } from '@prisma/client';
import { Big } from 'big.js';
@@ -81,15 +80,16 @@ export class GfPortfolioProportionChartComponent
@Input() maxItems?: number;
@Input() showLabels = false;
- @Output() proportionChartClicked = new EventEmitter();
-
- @ViewChild('chartCanvas') chartCanvas: ElementRef;
-
public chart: Chart<'doughnut'>;
public isLoading = true;
+ protected readonly proportionChartClicked = output();
+
private readonly OTHER_KEY = 'OTHER';
+ private readonly chartCanvas =
+ viewChild.required>('chartCanvas');
+
private colorMap: {
[symbol: string]: string;
} = {};
@@ -130,45 +130,45 @@ export class GfPortfolioProportionChartComponent
};
if (this.keys.length > 0) {
+ const primaryKey = this.keys[0];
+ const secondaryKey = this.keys[1];
+
Object.keys(this.data).forEach((symbol) => {
- if (this.data[symbol][this.keys[0]]?.toUpperCase()) {
- if (chartData[this.data[symbol][this.keys[0]].toUpperCase()]) {
- chartData[this.data[symbol][this.keys[0]].toUpperCase()].value =
- chartData[
- this.data[symbol][this.keys[0]].toUpperCase()
- ].value.plus(this.data[symbol].value || 0);
-
- if (
- chartData[this.data[symbol][this.keys[0]].toUpperCase()]
- .subCategory[this.data[symbol][this.keys[1]]]
- ) {
- chartData[
- this.data[symbol][this.keys[0]].toUpperCase()
- ].subCategory[this.data[symbol][this.keys[1]]].value = chartData[
- this.data[symbol][this.keys[0]].toUpperCase()
- ].subCategory[this.data[symbol][this.keys[1]]].value.plus(
- this.data[symbol].value || 0
- );
+ const asset = this.data[symbol];
+ const assetValue = asset.value || 0;
+ const primaryKeyValue = (asset[primaryKey] as string)?.toUpperCase();
+ const secondaryKeyValue = asset[secondaryKey] as string;
+
+ if (primaryKeyValue) {
+ if (chartData[primaryKeyValue]) {
+ chartData[primaryKeyValue].value =
+ chartData[primaryKeyValue].value.plus(assetValue);
+
+ const targetSubCategory =
+ chartData[primaryKeyValue].subCategory?.[secondaryKeyValue];
+ if (targetSubCategory) {
+ targetSubCategory.value =
+ targetSubCategory.value.plus(assetValue);
} else {
- chartData[
- this.data[symbol][this.keys[0]].toUpperCase()
- ].subCategory[this.data[symbol][this.keys[1]] ?? UNKNOWN_KEY] = {
- value: new Big(this.data[symbol].value || 0)
- };
+ if (chartData[primaryKeyValue].subCategory) {
+ chartData[primaryKeyValue].subCategory[
+ secondaryKeyValue ?? UNKNOWN_KEY
+ ] = {
+ value: new Big(assetValue)
+ };
+ }
}
} else {
- chartData[this.data[symbol][this.keys[0]].toUpperCase()] = {
- name: this.data[symbol][this.keys[0]],
+ chartData[primaryKeyValue] = {
+ name: asset[primaryKey] as string,
subCategory: {},
- value: new Big(this.data[symbol].value || 0)
+ value: new Big(assetValue)
};
- if (this.data[symbol][this.keys[1]]) {
- chartData[
- this.data[symbol][this.keys[0]].toUpperCase()
- ].subCategory = {
- [this.data[symbol][this.keys[1]]]: {
- value: new Big(this.data[symbol].value || 0)
+ if (secondaryKeyValue) {
+ chartData[primaryKeyValue].subCategory = {
+ [secondaryKeyValue]: {
+ value: new Big(assetValue)
}
};
}
@@ -181,10 +181,10 @@ export class GfPortfolioProportionChartComponent
} else {
chartData[UNKNOWN_KEY] = {
name: this.data[symbol].name,
- subCategory: this.keys[1]
- ? { [this.keys[1]]: { value: new Big(0) } }
+ subCategory: secondaryKey
+ ? { [secondaryKey]: { value: new Big(0) } }
: undefined,
- value: new Big(this.data[symbol].value || 0)
+ value: new Big(assetValue)
};
}
}
@@ -278,13 +278,15 @@ export class GfPortfolioProportionChartComponent
Object.keys(item.subCategory ?? {}).forEach((subCategory) => {
if (item.name === UNKNOWN_KEY) {
- backgroundColorSubCategory.push(item.color);
+ backgroundColorSubCategory.push(item.color ?? '');
} else {
backgroundColorSubCategory.push(
Color(item.color).lighten(lightnessRatio).hex()
);
}
- dataSubCategory.push(item.subCategory[subCategory].value.toNumber());
+ dataSubCategory.push(
+ item.subCategory?.[subCategory].value.toNumber() ?? 0
+ );
labelSubCategory.push(subCategory);
lightnessRatio += 0.1;
@@ -334,7 +336,7 @@ export class GfPortfolioProportionChartComponent
labels
};
- if (this.chartCanvas) {
+ if (this.chartCanvas()) {
if (this.chart) {
this.chart.data = data;
this.chart.options.plugins ??= {};
@@ -343,7 +345,7 @@ export class GfPortfolioProportionChartComponent
this.chart.update();
} else {
- this.chart = new Chart<'doughnut'>(this.chartCanvas.nativeElement, {
+ this.chart = new Chart<'doughnut'>(this.chartCanvas().nativeElement, {
data,
options: {
animation: false,
diff --git a/libs/ui/src/lib/services/admin.service.ts b/libs/ui/src/lib/services/admin.service.ts
index 145f134e3..094001c2f 100644
--- a/libs/ui/src/lib/services/admin.service.ts
+++ b/libs/ui/src/lib/services/admin.service.ts
@@ -21,24 +21,24 @@ import {
Filter
} from '@ghostfolio/common/interfaces';
import { DateRange } from '@ghostfolio/common/types';
-import { GF_ENVIRONMENT, GfEnvironment } from '@ghostfolio/ui/environment';
-import { DataService } from '@ghostfolio/ui/services';
+import { GF_ENVIRONMENT } from '@ghostfolio/ui/environment';
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
-import { Inject, Injectable } from '@angular/core';
+import { Injectable, inject } from '@angular/core';
import { SortDirection } from '@angular/material/sort';
import { DataSource, MarketData, Platform } from '@prisma/client';
import { JobStatus } from 'bull';
+import { isNumber } from 'lodash';
+
+import { DataService } from './data.service';
@Injectable({
providedIn: 'root'
})
export class AdminService {
- public constructor(
- private dataService: DataService,
- @Inject(GF_ENVIRONMENT) private environment: GfEnvironment,
- private http: HttpClient
- ) {}
+ private readonly dataService = inject(DataService);
+ private readonly environment = inject(GF_ENVIRONMENT);
+ private readonly http = inject(HttpClient);
public addAssetProfile({ dataSource, symbol }: AssetProfileIdentifier) {
return this.http.post(
@@ -132,7 +132,7 @@ export class AdminService {
public fetchJobs({ status }: { status?: JobStatus[] }) {
let params = new HttpParams();
- if (status?.length > 0) {
+ if (status && status.length > 0) {
params = params.append('status', status.join(','));
}
@@ -158,8 +158,13 @@ export class AdminService {
}) {
let params = new HttpParams();
- params = params.append('skip', skip);
- params = params.append('take', take);
+ if (isNumber(skip)) {
+ params = params.append('skip', skip);
+ }
+
+ if (isNumber(take)) {
+ params = params.append('take', take);
+ }
return this.http.get('/api/v1/admin/user', { params });
}
diff --git a/libs/ui/src/lib/services/data.service.ts b/libs/ui/src/lib/services/data.service.ts
index 37443cd20..7f2dac0b1 100644
--- a/libs/ui/src/lib/services/data.service.ts
+++ b/libs/ui/src/lib/services/data.service.ts
@@ -65,15 +65,19 @@ import type {
import { translate } from '@ghostfolio/ui/i18n';
import { HttpClient, HttpParams } from '@angular/common/http';
-import { Injectable } from '@angular/core';
+import { Injectable, inject } from '@angular/core';
import { SortDirection } from '@angular/material/sort';
import { utc } from '@date-fns/utc';
import {
+ Access as AccessModel,
+ Account,
AccountBalance,
DataSource,
MarketData,
- Order as OrderModel,
- Tag
+ Order,
+ SymbolProfile,
+ Tag,
+ User as UserModel
} from '@prisma/client';
import { format, parseISO } from 'date-fns';
import { cloneDeep, groupBy, isNumber } from 'lodash';
@@ -84,12 +88,12 @@ import { map } from 'rxjs/operators';
providedIn: 'root'
})
export class DataService {
- public constructor(private http: HttpClient) {}
+ private readonly http = inject(HttpClient);
public buildFiltersAsQueryParams({ filters }: { filters?: Filter[] }) {
let params = new HttpParams();
- if (filters?.length > 0) {
+ if (filters && filters.length > 0) {
const {
ACCOUNT: filtersByAccount,
ASSET_CLASS: filtersByAssetClass,
@@ -205,6 +209,7 @@ export class DataService {
}
public fetchActivities({
+ activityTypes,
filters,
range,
skip,
@@ -212,6 +217,7 @@ export class DataService {
sortDirection,
take
}: {
+ activityTypes?: string[];
filters?: Filter[];
range?: DateRange;
skip?: number;
@@ -221,6 +227,10 @@ export class DataService {
}): Observable {
let params = this.buildFiltersAsQueryParams({ filters });
+ if (activityTypes?.length) {
+ params = params.append('activityTypes', activityTypes.join(','));
+ }
+
if (range) {
params = params.append('range', range);
}
@@ -241,7 +251,7 @@ export class DataService {
params = params.append('take', take);
}
- return this.http.get('/api/v1/order', { params }).pipe(
+ return this.http.get('/api/v1/activities', { params }).pipe(
map(({ activities, count }) => {
for (const activity of activities) {
activity.createdAt = parseISO(activity.createdAt);
@@ -253,14 +263,18 @@ export class DataService {
}
public fetchActivity(aActivityId: string) {
- return this.http.get(`/api/v1/order/${aActivityId}`).pipe(
- map((activity) => {
- activity.createdAt = parseISO(activity.createdAt as unknown as string);
- activity.date = parseISO(activity.date as unknown as string);
+ return this.http
+ .get(`/api/v1/activities/${aActivityId}`)
+ .pipe(
+ map((activity) => {
+ activity.createdAt = parseISO(
+ activity.createdAt as unknown as string
+ );
+ activity.date = parseISO(activity.date as unknown as string);
- return activity;
- })
- );
+ return activity;
+ })
+ );
}
public fetchDividends({
@@ -303,45 +317,47 @@ export class DataService {
}
public deleteAccess(aId: string) {
- return this.http.delete(`/api/v1/access/${aId}`);
+ return this.http.delete(`/api/v1/access/${aId}`);
}
public deleteAccount(aId: string) {
- return this.http.delete(`/api/v1/account/${aId}`);
+ return this.http.delete(`/api/v1/account/${aId}`);
}
public deleteAccountBalance(aId: string) {
- return this.http.delete(`/api/v1/account-balance/${aId}`);
+ return this.http.delete(`/api/v1/account-balance/${aId}`);
}
- public deleteActivities({ filters }) {
+ public deleteActivities({ filters }: { filters?: Filter[] }) {
const params = this.buildFiltersAsQueryParams({ filters });
- return this.http.delete('/api/v1/order', { params });
+ return this.http.delete('/api/v1/activities', { params });
}
public deleteActivity(aId: string) {
- return this.http.delete(`/api/v1/order/${aId}`);
+ return this.http.delete(`/api/v1/activities/${aId}`);
}
public deleteBenchmark({ dataSource, symbol }: AssetProfileIdentifier) {
- return this.http.delete(`/api/v1/benchmarks/${dataSource}/${symbol}`);
+ return this.http.delete>(
+ `/api/v1/benchmarks/${dataSource}/${symbol}`
+ );
}
public deleteOwnUser(aData: DeleteOwnUserDto) {
- return this.http.delete(`/api/v1/user`, { body: aData });
+ return this.http.delete(`/api/v1/user`, { body: aData });
}
public deleteTag(aId: string) {
- return this.http.delete(`/api/v1/tags/${aId}`);
+ return this.http.delete(`/api/v1/tags/${aId}`);
}
public deleteUser(aId: string) {
- return this.http.delete(`/api/v1/user/${aId}`);
+ return this.http.delete(`/api/v1/user/${aId}`);
}
public deleteWatchlistItem({ dataSource, symbol }: AssetProfileIdentifier) {
- return this.http.delete(`/api/v1/watchlist/${dataSource}/${symbol}`);
+ return this.http.delete(`/api/v1/watchlist/${dataSource}/${symbol}`);
}
public fetchAccesses() {
@@ -401,9 +417,11 @@ export class DataService {
public fetchExport({
activityIds,
+ activityTypes,
filters
}: {
activityIds?: string[];
+ activityTypes?: string[];
filters?: Filter[];
} = {}) {
let params = this.buildFiltersAsQueryParams({ filters });
@@ -412,6 +430,10 @@ export class DataService {
params = params.append('activityIds', activityIds.join(','));
}
+ if (activityTypes?.length) {
+ params = params.append('activityTypes', activityTypes.join(','));
+ }
+
return this.http.get('/api/v1/export', {
params
});
@@ -747,11 +769,11 @@ export class DataService {
}
public postAccess(aAccess: CreateAccessDto) {
- return this.http.post('/api/v1/access', aAccess);
+ return this.http.post('/api/v1/access', aAccess);
}
public postAccount(aAccount: CreateAccountDto) {
- return this.http.post('/api/v1/account', aAccount);
+ return this.http.post('/api/v1/account', aAccount);
}
public postAccountBalance(aAccountBalance: CreateAccountBalanceDto) {
@@ -761,6 +783,10 @@ export class DataService {
);
}
+ public postActivity(aOrder: CreateOrderDto) {
+ return this.http.post('/api/v1/activities', aOrder);
+ }
+
public postApiKey() {
return this.http.post('/api/v1/api-keys', {});
}
@@ -783,10 +809,6 @@ export class DataService {
return this.http.post(url, marketData);
}
- public postOrder(aOrder: CreateOrderDto) {
- return this.http.post('/api/v1/order', aOrder);
- }
-
public postTag(aTag: CreateTagDto) {
return this.http.post(`/api/v1/tags`, aTag);
}
@@ -807,6 +829,10 @@ export class DataService {
return this.http.put(`/api/v1/account/${aAccount.id}`, aAccount);
}
+ public putActivity(aOrder: UpdateOrderDto) {
+ return this.http.put(`/api/v1/activities/${aOrder.id}`, aOrder);
+ }
+
public putAdminSetting(key: string, aData: UpdatePropertyDto) {
return this.http.put(`/api/v1/admin/settings/${key}`, aData);
}
@@ -822,10 +848,6 @@ export class DataService {
);
}
- public putOrder(aOrder: UpdateOrderDto) {
- return this.http.put(`/api/v1/order/${aOrder.id}`, aOrder);
- }
-
public putTag(aTag: UpdateTagDto) {
return this.http.put(`/api/v1/tags/${aTag.id}`, aTag);
}
diff --git a/libs/ui/src/lib/shared/abstract-mat-form-field.ts b/libs/ui/src/lib/shared/abstract-mat-form-field.ts
index 628f0a659..0d547af4e 100644
--- a/libs/ui/src/lib/shared/abstract-mat-form-field.ts
+++ b/libs/ui/src/lib/shared/abstract-mat-form-field.ts
@@ -37,7 +37,7 @@ export abstract class AbstractMatFormField
private static nextId = 0;
protected constructor(
- protected _elementRef: ElementRef,
+ protected _elementRef: ElementRef,
protected _focusMonitor: FocusMonitor,
public readonly ngControl: NgControl
) {
@@ -137,7 +137,7 @@ export abstract class AbstractMatFormField
public ngDoCheck() {
if (this.ngControl) {
- this.errorState = this.ngControl.invalid && this.ngControl.touched;
+ this.errorState = !!(this.ngControl.invalid && this.ngControl.touched);
this.stateChanges.next();
}
}
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 c74e8a077..4b1898b8a 100644
--- a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts
+++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts
@@ -8,15 +8,17 @@ import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
+ DestroyRef,
DoCheck,
ElementRef,
Input,
OnChanges,
- OnDestroy,
OnInit,
SimpleChanges,
- ViewChild
+ inject,
+ viewChild
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import {
FormControl,
FormsModule,
@@ -35,13 +37,12 @@ import {
import { MatInput, MatInputModule } from '@angular/material/input';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { isString } from 'lodash';
-import { Subject, tap } from 'rxjs';
+import { tap } from 'rxjs';
import {
debounceTime,
distinctUntilChanged,
filter,
- switchMap,
- takeUntil
+ switchMap
} from 'rxjs/operators';
import { translate } from '../i18n';
@@ -77,21 +78,21 @@ import { AbstractMatFormField } from '../shared/abstract-mat-form-field';
})
export class GfSymbolAutocompleteComponent
extends AbstractMatFormField
- implements DoCheck, OnChanges, OnDestroy, OnInit
+ implements DoCheck, OnChanges, OnInit
{
@Input() public defaultLookupItems: LookupItem[] = [];
@Input() public isLoading = false;
- @ViewChild('symbolAutocomplete') public symbolAutocomplete: MatAutocomplete;
-
@Input() private includeIndices = false;
- @ViewChild(MatInput) private input: MatInput;
-
- public control = new FormControl();
+ public readonly control = new FormControl();
public lookupItems: (LookupItem & { assetSubClassString: string })[] = [];
- private unsubscribeSubject = new Subject();
+ protected readonly symbolAutocomplete =
+ viewChild.required('symbolAutocomplete');
+
+ private readonly destroyRef = inject(DestroyRef);
+ private readonly input = viewChild.required(MatInput);
public constructor(
public readonly _elementRef: ElementRef,
@@ -105,13 +106,22 @@ export class GfSymbolAutocompleteComponent
this.controlType = 'symbol-autocomplete';
}
+ public get empty() {
+ return this.input().empty;
+ }
+
+ public set value(value: LookupItem) {
+ this.control.setValue(value);
+ super.value = value;
+ }
+
public ngOnInit() {
if (this.disabled) {
this.control.disable();
}
this.control.valueChanges
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
if (super.value) {
super.value.dataSource = null;
@@ -136,7 +146,7 @@ export class GfSymbolAutocompleteComponent
}),
debounceTime(400),
distinctUntilChanged(),
- takeUntil(this.unsubscribeSubject),
+ takeUntilDestroyed(this.destroyRef),
switchMap((query: string) => {
return this.dataService.fetchSymbols({
query,
@@ -168,12 +178,8 @@ export class GfSymbolAutocompleteComponent
return aLookupItem?.symbol ?? '';
}
- public get empty() {
- return this.input?.empty;
- }
-
public focus() {
- this.input.focus();
+ this.input().focus();
}
public isValueInOptions(value: string) {
@@ -185,7 +191,7 @@ export class GfSymbolAutocompleteComponent
public ngDoCheck() {
if (this.ngControl) {
this.validateRequired();
- this.errorState = this.ngControl.invalid && this.ngControl.touched;
+ this.errorState = !!(this.ngControl.invalid && this.ngControl.touched);
this.stateChanges.next();
}
}
@@ -197,18 +203,6 @@ export class GfSymbolAutocompleteComponent
} as LookupItem;
}
- public set value(value: LookupItem) {
- this.control.setValue(value);
- super.value = value;
- }
-
- public ngOnDestroy() {
- super.ngOnDestroy();
-
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
private showDefaultOptions() {
this.lookupItems = this.defaultLookupItems.map((lookupItem) => {
return {
@@ -224,8 +218,9 @@ export class GfSymbolAutocompleteComponent
const requiredCheck = super.required
? !super.value?.dataSource || !super.value?.symbol
: false;
+
if (requiredCheck) {
- this.ngControl.control.setErrors({ invalidData: true });
+ this.ngControl.control?.setErrors({ invalidData: true });
}
}
}
diff --git a/libs/ui/src/lib/tags-selector/interfaces/interfaces.ts b/libs/ui/src/lib/tags-selector/interfaces/interfaces.ts
new file mode 100644
index 000000000..fe9af9882
--- /dev/null
+++ b/libs/ui/src/lib/tags-selector/interfaces/interfaces.ts
@@ -0,0 +1,7 @@
+import { Tag } from '@prisma/client';
+
+export interface NewTag extends Omit {
+ id: undefined;
+}
+
+export type SelectedTag = NewTag | Tag;
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 c3c02f3c7..82f465555 100644
--- a/libs/ui/src/lib/tags-selector/tags-selector.component.html
+++ b/libs/ui/src/lib/tags-selector/tags-selector.component.html
@@ -2,7 +2,7 @@
@if (readonly) {
Tags
- @if (tags?.length > 0) {
+ @if (tags && tags.length > 0) {
@for (tag of tags; track tag) {
{{ tag.name }}
diff --git a/libs/ui/src/lib/tags-selector/tags-selector.component.ts b/libs/ui/src/lib/tags-selector/tags-selector.component.ts
index 7f1a8805e..36e17f9c1 100644
--- a/libs/ui/src/lib/tags-selector/tags-selector.component.ts
+++ b/libs/ui/src/lib/tags-selector/tags-selector.component.ts
@@ -7,11 +7,11 @@ import {
ElementRef,
Input,
OnChanges,
- OnDestroy,
OnInit,
signal,
- ViewChild
+ viewChild
} from '@angular/core';
+import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import {
ControlValueAccessor,
FormControl,
@@ -30,7 +30,9 @@ import { IonIcon } from '@ionic/angular/standalone';
import { Tag } from '@prisma/client';
import { addIcons } from 'ionicons';
import { addCircleOutline, closeOutline } from 'ionicons/icons';
-import { BehaviorSubject, Subject, takeUntil } from 'rxjs';
+import { BehaviorSubject, Subject } from 'rxjs';
+
+import { SelectedTag } from './interfaces/interfaces';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
@@ -57,27 +59,28 @@ import { BehaviorSubject, Subject, takeUntil } from 'rxjs';
templateUrl: 'tags-selector.component.html'
})
export class GfTagsSelectorComponent
- implements ControlValueAccessor, OnChanges, OnDestroy, OnInit
+ implements ControlValueAccessor, OnChanges, OnInit
{
@Input() hasPermissionToCreateTag = false;
@Input() readonly = false;
- @Input() tags: Tag[];
- @Input() tagsAvailable: Tag[];
-
- @ViewChild('tagInput') tagInput: ElementRef;
+ @Input() tags: SelectedTag[];
+ @Input() tagsAvailable: SelectedTag[];
- public filteredOptions: Subject = new BehaviorSubject([]);
+ public readonly filteredOptions: Subject = new BehaviorSubject(
+ []
+ );
public readonly separatorKeysCodes: number[] = [COMMA, ENTER];
public readonly tagInputControl = new FormControl('');
- public readonly tagsSelected = signal([]);
+ public readonly tagsSelected = signal([]);
- private unsubscribeSubject = new Subject();
+ private readonly tagInput =
+ viewChild.required>('tagInput');
public constructor() {
this.tagInputControl.valueChanges
- .pipe(takeUntil(this.unsubscribeSubject))
+ .pipe(takeUntilDestroyed())
.subscribe((value) => {
- this.filteredOptions.next(this.filterTags(value));
+ this.filteredOptions.next(this.filterTags(value ?? ''));
});
addIcons({ addCircleOutline, closeOutline });
@@ -106,15 +109,18 @@ export class GfTagsSelectorComponent
};
}
- this.tagsSelected.update((tags) => {
- return [...(tags ?? []), tag];
- });
+ if (tag) {
+ this.tagsSelected.update((tags) => {
+ return [...(tags ?? []), tag];
+ });
- const newTags = this.tagsSelected();
- this.onChange(newTags);
- this.onTouched();
- this.tagInput.nativeElement.value = '';
- this.tagInputControl.setValue(undefined);
+ const newTags = this.tagsSelected();
+ this.onChange(newTags);
+ this.onTouched();
+ }
+
+ this.tagInput().nativeElement.value = '';
+ this.tagInputControl.setValue(null);
}
public onRemoveTag(tag: Tag) {
@@ -130,7 +136,7 @@ export class GfTagsSelectorComponent
this.updateFilters();
}
- public registerOnChange(fn: (value: Tag[]) => void) {
+ public registerOnChange(fn: (value: SelectedTag[]) => void) {
this.onChange = fn;
}
@@ -146,17 +152,12 @@ export class GfTagsSelectorComponent
}
}
- public writeValue(value: Tag[]) {
+ public writeValue(value: SelectedTag[]) {
this.tagsSelected.set(value || []);
this.updateFilters();
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
-
- private filterTags(query: string = ''): Tag[] {
+ private filterTags(query: string = ''): SelectedTag[] {
const tags = this.tagsSelected() ?? [];
const tagIds = tags.map(({ id }) => {
return id;
@@ -170,7 +171,7 @@ export class GfTagsSelectorComponent
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
- private onChange = (_value: Tag[]): void => {
+ private onChange = (_value: SelectedTag[]): void => {
// ControlValueAccessor onChange callback
};
diff --git a/libs/ui/src/lib/toggle/toggle.component.html b/libs/ui/src/lib/toggle/toggle.component.html
index ac2256daa..d6271ef58 100644
--- a/libs/ui/src/lib/toggle/toggle.component.html
+++ b/libs/ui/src/lib/toggle/toggle.component.html
@@ -3,13 +3,14 @@
[formControl]="optionFormControl"
(change)="onValueChange()"
>
- @for (option of options; track option) {
+ @for (option of options(); track option) {
{{ option.label }} ();
+ public readonly isLoading = input(false);
+ public readonly options = input([]);
- @Output() valueChange = new EventEmitter>();
+ protected readonly optionFormControl = new FormControl(null);
+ protected readonly valueChange = output>();
- public optionFormControl = new FormControl(undefined);
-
- public ngOnChanges() {
- this.optionFormControl.setValue(this.defaultValue);
+ public constructor() {
+ effect(() => {
+ this.optionFormControl.setValue(this.defaultValue());
+ });
}
public onValueChange() {
- this.valueChange.emit({ value: this.optionFormControl.value });
+ const value = this.optionFormControl.value;
+
+ if (value !== null) {
+ this.valueChange.emit({ value });
+ }
}
}
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 7a2a84126..6ff4ecf5b 100644
--- a/libs/ui/src/lib/top-holdings/top-holdings.component.html
+++ b/libs/ui/src/lib/top-holdings/top-holdings.component.html
@@ -16,7 +16,7 @@
Name
- {{ element?.name | titlecase }}
+ {{ prettifyAssetName(element?.name) }}
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 75a96fc5c..7c9ae033f 100644
--- a/libs/ui/src/lib/top-holdings/top-holdings.component.ts
+++ b/libs/ui/src/lib/top-holdings/top-holdings.component.ts
@@ -20,15 +20,14 @@ import {
EventEmitter,
Input,
OnChanges,
- OnDestroy,
Output,
ViewChild
} from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
import { MatTableDataSource, MatTableModule } from '@angular/material/table';
+import { capitalize } from 'lodash';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
-import { Subject } from 'rxjs';
import { GfValueComponent } from '../value/value.component';
@@ -58,7 +57,7 @@ import { GfValueComponent } from '../value/value.component';
styleUrls: ['./top-holdings.component.scss'],
templateUrl: './top-holdings.component.html'
})
-export class GfTopHoldingsComponent implements OnChanges, OnDestroy {
+export class GfTopHoldingsComponent implements OnChanges {
@Input() baseCurrency: string;
@Input() locale = getLocale();
@Input() pageSize = Number.MAX_SAFE_INTEGER;
@@ -76,8 +75,6 @@ export class GfTopHoldingsComponent implements OnChanges, OnDestroy {
];
public isLoading = true;
- private unsubscribeSubject = new Subject();
-
public ngOnChanges() {
this.isLoading = true;
@@ -101,8 +98,23 @@ export class GfTopHoldingsComponent implements OnChanges, OnDestroy {
});
}
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
+ public prettifyAssetName(name: string) {
+ if (!name) {
+ return '';
+ }
+
+ return name
+ .split(' ')
+ .filter((token) => {
+ return !token.startsWith('(') && !token.endsWith(')');
+ })
+ .map((token) => {
+ if (token.length <= 2) {
+ return token.toUpperCase();
+ }
+
+ return capitalize(token);
+ })
+ .join(' ');
}
}
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 a80876f6a..7069cabb0 100644
--- a/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
+++ b/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
@@ -162,7 +162,9 @@ export class GfTreemapChartComponent
private initialize() {
this.isLoading = true;
- const { endDate, startDate } = getIntervalFromDateRange(this.dateRange);
+ const { endDate, startDate } = getIntervalFromDateRange({
+ dateRange: this.dateRange
+ });
const netPerformancePercentsWithCurrencyEffect = this.holdings.map(
({ dateOfFirstActivity, netPerformancePercentWithCurrencyEffect }) => {
diff --git a/libs/ui/src/lib/value/value.component.html b/libs/ui/src/lib/value/value.component.html
index 14080c16d..c4d6532a7 100644
--- a/libs/ui/src/lib/value/value.component.html
+++ b/libs/ui/src/lib/value/value.component.html
@@ -4,7 +4,26 @@
}
-
+
+
+
+
+
+ @if (enableCopyToClipboardButton) {
+
+
+
+ }
+
+
@if (value || value === 0 || value === null) {
}
+ @if (!hasLabel) {
+
+ }
}
@@ -88,6 +110,9 @@
@if (size === 'large') {
+ @if (hasLabel) {
+
+ }
@if (subLabel) {
{{ subLabel }}
}
@@ -95,6 +120,9 @@
} @else {
+ @if (hasLabel) {
+
+ }
}
diff --git a/libs/ui/src/lib/value/value.component.stories.ts b/libs/ui/src/lib/value/value.component.stories.ts
index a1f9d06a0..214331efc 100644
--- a/libs/ui/src/lib/value/value.component.stories.ts
+++ b/libs/ui/src/lib/value/value.component.stories.ts
@@ -1,3 +1,4 @@
+import '@angular/localize/init';
import { moduleMetadata } from '@storybook/angular';
import type { Meta, StoryObj } from '@storybook/angular';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
@@ -16,6 +17,13 @@ export default {
deviceType: {
control: 'select',
options: ['desktop', 'mobile']
+ },
+ enableCopyToClipboardButton: {
+ control: 'boolean'
+ },
+ size: {
+ control: 'select',
+ options: ['small', 'medium', 'large']
}
}
} as Meta
;
@@ -51,7 +59,11 @@ export const Label: Story = {
args: {
locale: 'en-US',
value: 7.25
- }
+ },
+ render: (args) => ({
+ props: args,
+ template: `Label `
+ })
};
export const PerformancePositive: Story = {
diff --git a/libs/ui/src/lib/value/value.component.ts b/libs/ui/src/lib/value/value.component.ts
index 795e16491..9c3330466 100644
--- a/libs/ui/src/lib/value/value.component.ts
+++ b/libs/ui/src/lib/value/value.component.ts
@@ -1,30 +1,41 @@
import { getLocale } from '@ghostfolio/common/helper';
+import { Clipboard } from '@angular/cdk/clipboard';
import { CommonModule } from '@angular/common';
import {
- CUSTOM_ELEMENTS_SCHEMA,
+ AfterViewInit,
ChangeDetectionStrategy,
+ ChangeDetectorRef,
Component,
+ computed,
+ CUSTOM_ELEMENTS_SCHEMA,
+ ElementRef,
+ input,
Input,
OnChanges,
- computed,
- input
+ 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 { isNumber } from 'lodash';
+import ms from 'ms';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
- imports: [CommonModule, IonIcon, NgxSkeletonLoaderModule],
+ imports: [CommonModule, IonIcon, MatButtonModule, NgxSkeletonLoaderModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
selector: 'gf-value',
styleUrls: ['./value.component.scss'],
templateUrl: './value.component.html'
})
-export class GfValueComponent implements OnChanges {
+export class GfValueComponent implements AfterViewInit, OnChanges {
@Input() colorizeSign = false;
@Input() deviceType: string;
+ @Input() enableCopyToClipboardButton = false;
@Input() icon = '';
@Input() isAbsolute = false;
@Input() isCurrency = false;
@@ -37,12 +48,26 @@ export class GfValueComponent implements OnChanges {
@Input() unit = '';
@Input() value: number | string = '';
+ @ViewChild('labelContent', { static: false })
+ labelContent!: ElementRef;
+
public absoluteValue = 0;
public formattedValue = '';
+ public hasLabel = false;
public isNumber = false;
public isString = false;
public useAbsoluteValue = false;
+ public constructor(
+ private changeDetectorRef: ChangeDetectorRef,
+ private clipboard: Clipboard,
+ private snackBar: MatSnackBar
+ ) {
+ addIcons({
+ copyOutline
+ });
+ }
+
public readonly precision = input();
private readonly formatOptions = computed(() => {
@@ -59,6 +84,17 @@ export class GfValueComponent implements OnChanges {
return precision !== undefined && precision >= 0;
}
+ public ngAfterViewInit() {
+ if (this.labelContent) {
+ const element = this.labelContent.nativeElement;
+
+ this.hasLabel =
+ element.children.length > 0 || element.textContent.trim().length > 0;
+
+ this.changeDetectorRef.markForCheck();
+ }
+ }
+
public ngOnChanges() {
this.initializeVariables();
@@ -137,6 +173,18 @@ export class GfValueComponent implements OnChanges {
}
}
+ public onCopyValueToClipboard() {
+ this.clipboard.copy(String(this.value));
+
+ this.snackBar.open(
+ '✅ ' + $localize`${this.value} has been copied to the clipboard`,
+ undefined,
+ {
+ duration: ms('3 seconds')
+ }
+ );
+ }
+
private initializeVariables() {
this.absoluteValue = 0;
this.formattedValue = '';
diff --git a/libs/ui/tsconfig.json b/libs/ui/tsconfig.json
index 04f4630bc..51348a52a 100644
--- a/libs/ui/tsconfig.json
+++ b/libs/ui/tsconfig.json
@@ -19,6 +19,7 @@
"target": "es2020",
// TODO: Remove once solved in tsconfig.base.json
"strict": false,
+ "strictNullChecks": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true
},
diff --git a/package-lock.json b/package-lock.json
index bfffda10c..1e17bf94b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "ghostfolio",
- "version": "2.245.0",
+ "version": "2.252.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ghostfolio",
- "version": "2.245.0",
+ "version": "2.252.0",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {
@@ -21,10 +21,13 @@
"@angular/platform-browser-dynamic": "21.1.1",
"@angular/router": "21.1.1",
"@angular/service-worker": "21.1.1",
+ "@bull-board/api": "6.20.3",
+ "@bull-board/express": "6.20.3",
+ "@bull-board/nestjs": "6.20.3",
"@codewithdan/observable-store": "2.2.15",
"@date-fns/utc": "2.1.1",
"@internationalized/number": "3.6.5",
- "@ionic/angular": "8.7.8",
+ "@ionic/angular": "8.8.1",
"@keyv/redis": "4.4.0",
"@nestjs/bull": "11.0.4",
"@nestjs/cache-manager": "3.1.0",
@@ -54,10 +57,11 @@
"chartjs-plugin-datalabels": "2.2.0",
"cheerio": "1.2.0",
"class-transformer": "0.5.1",
- "class-validator": "0.14.3",
+ "class-validator": "0.15.1",
"color": "5.0.3",
+ "cookie-parser": "1.4.7",
"countries-and-timezones": "3.8.0",
- "countries-list": "3.2.2",
+ "countries-list": "3.3.0",
"countup.js": "2.9.0",
"date-fns": "4.1.0",
"dotenv": "17.2.3",
@@ -69,11 +73,11 @@
"helmet": "7.0.0",
"http-status-codes": "2.3.0",
"ionicons": "8.0.13",
- "jsonpath": "1.1.1",
+ "jsonpath": "1.2.1",
"lodash": "4.17.23",
"marked": "17.0.2",
"ms": "3.0.0-canary.1",
- "ng-extract-i18n-merge": "3.2.1",
+ "ng-extract-i18n-merge": "3.3.0",
"ngx-device-detector": "11.0.0",
"ngx-markdown": "21.1.0",
"ngx-skeleton-loader": "12.0.0",
@@ -86,11 +90,11 @@
"passport-openidconnect": "0.1.2",
"reflect-metadata": "0.2.2",
"rxjs": "7.8.1",
- "stripe": "20.3.0",
- "svgmap": "2.14.0",
+ "stripe": "20.4.1",
+ "svgmap": "2.19.2",
"tablemark": "4.1.0",
"twitter-api-v2": "1.29.0",
- "yahoo-finance2": "3.13.0",
+ "yahoo-finance2": "3.13.2",
"zone.js": "0.16.0"
},
"devDependencies": {
@@ -109,21 +113,22 @@
"@eslint/js": "9.35.0",
"@nestjs/schematics": "11.0.9",
"@nestjs/testing": "11.1.14",
- "@nx/angular": "22.4.5",
- "@nx/eslint-plugin": "22.4.5",
- "@nx/jest": "22.4.5",
- "@nx/js": "22.4.5",
- "@nx/module-federation": "22.4.5",
- "@nx/nest": "22.4.5",
- "@nx/node": "22.4.5",
- "@nx/storybook": "22.4.5",
- "@nx/web": "22.4.5",
- "@nx/workspace": "22.4.5",
+ "@nx/angular": "22.5.3",
+ "@nx/eslint-plugin": "22.5.3",
+ "@nx/jest": "22.5.3",
+ "@nx/js": "22.5.3",
+ "@nx/module-federation": "22.5.3",
+ "@nx/nest": "22.5.3",
+ "@nx/node": "22.5.3",
+ "@nx/storybook": "22.5.3",
+ "@nx/web": "22.5.3",
+ "@nx/workspace": "22.5.3",
"@schematics/angular": "21.1.1",
"@storybook/addon-docs": "10.1.10",
"@storybook/angular": "10.1.10",
- "@trivago/prettier-plugin-sort-imports": "5.2.2",
+ "@trivago/prettier-plugin-sort-imports": "6.0.2",
"@types/big.js": "6.2.2",
+ "@types/cookie-parser": "1.4.10",
"@types/fast-redact": "3.0.4",
"@types/google-spreadsheet": "3.1.5",
"@types/jest": "30.0.0",
@@ -131,7 +136,7 @@
"@types/lodash": "4.17.23",
"@types/node": "22.15.17",
"@types/papaparse": "5.3.7",
- "@types/passport-google-oauth20": "2.0.16",
+ "@types/passport-google-oauth20": "2.0.17",
"@types/passport-openidconnect": "0.1.3",
"@typescript-eslint/eslint-plugin": "8.43.0",
"@typescript-eslint/parser": "8.43.0",
@@ -143,13 +148,13 @@
"jest": "30.2.0",
"jest-environment-jsdom": "30.2.0",
"jest-preset-angular": "16.0.0",
- "nx": "22.4.5",
+ "nx": "22.5.3",
"prettier": "3.8.1",
"prettier-plugin-organize-attributes": "1.0.0",
"prisma": "7.3.0",
"react": "18.2.0",
"react-dom": "18.2.0",
- "replace-in-file": "8.3.0",
+ "replace-in-file": "8.4.0",
"shx": "0.4.0",
"storybook": "10.1.10",
"ts-jest": "29.4.0",
@@ -3642,6 +3647,53 @@
"devOptional": true,
"license": "(Apache-2.0 AND BSD-3-Clause)"
},
+ "node_modules/@bull-board/api": {
+ "version": "6.20.3",
+ "resolved": "https://registry.npmjs.org/@bull-board/api/-/api-6.20.3.tgz",
+ "integrity": "sha512-cDrsJJsmF4DbbY8/5oHxO4qFtyFjxexsWQKHowsud/8H4mtZN7MZg4fCmNzfaxc9Ov7V6r9Y9F5G2Mq6t7ZEJg==",
+ "license": "MIT",
+ "dependencies": {
+ "redis-info": "^3.1.0"
+ },
+ "peerDependencies": {
+ "@bull-board/ui": "6.20.3"
+ }
+ },
+ "node_modules/@bull-board/express": {
+ "version": "6.20.3",
+ "resolved": "https://registry.npmjs.org/@bull-board/express/-/express-6.20.3.tgz",
+ "integrity": "sha512-S6BGeSf/PLwjx5W1IrKxoV8G6iiMmLqT/pldZ6BiC1IDldedisTtAdL1z117swXPv1H7/3hy0vr03dUr8bUCPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@bull-board/api": "6.20.3",
+ "@bull-board/ui": "6.20.3",
+ "ejs": "^3.1.10",
+ "express": "^5.2.1"
+ }
+ },
+ "node_modules/@bull-board/nestjs": {
+ "version": "6.20.3",
+ "resolved": "https://registry.npmjs.org/@bull-board/nestjs/-/nestjs-6.20.3.tgz",
+ "integrity": "sha512-VFi96Z2M8k3G26H1ivzQnpjKszxh90vrUm78VtMZH/sh8wjm88mJFDXcOgFutOaddx7cc9VNXlKsTTcu6okPFQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@bull-board/api": "^6.20.3",
+ "@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",
+ "reflect-metadata": "^0.1.13 || ^0.2.0",
+ "rxjs": "^7.8.1"
+ }
+ },
+ "node_modules/@bull-board/ui": {
+ "version": "6.20.3",
+ "resolved": "https://registry.npmjs.org/@bull-board/ui/-/ui-6.20.3.tgz",
+ "integrity": "sha512-oANyYoW0X+xd0j/09DRyh3u7Q3wqBtXiLEWyZUJIi/Bjp/hINwiw20RwWuRcaFkqkFylEJL9l+pjmeSA9X5L2A==",
+ "license": "MIT",
+ "dependencies": {
+ "@bull-board/api": "6.20.3"
+ }
+ },
"node_modules/@chevrotain/cst-dts-gen": {
"version": "11.0.3",
"resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz",
@@ -5049,12 +5101,12 @@
}
},
"node_modules/@ionic/angular": {
- "version": "8.7.8",
- "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-8.7.8.tgz",
- "integrity": "sha512-IBN5h3nIOwbuglLit48S7wNeg7NHtl/vaKAHDggICyzI92cSg5yYL07Fz59pszhkBlZQUB5SQnml990Zj2bZUg==",
+ "version": "8.8.1",
+ "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-8.8.1.tgz",
+ "integrity": "sha512-Jp7LbouSHAnR00Dsa8qE1CSOZNqAfBCO0XKXScJNz8NKVoZe5fPGy/CboehGtAQ1xgzh2eDa15zMmyetXjAkYA==",
"license": "MIT",
"dependencies": {
- "@ionic/core": "8.7.8",
+ "@ionic/core": "8.8.1",
"ionicons": "^8.0.13",
"jsonc-parser": "^3.0.0",
"tslib": "^2.3.0"
@@ -5068,14 +5120,17 @@
}
},
"node_modules/@ionic/core": {
- "version": "8.7.8",
- "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.8.tgz",
- "integrity": "sha512-GLWb/lz3kocpzTZTeQQ5xxoWz4CKHD6zpnbwJknTKsncebohAaw2KTe7uOw5toKQEDdohTseFuSGoDDBoRQ1Ug==",
+ "version": "8.8.1",
+ "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.8.1.tgz",
+ "integrity": "sha512-ksOUHyOEqoyUIVWcwCNSFZVGwNfP1DKrUVeN/Cdk/Xl9Rdd/5MLHGsrOQpWQfoCf3Csdnw+KHHPrXz/2fzMkMA==",
"license": "MIT",
"dependencies": {
- "@stencil/core": "4.38.0",
+ "@stencil/core": "4.43.0",
"ionicons": "^8.0.13",
"tslib": "^2.1.0"
+ },
+ "engines": {
+ "node": ">= 16"
}
},
"node_modules/@ioredis/commands": {
@@ -6703,15 +6758,15 @@
}
},
"node_modules/@module-federation/node": {
- "version": "2.7.31",
- "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.7.31.tgz",
- "integrity": "sha512-NSa0PFDKDLxmtfmCVHW9RhtfD9mcNOrp1d+cjVEoxb5x8dDI4jQTi1o3nsa9ettxs3bVtWhAUEQUNQBQ6ZA+Hw==",
+ "version": "2.7.32",
+ "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.7.32.tgz",
+ "integrity": "sha512-hUj5v2GGwpNzl2gaJS4AyzCYRzJBhN8875A+ucKF9tq3jaQb5zpy3izYMISqqbN2q9a7jz3nEUgwAh3pjri+rQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/enhanced": "2.0.0",
- "@module-federation/runtime": "2.0.0",
- "@module-federation/sdk": "2.0.0",
+ "@module-federation/enhanced": "2.0.1",
+ "@module-federation/runtime": "2.0.1",
+ "@module-federation/sdk": "2.0.1",
"btoa": "1.2.1",
"encoding": "^0.1.13",
"node-fetch": "2.7.0"
@@ -6726,26 +6781,26 @@
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/bridge-react-webpack-plugin": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-2.0.0.tgz",
- "integrity": "sha512-AVT/rZK6RHva6ZTYfsyQ8oP4xYNTws3OzqKW/YxWaLXwQ3oG9ZbF7fKl4jIKoMKuuy2L9MGVXS4CYPZy0s8fXg==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-2.0.1.tgz",
+ "integrity": "sha512-D7LMW5EMAJShOMR1aZDAJ6s+MdsYDHaQyJADLQ3LaY0sne/BkVqkPikUwcO1IwOwKbXjYsDlQVOEvk9wZVRFhA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/sdk": "2.0.0",
+ "@module-federation/sdk": "2.0.1",
"@types/semver": "7.5.8",
"semver": "7.6.3"
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/cli": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-2.0.0.tgz",
- "integrity": "sha512-IWGWbdgoeNcuA5jzqPr6pLTN1hovMQh9A1lgJp5fAvKfICfFXKq7K8nwMAQrWD6iEKApIenI0madk1Dg2PU3pw==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-2.0.1.tgz",
+ "integrity": "sha512-2SL5Y8iODNX10y9T3CBLhHjSXo4afnA1BK82m4sNfZebuVO+o34bxewqwod9xfWq9xhTZmOSFZ+n+lgTKRv+CQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/dts-plugin": "2.0.0",
- "@module-federation/sdk": "2.0.0",
+ "@module-federation/dts-plugin": "2.0.1",
+ "@module-federation/sdk": "2.0.1",
"chalk": "3.0.0",
"commander": "11.1.0",
"jiti": "2.4.2"
@@ -6758,14 +6813,14 @@
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/data-prefetch": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-2.0.0.tgz",
- "integrity": "sha512-KPyZoqNrb5WgFY2owYnMaO2Mg2DYD6KXLVI7GPguj7Z/4pPKEC+SUjWU2FuSfTeyE6ZIi0iFGdwerxzlQ6nfmw==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-2.0.1.tgz",
+ "integrity": "sha512-Kq0P1OABGt6QAvs6TaE/zY9Ut9Y/oJFrzoSF3eWaCYbUAr2KD2SpTyMsPz4ssBzjeKXTgimugh6tHHd6mpCBIQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/runtime": "2.0.0",
- "@module-federation/sdk": "2.0.0",
+ "@module-federation/runtime": "2.0.1",
+ "@module-federation/sdk": "2.0.1",
"fs-extra": "9.1.0"
},
"peerDependencies": {
@@ -6782,16 +6837,16 @@
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/dts-plugin": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-2.0.0.tgz",
- "integrity": "sha512-YyYMgLNARKdf3FLihnIzzUTgafHrqzR9YnKPmrfuCm2Jit+USqFT4QO58hcb0F5KSEyjB2ARPz9RM4XAVZhzMg==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-2.0.1.tgz",
+ "integrity": "sha512-PLneTsf1fQS5/RTBedtLAAmCPRdMfIlhfJkOa8QH3WDJaQsqm8Wb3r2cTUBf2aNj/bP3aH/y6Hs9JFB/4x0l5g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/error-codes": "2.0.0",
- "@module-federation/managers": "2.0.0",
- "@module-federation/sdk": "2.0.0",
- "@module-federation/third-party-dts-extractor": "2.0.0",
+ "@module-federation/error-codes": "2.0.1",
+ "@module-federation/managers": "2.0.1",
+ "@module-federation/sdk": "2.0.1",
+ "@module-federation/third-party-dts-extractor": "2.0.1",
"adm-zip": "^0.5.10",
"ansi-colors": "^4.1.3",
"axios": "^1.12.0",
@@ -6816,23 +6871,23 @@
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/enhanced": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-2.0.0.tgz",
- "integrity": "sha512-xeVrGvypYMvN8gJulbro3j1t8+aS1f9xjj4quwAAqgJF0Nz8bt7sXUYJyjUHPmC2UZsShZ0GnPHJNtI8/2GYjA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@module-federation/bridge-react-webpack-plugin": "2.0.0",
- "@module-federation/cli": "2.0.0",
- "@module-federation/data-prefetch": "2.0.0",
- "@module-federation/dts-plugin": "2.0.0",
- "@module-federation/error-codes": "2.0.0",
- "@module-federation/inject-external-runtime-core-plugin": "2.0.0",
- "@module-federation/managers": "2.0.0",
- "@module-federation/manifest": "2.0.0",
- "@module-federation/rspack": "2.0.0",
- "@module-federation/runtime-tools": "2.0.0",
- "@module-federation/sdk": "2.0.0",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-2.0.1.tgz",
+ "integrity": "sha512-EZIARQ/8ScoTP6PV8+E4SsmMYWK4ErrikZJ0G/FX8wvK8mCtdoKatFtvDN9++P6Nl78kN9zHYgAV4AHKdBVjfQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@module-federation/bridge-react-webpack-plugin": "2.0.1",
+ "@module-federation/cli": "2.0.1",
+ "@module-federation/data-prefetch": "2.0.1",
+ "@module-federation/dts-plugin": "2.0.1",
+ "@module-federation/error-codes": "2.0.1",
+ "@module-federation/inject-external-runtime-core-plugin": "2.0.1",
+ "@module-federation/managers": "2.0.1",
+ "@module-federation/manifest": "2.0.1",
+ "@module-federation/rspack": "2.0.1",
+ "@module-federation/runtime-tools": "2.0.1",
+ "@module-federation/sdk": "2.0.1",
"btoa": "^1.2.1",
"schema-utils": "^4.3.0",
"upath": "2.0.1"
@@ -6858,62 +6913,62 @@
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/error-codes": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-2.0.0.tgz",
- "integrity": "sha512-9oE+hXuPv2zej7AxJ5hOgeRqlPs98meooV2FiutTfftLAyy2N6+Kwmmz5NR9d9t91weJj8N0cSHFoyenNHKTVg==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-2.0.1.tgz",
+ "integrity": "sha512-2bJF/ft+qL9L6Zvq2t/G9/f/0wFL73cM8/NJ04uyYz9BjIgvx28K5qu8/6+IwgEEKATG7vOhBBVj6wH3S+5ASA==",
"dev": true,
"license": "MIT"
},
"node_modules/@module-federation/node/node_modules/@module-federation/inject-external-runtime-core-plugin": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-2.0.0.tgz",
- "integrity": "sha512-aZ6f4UU7KM5zBnHf3xsb2guqsfaEd6IlmuldbpED3JPk4ITwZk0DbvxRMr4prde7cfj8RH0nKMz2kmMncp+lIQ==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-2.0.1.tgz",
+ "integrity": "sha512-oAA7G+4GCHM+WRYfscR/x4GwCyM9CEqfdD9/x2L6y8mtLWK9anRLKTocsI759AvzXsbT1m3EQ5ki1O6wlwDu3g==",
"dev": true,
"license": "MIT",
"peerDependencies": {
- "@module-federation/runtime-tools": "2.0.0"
+ "@module-federation/runtime-tools": "2.0.1"
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/managers": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-2.0.0.tgz",
- "integrity": "sha512-ZmkRIujH+T3xvkmy04TNvviFH8xFOrNeKCLb4tlH4ifU/kLfjTu+PYO/KAEIsgtmrDnd52zTf22dg3ok85OAHA==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-2.0.1.tgz",
+ "integrity": "sha512-KR01lSlcYRQ9C6hW2a8CQQtAE0LvfTLgtV/6ZNUTagw8sRfeDln+ggrZsYilKu9zl0i8RPDgpv/kS60o4lcxCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/sdk": "2.0.0",
+ "@module-federation/sdk": "2.0.1",
"find-pkg": "2.0.0",
"fs-extra": "9.1.0"
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/manifest": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-2.0.0.tgz",
- "integrity": "sha512-AXwYyGiDJdfP9MteKyIdJrLwG5tp4qKaq0uOPiWHilYN3/21G0DM7f30HgJqgx3WSTFSh7hcq0a3V3EZHH/9TA==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-2.0.1.tgz",
+ "integrity": "sha512-p8nYGjHWp17MsYdW/Vv0ogBDiTTsI1PHWPQbvVIqLQXDqwiesaRSRR1zziECXQoEL8lV5Bs+uSkcaJGhea9P+A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/dts-plugin": "2.0.0",
- "@module-federation/managers": "2.0.0",
- "@module-federation/sdk": "2.0.0",
+ "@module-federation/dts-plugin": "2.0.1",
+ "@module-federation/managers": "2.0.1",
+ "@module-federation/sdk": "2.0.1",
"chalk": "3.0.0",
"find-pkg": "2.0.0"
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/rspack": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-2.0.0.tgz",
- "integrity": "sha512-1kziarKrPRM+rJax/AaMEZTwu7ORGed2xSxfdoP9GEbAFEGyNliadvw4kB6PqAfLad3PI4lQMX2vGMLI1KoyVQ==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-2.0.1.tgz",
+ "integrity": "sha512-SAlNE8iclFmzrKtx3/C2GivXYx6nPzx4MgQV01QG/a4LpnLbwlxzdZu3rqQ2swp4NNWT/t/GT7Y+7gfhyVa7mg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/bridge-react-webpack-plugin": "2.0.0",
- "@module-federation/dts-plugin": "2.0.0",
- "@module-federation/inject-external-runtime-core-plugin": "2.0.0",
- "@module-federation/managers": "2.0.0",
- "@module-federation/manifest": "2.0.0",
- "@module-federation/runtime-tools": "2.0.0",
- "@module-federation/sdk": "2.0.0",
+ "@module-federation/bridge-react-webpack-plugin": "2.0.1",
+ "@module-federation/dts-plugin": "2.0.1",
+ "@module-federation/inject-external-runtime-core-plugin": "2.0.1",
+ "@module-federation/managers": "2.0.1",
+ "@module-federation/manifest": "2.0.1",
+ "@module-federation/runtime-tools": "2.0.1",
+ "@module-federation/sdk": "2.0.1",
"btoa": "1.2.1"
},
"peerDependencies": {
@@ -6931,50 +6986,50 @@
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/runtime": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-2.0.0.tgz",
- "integrity": "sha512-vPxQrmQNq3Z1T+1fkHEvFwTdJq9wuCLvdp/lpu9k2Oy7QP/Pj6QoQ/S7J5MCIAoRwj8Wj3z3ma21/DyHwLGvzA==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-2.0.1.tgz",
+ "integrity": "sha512-UQ72P5Oo40dS6vdhHetwTtIsbGciEr+bjoYvDgh1WLPfFlTYd8zo9cLfqaf3juuPfV3cMVARAVPmh16lQYpUGA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/error-codes": "2.0.0",
- "@module-federation/runtime-core": "2.0.0",
- "@module-federation/sdk": "2.0.0"
+ "@module-federation/error-codes": "2.0.1",
+ "@module-federation/runtime-core": "2.0.1",
+ "@module-federation/sdk": "2.0.1"
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/runtime-core": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-2.0.0.tgz",
- "integrity": "sha512-UhIGUs7Mg+TwMI2lgaLnj4UehpoyXbR7HDb2+vLikgBulPmFtodeWfsxCgENEwKsIY1vS0lOun15lNOn1vo3Xg==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-2.0.1.tgz",
+ "integrity": "sha512-gOuCPSHoQGUGwlxfSTMInFX+QvLxdEWegGGMiLdU5vqbXuva4E9M+kXBBO7/0MkcBPMmVs0wOJGm0XOLeV2f1Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/error-codes": "2.0.0",
- "@module-federation/sdk": "2.0.0"
+ "@module-federation/error-codes": "2.0.1",
+ "@module-federation/sdk": "2.0.1"
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/runtime-tools": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-2.0.0.tgz",
- "integrity": "sha512-eMDQN4hYpwvUnCNMjfQdtPVzYaO2DdauemHVc4HnyibgqijRzBwJh9bI2ph4R1xfYEm18+QmTrfXrRlaK2Xizw==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-2.0.1.tgz",
+ "integrity": "sha512-AStdwBtsGB3jIfDg9oP+KyVPsimdaeHsP855gqCxDp1hi2+GKjlZWZx9ThkS8NytVSXSUysxqoUL1ivDoKgcCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/runtime": "2.0.0",
- "@module-federation/webpack-bundler-runtime": "2.0.0"
+ "@module-federation/runtime": "2.0.1",
+ "@module-federation/webpack-bundler-runtime": "2.0.1"
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/sdk": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-2.0.0.tgz",
- "integrity": "sha512-JYd1wTulsaoLT7HTk2oXL5y5797Z+H4mzxuUEKnSJo7R34RZSqehsqPSND7n0HT/1nf7uyn0Rb4qBfR3BVvdHQ==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-2.0.1.tgz",
+ "integrity": "sha512-32PwudojGjog51cwpTali7D6ud82oVgsyvOx9JjAzhvXBX96YI4mRsursuWcthDxmigJP9ZvUTXDuRUEDh1OQA==",
"dev": true,
"license": "MIT"
},
"node_modules/@module-federation/node/node_modules/@module-federation/third-party-dts-extractor": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-2.0.0.tgz",
- "integrity": "sha512-B99+Wkbd2xIodVTjNCeFtFC89Uh2/AtYkSESlz4+6Cec42wyqrGxyfYm4qRY0LhJI+YmZXLk/RTm85m15eBKKg==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-2.0.1.tgz",
+ "integrity": "sha512-neKSr6FNUeGRh+YR57l/QZUzPytJXuJx+babF7j5iGJG3FP+kfizr6QD0hgVis5KEoXMVbQ8yyvG0slERizeyw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6984,14 +7039,14 @@
}
},
"node_modules/@module-federation/node/node_modules/@module-federation/webpack-bundler-runtime": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-2.0.0.tgz",
- "integrity": "sha512-XxiFR/A1G1fa9hTyylWNbs6yEU2hC7FqHAArFptD4U9qp/xyoLgqbK4M8LwltOAyAM8hRofcMdSyiRKVlWqAfQ==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-2.0.1.tgz",
+ "integrity": "sha512-u1NId3SF4lHDTmD2CHFEszulmXmIq1TGw9JYvnLx5rKJL7xt3aNxcb1GvkaYbRNVBXhSMjJ75E5LsQlZzyBx9A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@module-federation/runtime": "2.0.0",
- "@module-federation/sdk": "2.0.0"
+ "@module-federation/runtime": "2.0.1",
+ "@module-federation/sdk": "2.0.1"
}
},
"node_modules/@module-federation/node/node_modules/jiti": {
@@ -8396,20 +8451,20 @@
}
},
"node_modules/@nx/angular": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-22.4.5.tgz",
- "integrity": "sha512-mwffAG7qhElwtWCEIaH7bTJuE3foaFBa3LWReqNc9HkIZmka0BDHRReg3wyhfSGq4ZQlYXK5sQS2uDJd+Qj97Q==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-22.5.3.tgz",
+ "integrity": "sha512-Z5vNcPl95CsTnRhDszWZ0ort22dEtMxdqJFkVzdNwolhfiLm1eKP2Rc8q9MnUdrZMeTqDKnCckG2qs12FZrIkw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nx/devkit": "22.4.5",
- "@nx/eslint": "22.4.5",
- "@nx/js": "22.4.5",
- "@nx/module-federation": "22.4.5",
- "@nx/rspack": "22.4.5",
- "@nx/web": "22.4.5",
- "@nx/webpack": "22.4.5",
- "@nx/workspace": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/eslint": "22.5.3",
+ "@nx/js": "22.5.3",
+ "@nx/module-federation": "22.5.3",
+ "@nx/rspack": "22.5.3",
+ "@nx/web": "22.5.3",
+ "@nx/webpack": "22.5.3",
+ "@nx/workspace": "22.5.3",
"@phenomnomnominal/tsquery": "~6.1.4",
"@typescript-eslint/type-utils": "^8.0.0",
"enquirer": "~2.3.6",
@@ -8457,15 +8512,15 @@
}
},
"node_modules/@nx/cypress": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/cypress/-/cypress-22.4.5.tgz",
- "integrity": "sha512-FAGLQa7dnMW5Z93bS5isw9WgVNapCOgRFgxl9sA1ePstte3Vh0ajRpvVjVoeVHyA3qg6aQbE41ctErOdq/p5bg==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/cypress/-/cypress-22.5.3.tgz",
+ "integrity": "sha512-0jIYOhU1sFv5w2NYmyxIdpT4pC7QvUphrM4QLyUk8nEfO5gwfmON7JLNbtDveX+FeGpjy1zDjoBdd2OBzqUEcA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nx/devkit": "22.4.5",
- "@nx/eslint": "22.4.5",
- "@nx/js": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/eslint": "22.5.3",
+ "@nx/js": "22.5.3",
"@phenomnomnominal/tsquery": "~6.1.4",
"detect-port": "^1.5.1",
"semver": "^7.6.3",
@@ -8482,16 +8537,16 @@
}
},
"node_modules/@nx/devkit": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-22.4.5.tgz",
- "integrity": "sha512-mw5G6k/XTkL675eVIcFpyZdfdIc3wQMSSGWzfA6tQGmANDYc/NFGeZR9wDqXDceHXnYKoRO6g6GhKTOHUCW23Q==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-22.5.3.tgz",
+ "integrity": "sha512-zhRNTFsi4pbwg7L/zhBHtTOSevlgwm1iKlhPlQWoOv2PR6b+3JvjL8o4P1MbkIkut3Lsn+oTuJJ1LUPlr5vprg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@zkochan/js-yaml": "0.0.7",
"ejs": "^3.1.7",
"enquirer": "~2.3.6",
- "minimatch": "10.1.1",
+ "minimatch": "10.2.1",
"semver": "^7.6.3",
"tslib": "^2.3.0",
"yargs-parser": "21.1.1"
@@ -8500,14 +8555,37 @@
"nx": ">= 21 <= 23 || ^22.0.0-0"
}
},
+ "node_modules/@nx/devkit/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/@nx/devkit/node_modules/brace-expansion": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz",
+ "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
"node_modules/@nx/devkit/node_modules/minimatch": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
- "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
+ "version": "10.2.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.1.tgz",
+ "integrity": "sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
- "@isaacs/brace-expansion": "^5.0.0"
+ "brace-expansion": "^5.0.2"
},
"engines": {
"node": "20 || >=22"
@@ -8517,33 +8595,33 @@
}
},
"node_modules/@nx/docker": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/docker/-/docker-22.4.5.tgz",
- "integrity": "sha512-ZgBjd/HCgqkulYJwUH+xQvgsoupVD+2leiFmK5lFjb6IDny/W1uB3EVL5BZxrz8ftMoqiq+AP6Ubiaj99V4hzQ==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/docker/-/docker-22.5.3.tgz",
+ "integrity": "sha512-4BO1hAyun2MM15w1oldUZtCvZEZlDXOCeEkimVij9znk6t4FUBnH7v87Uj4w5dhJAWB7yJFgQbF5w1fZbhRXfw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nx/devkit": "22.4.5",
+ "@nx/devkit": "22.5.3",
"enquirer": "~2.3.6",
"tslib": "^2.3.0"
}
},
"node_modules/@nx/eslint": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-22.4.5.tgz",
- "integrity": "sha512-/N/kG86gqagDziC7Ij/WwAnjjXx55E1Jbpp3kkau3Ncj+wjPoLqCebpg6aW83VJQ7a4SUU0BO3U5bkqQZPGBXQ==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-22.5.3.tgz",
+ "integrity": "sha512-XJKpwnSJRCat+81sUDdJWWvKz3vKo/3X9oHMGDzTYx3mexCgKgpmHBuRVgnZ9n2IVDx8S5ye4ICc9qiY6oHWIA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nx/devkit": "22.4.5",
- "@nx/js": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/js": "22.5.3",
"semver": "^7.6.3",
"tslib": "^2.3.0",
"typescript": "~5.9.2"
},
"peerDependencies": {
"@zkochan/js-yaml": "0.0.7",
- "eslint": "^8.0.0 || ^9.0.0"
+ "eslint": "^8.0.0 || ^9.0.0 || ^10.0.0"
},
"peerDependenciesMeta": {
"@zkochan/js-yaml": {
@@ -8552,14 +8630,14 @@
}
},
"node_modules/@nx/eslint-plugin": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-22.4.5.tgz",
- "integrity": "sha512-Kb3owVrbhRkJAjqEDsgDs8eSlI2/uEFOS35a8Z1drHIpMF6Zt9OHQf6bKELeXzG3fC2AGM3pyunauhbJ/ZmqMw==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-22.5.3.tgz",
+ "integrity": "sha512-dFz3nSUOV+VLc+ZQxWncKINhych6h5oEfInWp1+5WkeUBW5/x77IsM3Hpq1JrjAK6dqXjmzTsFnoU8c5Cf1Q4w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nx/devkit": "22.4.5",
- "@nx/js": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/js": "22.5.3",
"@phenomnomnominal/tsquery": "~6.1.4",
"@typescript-eslint/type-utils": "^8.0.0",
"@typescript-eslint/utils": "^8.0.0",
@@ -8611,22 +8689,22 @@
}
},
"node_modules/@nx/jest": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-22.4.5.tgz",
- "integrity": "sha512-qlEJc0Jbp8E14g7+piHH8DXsAm6C3w1CLuvtE57+LFMhM2zbBDiQ8oeXBdFPEHLCfpbSK/4yCSEmkUj1Yyrs2A==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-22.5.3.tgz",
+ "integrity": "sha512-4yaGlApTR09zdz4fC4Ep0aENcaon5rDRDOUnEJblU67ik35jds9mczHq2rBMJO4Cnjj1pM9acm08Vb0Wg+9cuQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/reporters": "^30.0.2",
"@jest/test-result": "^30.0.2",
- "@nx/devkit": "22.4.5",
- "@nx/js": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/js": "22.5.3",
"@phenomnomnominal/tsquery": "~6.1.4",
"identity-obj-proxy": "3.0.0",
"jest-config": "^30.0.2",
"jest-resolve": "^30.0.2",
"jest-util": "^30.0.2",
- "minimatch": "10.1.1",
+ "minimatch": "10.2.1",
"picocolors": "^1.1.0",
"resolve.exports": "2.0.3",
"semver": "^7.6.3",
@@ -8634,14 +8712,37 @@
"yargs-parser": "21.1.1"
}
},
+ "node_modules/@nx/jest/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/@nx/jest/node_modules/brace-expansion": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz",
+ "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
"node_modules/@nx/jest/node_modules/minimatch": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
- "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
+ "version": "10.2.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.1.tgz",
+ "integrity": "sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
- "@isaacs/brace-expansion": "^5.0.0"
+ "brace-expansion": "^5.0.2"
},
"engines": {
"node": "20 || >=22"
@@ -8651,9 +8752,9 @@
}
},
"node_modules/@nx/js": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/js/-/js-22.4.5.tgz",
- "integrity": "sha512-t8972z2uF6X5i4FFmTlnvSwwxfHkk87zBpKQK0yMH5CzOENViVFNbiPnbvCIJcGNrgVUSALL3f2ngwKcTZObmA==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/js/-/js-22.5.3.tgz",
+ "integrity": "sha512-gglQYL6GeSH0mt6NpEFTXMFFFePU3B7TEyZq7LLUYZDH5y65izgNpdSAuEqYR7xHLtahVnesDlhPw3rtRiwMwA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -8664,8 +8765,8 @@
"@babel/preset-env": "^7.23.2",
"@babel/preset-typescript": "^7.22.5",
"@babel/runtime": "^7.22.6",
- "@nx/devkit": "22.4.5",
- "@nx/workspace": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/workspace": "22.5.3",
"@zkochan/js-yaml": "0.0.7",
"babel-plugin-const-enum": "^1.0.1",
"babel-plugin-macros": "^3.1.0",
@@ -8739,18 +8840,18 @@
}
},
"node_modules/@nx/module-federation": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-22.4.5.tgz",
- "integrity": "sha512-aNO595Xk0B4av9tpAaePF0jjDooAiXN34xEpFleSCmf8y31371JfkI8WMSnIZLa5ehyk1U+oMxHyYtt7v0RFWw==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-22.5.3.tgz",
+ "integrity": "sha512-dKRkT/ULV+nXr7O25YMDwQu/4nxl27AcHJfOmVBVKquXrtrBu/d6dbypfFDMyr5pXqR5gb2euEw0mGVMyHLTiA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@module-federation/enhanced": "^0.21.2",
"@module-federation/node": "^2.7.21",
"@module-federation/sdk": "^0.21.2",
- "@nx/devkit": "22.4.5",
- "@nx/js": "22.4.5",
- "@nx/web": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/js": "22.5.3",
+ "@nx/web": "22.5.3",
"@rspack/core": "1.6.8",
"express": "^4.21.2",
"http-proxy-middleware": "^3.0.5",
@@ -9061,41 +9162,41 @@
}
},
"node_modules/@nx/nest": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-22.4.5.tgz",
- "integrity": "sha512-cFufm3cPuy7Cj10D8BB2Y+Vo1w/1ihQGeduXprC0gs719dI5zvyG8bVOYJ+m87HHdFVQ8ckIVVifO6T7ujWgFw==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-22.5.3.tgz",
+ "integrity": "sha512-DShcD4HdaABg9L7/qgLVgZj0LLSaaYa7Rrj8zquMGGZXrxozCTKzn/7vWrN7Am9hY4wEwaXTXwauHAFoIj9C9A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@nestjs/schematics": "^11.0.0",
- "@nx/devkit": "22.4.5",
- "@nx/eslint": "22.4.5",
- "@nx/js": "22.4.5",
- "@nx/node": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/eslint": "22.5.3",
+ "@nx/js": "22.5.3",
+ "@nx/node": "22.5.3",
"tslib": "^2.3.0"
}
},
"node_modules/@nx/node": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/node/-/node-22.4.5.tgz",
- "integrity": "sha512-ZYN3uIeUs0jKPX9Io75DkISMo5ha15djVLPNFhsh6qgQkL7+mqXGeW3QiEso16XZqbl0Iw2Ye5msrBO6UShFkQ==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/node/-/node-22.5.3.tgz",
+ "integrity": "sha512-szdpsyRUzXBhMIiEk+zI3XPP/e0U1wNmIzkvgCS1e+ejsA1jq0EF5sppkdwJEQVAb6O5hiCPKED+1sSo4TR4/A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nx/devkit": "22.4.5",
- "@nx/docker": "22.4.5",
- "@nx/eslint": "22.4.5",
- "@nx/jest": "22.4.5",
- "@nx/js": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/docker": "22.5.3",
+ "@nx/eslint": "22.5.3",
+ "@nx/jest": "22.5.3",
+ "@nx/js": "22.5.3",
"kill-port": "^1.6.1",
"tcp-port-used": "^1.0.2",
"tslib": "^2.3.0"
}
},
"node_modules/@nx/nx-darwin-arm64": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-22.4.5.tgz",
- "integrity": "sha512-zdRHZv1AMvzgp+5g2VZNXXuqk0/n1wOFksOeZ6BRyKg6hC2YkjGyn5xle/UK668MDAwe9KKm4jizvztK/LlPuA==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-22.5.3.tgz",
+ "integrity": "sha512-cKXBq5bJanXp8uv6+wPvx/G4q4oFpOxMSPGaeFOVhbul2QHGGq+XMcSo+D8aYJCsk1YnbyAnnQ8r8RH/kTK5Mw==",
"cpu": [
"arm64"
],
@@ -9107,9 +9208,9 @@
]
},
"node_modules/@nx/nx-darwin-x64": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-22.4.5.tgz",
- "integrity": "sha512-1NVWaSgpa8yawi2UILX4NE9UcMuNzAAGh95JSV2yJovRfKxFQgQSB6hj0gpJu+TLLVCroTqy4woSQ2a0SPodeQ==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-22.5.3.tgz",
+ "integrity": "sha512-mToS41o8I+8CfxYVRMTISkgT7I1cnazgwMf7U9DoLqKOwOZzj9WD3NmsWc1h69QNJPltbeRPS8y/wnhu7RHzRA==",
"cpu": [
"x64"
],
@@ -9121,9 +9222,9 @@
]
},
"node_modules/@nx/nx-freebsd-x64": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-22.4.5.tgz",
- "integrity": "sha512-baaLz53wr/HsVfSJ7ZgIFCPAb/OtP7yPPasb3eIu65oVhSswGfgvz9+YINhuInUgW7x7STmRnhGeR8pj6iqFqw==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-22.5.3.tgz",
+ "integrity": "sha512-CAWysdFSZVbTfdjNXojd9TgXbZiK9i0k3njROeV+jORsDWw4Eth3PDmK94Wk916b3n2hS0UjyI6RZaMy2GEqzA==",
"cpu": [
"x64"
],
@@ -9135,9 +9236,9 @@
]
},
"node_modules/@nx/nx-linux-arm-gnueabihf": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-22.4.5.tgz",
- "integrity": "sha512-wRBPv/l39tz+sQjZUH4hygCsd/DoUXUbDYkR6lnNXWHAVyPUh48/27JozM8hD3o/G3O2Vd8PFQasIXtvy2GS0Q==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-22.5.3.tgz",
+ "integrity": "sha512-PRjPrijQQbdrvYwNuA3xQ3VXEQ4zfhnPjy+S2ZlQZqhFI4mlP22xfhOH1bQ7pIfzCNC2f/J9UMNYOrq/bEFjBg==",
"cpu": [
"arm"
],
@@ -9149,9 +9250,9 @@
]
},
"node_modules/@nx/nx-linux-arm64-gnu": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-22.4.5.tgz",
- "integrity": "sha512-6B/yCFiqjvV2Bkz6MKUtfFWjwtiF53DN07K1BFksMpQef+h2yE1IrGaG/OCl6VaVl4VRzQgLOluqP96M1yhDgg==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-22.5.3.tgz",
+ "integrity": "sha512-dmDBio/5z4Zch2VlRMdgBPm53d8xwq1l7xLj1dFMKjfE7ByfPukjPM7ZEYBiPckfiQfJBRh6HKDN7uEkA/y8CQ==",
"cpu": [
"arm64"
],
@@ -9163,9 +9264,9 @@
]
},
"node_modules/@nx/nx-linux-arm64-musl": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-22.4.5.tgz",
- "integrity": "sha512-n0v60vRYn7BDHWB588snPZntLO2XC8/pvLd+QunneM2VGEPf51n5llX5U3AwTt/ybaZHWhbuHv0sJBIbT4I0GA==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-22.5.3.tgz",
+ "integrity": "sha512-E81ET/MnnKfuLhKiovF5ueJirHOMjhC1eK0MDM2Do9wdPyusZzfGSVFQ9DOHtg7L37dAE95NNd1lCVO8gJ96vg==",
"cpu": [
"arm64"
],
@@ -9177,9 +9278,9 @@
]
},
"node_modules/@nx/nx-linux-x64-gnu": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-22.4.5.tgz",
- "integrity": "sha512-zT7nb1PRE3NcW/HFnbgKJ9ZPtCOeVDpbJ5J4ZhHj36ZAUWZVXFEIPq9VTIZFy5+0pioLUIClQQY7OUfwnV/Zig==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-22.5.3.tgz",
+ "integrity": "sha512-AgXCsPCzC0sAu2VRclMjs7LrvPQfqS3sFiehlXWTbNHQitPZLuAmQGb2l4T8lbMOs0Xn3EIrg6BF6/ntTTp6Xg==",
"cpu": [
"x64"
],
@@ -9191,9 +9292,9 @@
]
},
"node_modules/@nx/nx-linux-x64-musl": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-22.4.5.tgz",
- "integrity": "sha512-r8Rls5BS7lGQbUNX1Z1S370XrOacOU1bQ/dxY8i7qahFQKnMwpFo0W8odhgzjk+vrC/WLf9jOgz5/JPzehQBIw==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-22.5.3.tgz",
+ "integrity": "sha512-sKs4bFQRu8Btxf5rMYKPsRVNxkQ2ey8sqoCyhJj8fwJF05DayK2ErJAR/rhtBK0c1NV7kQiKJA8nWBV3jnCdsg==",
"cpu": [
"x64"
],
@@ -9205,9 +9306,9 @@
]
},
"node_modules/@nx/nx-win32-arm64-msvc": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-22.4.5.tgz",
- "integrity": "sha512-Lv81LTnG6sSvBOq2vDSeyfzpF9X0cTGlJdzJOJzPZXCZGFhTV1ig9TdLiij/GM2JwV4Kvq5Co6YzA5dxtGUphQ==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-22.5.3.tgz",
+ "integrity": "sha512-KOCQLakSO5vl4D6et9qPytOAmkgq2IIuhI8A/g0xbD1LqrIlRPa+bdkZqOGpODYAk3NyKAk7hWHsqfXKHwwX6w==",
"cpu": [
"arm64"
],
@@ -9219,9 +9320,9 @@
]
},
"node_modules/@nx/nx-win32-x64-msvc": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-22.4.5.tgz",
- "integrity": "sha512-52RfBcq9PXt76soCAZAJcNmCYrdsg6BvhBmjf0IFTMZ8IaeqZ9ktxAy1TZf/gCkOaM3ly4htbYMStiZ4MHX7Eg==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-22.5.3.tgz",
+ "integrity": "sha512-a6ZB2La82RIHcz4nrt3H6RZaOa+xkC2IPzhU9hMo2gbkLdIxn8wyof8uGA0frncmIVHuLc3nFAhpBOgf4j6tMA==",
"cpu": [
"x64"
],
@@ -9233,16 +9334,16 @@
]
},
"node_modules/@nx/rspack": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/rspack/-/rspack-22.4.5.tgz",
- "integrity": "sha512-pqaJ713Jv82abDGisArEtKprAO0DuGxp7zddwpYW04J4Y8YmRAQFA3KriMPqjWTXuV3l4kpaqU7FtZ/3Xn1ShA==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/rspack/-/rspack-22.5.3.tgz",
+ "integrity": "sha512-2T5dkoC08FJGF8ZMiJDaKN6giXAljV0+LK7q5GJpSEUm+wtjZ/DRVoWSnlf8Dj/e0/cLb2GMElVcfjyDDDeV9w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nx/devkit": "22.4.5",
- "@nx/js": "22.4.5",
- "@nx/module-federation": "22.4.5",
- "@nx/web": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/js": "22.5.3",
+ "@nx/module-federation": "22.5.3",
+ "@nx/web": "22.5.3",
"@phenomnomnominal/tsquery": "~6.1.4",
"@rspack/core": "1.6.8",
"@rspack/dev-server": "^1.1.4",
@@ -9664,16 +9765,16 @@
}
},
"node_modules/@nx/storybook": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/storybook/-/storybook-22.4.5.tgz",
- "integrity": "sha512-cxJDYpfpYcK0iuiJMHk6InLXXNLedj8VlOkRtcnZKuwDlC8quMSOuHKrdvBOjeOLV4C390/94BlzkToUZSey6g==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/storybook/-/storybook-22.5.3.tgz",
+ "integrity": "sha512-eP7cpRKnC1oYlOjSZU07Kf8BV8hNRPPXRib7BVdwwIUZ2v4K/b/cje2WCG729q4gk8fyoV8o7JNVgM+QGT8kBQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nx/cypress": "22.4.5",
- "@nx/devkit": "22.4.5",
- "@nx/eslint": "22.4.5",
- "@nx/js": "22.4.5",
+ "@nx/cypress": "22.5.3",
+ "@nx/devkit": "22.5.3",
+ "@nx/eslint": "22.5.3",
+ "@nx/js": "22.5.3",
"@phenomnomnominal/tsquery": "~6.1.4",
"semver": "^7.6.3",
"tslib": "^2.3.0"
@@ -9683,14 +9784,14 @@
}
},
"node_modules/@nx/web": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/web/-/web-22.4.5.tgz",
- "integrity": "sha512-VXXkONZS7DEDDKUE8EUCiV7XhC+HmotExPKznU6NquoFpBZqvWCfC0rt/gKk2uIxJGu8qoISqtIIHFc6iO65RA==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/web/-/web-22.5.3.tgz",
+ "integrity": "sha512-Z7FYN5e9HIJAuJV0MU8jHaoEv9vgiLbpe1bbWPItfzIy02kWtSiS/aGZcLa34LDuWBfBaJVHZqFVp7OOPU26ew==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nx/devkit": "22.4.5",
- "@nx/js": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/js": "22.5.3",
"detect-port": "^1.5.1",
"http-server": "^14.1.0",
"picocolors": "^1.1.0",
@@ -9698,15 +9799,15 @@
}
},
"node_modules/@nx/webpack": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-22.4.5.tgz",
- "integrity": "sha512-3NZnJwkP1ztPc4Inz0g04rWf78P3U2np/kg3nKNf2I6kowWpcJakQCsWLufBzP48ooUtE3iPDVQoFIo3SgWqDg==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-22.5.3.tgz",
+ "integrity": "sha512-fEWvmynjxAfdyCH00Z3oaEedv/wKZAdHl8kz7UEiOJ7eKdGbbJIK0RuobXC1r2e2ERZ35vDrOiPYdruyfi35Jg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/core": "^7.23.2",
- "@nx/devkit": "22.4.5",
- "@nx/js": "22.4.5",
+ "@nx/devkit": "22.5.3",
+ "@nx/js": "22.5.3",
"@phenomnomnominal/tsquery": "~6.1.4",
"ajv": "^8.12.0",
"autoprefixer": "^10.4.9",
@@ -9915,17 +10016,17 @@
}
},
"node_modules/@nx/workspace": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-22.4.5.tgz",
- "integrity": "sha512-QGapABrqBnRpEWbnd5UpbVCBzsYD+RlC1lWShXPpCM+dosR3qkGb+pSmxeSCsKbNVtCwYyyuRW+PvlF5Q5sU9A==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-22.5.3.tgz",
+ "integrity": "sha512-pioGwlt5zKB9PhX36I5KAeSml19Mq+g2KyQ9mh3F+3Lvft2JM4nIMELBaUfwPicPAOwNmrsx806IXO67Q4UHxQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@nx/devkit": "22.4.5",
+ "@nx/devkit": "22.5.3",
"@zkochan/js-yaml": "0.0.7",
"chalk": "^4.1.0",
"enquirer": "~2.3.6",
- "nx": "22.4.5",
+ "nx": "22.5.3",
"picomatch": "4.0.2",
"semver": "^7.6.3",
"tslib": "^2.3.0",
@@ -11864,9 +11965,9 @@
"license": "MIT"
},
"node_modules/@rspack/plugin-react-refresh": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.6.0.tgz",
- "integrity": "sha512-OO53gkrte/Ty4iRXxxM6lkwPGxsSsupFKdrPFnjwFIYrPvFLjeolAl5cTx+FzO5hYygJiGnw7iEKTmD+ptxqDA==",
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.6.1.tgz",
+ "integrity": "sha512-eqqW5645VG3CzGzFgNg5HqNdHVXY+567PGjtDhhrM8t67caxmsSzRmT5qfoEIfBcGgFkH9vEg7kzXwmCYQdQDw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -12045,9 +12146,9 @@
"license": "MIT"
},
"node_modules/@stencil/core": {
- "version": "4.38.0",
- "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.38.0.tgz",
- "integrity": "sha512-oC3QFKO0X1yXVvETgc8OLY525MNKhn9vISBrbtKnGoPlokJ6rI8Vk1RK22TevnNrHLI4SExNLbcDnqilKR35JQ==",
+ "version": "4.43.0",
+ "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.43.0.tgz",
+ "integrity": "sha512-6Uj2Z3lzLuufYAE7asZ6NLKgSwsB9uxl84Eh34PASnUjfj32GkrP4DtKK7fNeh1WFGGyffsTDka3gwtl+4reUg==",
"license": "MIT",
"bin": {
"stencil": "bin/stencil"
@@ -12621,25 +12722,28 @@
"license": "MIT"
},
"node_modules/@trivago/prettier-plugin-sort-imports": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-5.2.2.tgz",
- "integrity": "sha512-fYDQA9e6yTNmA13TLVSA+WMQRc5Bn/c0EUBditUHNfMMxN7M82c38b1kEggVE3pLpZ0FwkwJkUEKMiOi52JXFA==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-6.0.2.tgz",
+ "integrity": "sha512-3DgfkukFyC/sE/VuYjaUUWoFfuVjPK55vOFDsxD56XXynFMCZDYFogH2l/hDfOsQAm1myoU/1xByJ3tWqtulXA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@babel/generator": "^7.26.5",
- "@babel/parser": "^7.26.7",
- "@babel/traverse": "^7.26.7",
- "@babel/types": "^7.26.7",
+ "@babel/generator": "^7.28.0",
+ "@babel/parser": "^7.28.0",
+ "@babel/traverse": "^7.28.0",
+ "@babel/types": "^7.28.0",
"javascript-natural-sort": "^0.7.1",
- "lodash": "^4.17.21"
+ "lodash-es": "^4.17.21",
+ "minimatch": "^9.0.0",
+ "parse-imports-exports": "^0.2.4"
},
"engines": {
- "node": ">18.12"
+ "node": ">= 20"
},
"peerDependencies": {
"@vue/compiler-sfc": "3.x",
"prettier": "2.x - 3.x",
+ "prettier-plugin-ember-template-tag": ">= 2.0.0",
"prettier-plugin-svelte": "3.x",
"svelte": "4.x || 5.x"
},
@@ -12647,6 +12751,9 @@
"@vue/compiler-sfc": {
"optional": true
},
+ "prettier-plugin-ember-template-tag": {
+ "optional": true
+ },
"prettier-plugin-svelte": {
"optional": true
},
@@ -12655,6 +12762,32 @@
}
}
},
+ "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/minimatch": {
+ "version": "9.0.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
+ "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/@trysound/sax": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
@@ -12855,6 +12988,16 @@
"@types/node": "*"
}
},
+ "node_modules/@types/cookie-parser": {
+ "version": "1.4.10",
+ "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.10.tgz",
+ "integrity": "sha512-B4xqkqfZ8Wek+rCOeRxsjMS9OgvzebEzzLYw7NHYuvzb7IdxOkI0ZHGgeEBX4PUM7QGVvNSK60T3OvWj3YfBRg==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/express": "*"
+ }
+ },
"node_modules/@types/d3": {
"version": "7.4.3",
"resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz",
@@ -13471,9 +13614,9 @@
}
},
"node_modules/@types/passport-google-oauth20": {
- "version": "2.0.16",
- "resolved": "https://registry.npmjs.org/@types/passport-google-oauth20/-/passport-google-oauth20-2.0.16.tgz",
- "integrity": "sha512-ayXK2CJ7uVieqhYOc6k/pIr5pcQxOLB6kBev+QUGS7oEZeTgIs1odDobXRqgfBPvXzl0wXCQHftV5220czZCPA==",
+ "version": "2.0.17",
+ "resolved": "https://registry.npmjs.org/@types/passport-google-oauth20/-/passport-google-oauth20-2.0.17.tgz",
+ "integrity": "sha512-MHNOd2l7gOTCn3iS+wInPQMiukliAUvMpODO3VlXxOiwNEMSyzV7UNvAdqxSN872o8OXx1SqPDVT6tLW74AtqQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -15146,7 +15289,6 @@
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
"integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
- "dev": true,
"license": "MIT"
},
"node_modules/async-function": {
@@ -15240,14 +15382,14 @@
}
},
"node_modules/axios": {
- "version": "1.13.4",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.4.tgz",
- "integrity": "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==",
+ "version": "1.13.6",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz",
+ "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "follow-redirects": "^1.15.6",
- "form-data": "^4.0.4",
+ "follow-redirects": "^1.15.11",
+ "form-data": "^4.0.5",
"proxy-from-env": "^1.1.0"
}
},
@@ -15550,7 +15692,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true,
"license": "MIT"
},
"node_modules/base64-js": {
@@ -15804,7 +15945,6 @@
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
@@ -16577,14 +16717,14 @@
"license": "MIT"
},
"node_modules/class-validator": {
- "version": "0.14.3",
- "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.3.tgz",
- "integrity": "sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==",
+ "version": "0.15.1",
+ "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.15.1.tgz",
+ "integrity": "sha512-LqoS80HBBSCVhz/3KloUly0ovokxpdOLR++Al3J3+dHXWt9sTKlKd4eYtoxhxyUjoe5+UcIM+5k9MIxyBWnRTw==",
"license": "MIT",
"dependencies": {
"@types/validator": "^13.15.3",
"libphonenumber-js": "^1.11.1",
- "validator": "^13.15.20"
+ "validator": "^13.15.22"
}
},
"node_modules/clean-css": {
@@ -17029,7 +17169,6 @@
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true,
"license": "MIT"
},
"node_modules/confbox": {
@@ -17101,6 +17240,25 @@
"node": ">= 0.6"
}
},
+ "node_modules/cookie-parser": {
+ "version": "1.4.7",
+ "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz",
+ "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==",
+ "license": "MIT",
+ "dependencies": {
+ "cookie": "0.7.2",
+ "cookie-signature": "1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/cookie-parser/node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+ "license": "MIT"
+ },
"node_modules/cookie-signature": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
@@ -17257,9 +17415,9 @@
}
},
"node_modules/countries-list": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/countries-list/-/countries-list-3.2.2.tgz",
- "integrity": "sha512-ABJ/RWQBrPWy+hRuZoW+0ooK8p65Eo3WmUZwHm6v4wmfSPznNAKzjy3+UUYrJK2v3182BVsgWxdB6ROidj39kw==",
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/countries-list/-/countries-list-3.3.0.tgz",
+ "integrity": "sha512-XRUjS+dcZuNh/fg3+mka3bXgcg4TbQZ1gaK5IJqO6qulerBANl1bmrd20P2dgmPkBpP+5FnejiSF1gd7bgAg+g==",
"license": "MIT"
},
"node_modules/countup.js": {
@@ -18497,6 +18655,7 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
"license": "MIT"
},
"node_modules/deepmerge": {
@@ -18988,7 +19147,6 @@
"version": "3.1.10",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
"integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
- "dev": true,
"license": "Apache-2.0",
"dependencies": {
"jake": "^10.8.5"
@@ -19457,6 +19615,37 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/escodegen": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/escodegen/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/eslint": {
"version": "9.35.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz",
@@ -19890,7 +20079,6 @@
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=4.0"
@@ -20238,6 +20426,7 @@
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
"license": "MIT"
},
"node_modules/fast-redact": {
@@ -20398,7 +20587,6 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
"integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
- "dev": true,
"license": "Apache-2.0",
"dependencies": {
"minimatch": "^5.0.1"
@@ -20408,7 +20596,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
@@ -20418,7 +20605,6 @@
"version": "5.1.6",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
"integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
- "dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
@@ -20617,9 +20803,9 @@
"license": "ISC"
},
"node_modules/follow-redirects": {
- "version": "1.15.9",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
- "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
"funding": [
{
"type": "individual",
@@ -20705,9 +20891,9 @@
}
},
"node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -21660,7 +21846,6 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -23306,7 +23491,6 @@
"version": "10.9.2",
"resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz",
"integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==",
- "dev": true,
"license": "Apache-2.0",
"dependencies": {
"async": "^3.2.3",
@@ -23325,7 +23509,6 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
@@ -24807,20 +24990,20 @@
"license": "MIT"
},
"node_modules/jsonpath": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz",
- "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.2.1.tgz",
+ "integrity": "sha512-Jl6Jhk0jG+kP3yk59SSeGq7LFPR4JQz1DU0K+kXTysUhMostbhU3qh5mjTuf0PqFcXpAT7kvmMt9WxV10NyIgQ==",
"license": "MIT",
"dependencies": {
- "esprima": "1.2.2",
- "static-eval": "2.0.2",
- "underscore": "1.12.1"
+ "esprima": "1.2.5",
+ "static-eval": "2.1.1",
+ "underscore": "1.13.6"
}
},
"node_modules/jsonpath/node_modules/esprima": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz",
- "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==",
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz",
+ "integrity": "sha512-S9VbPDU0adFErpDai3qDkjq8+G05ONtKzcyNrPKg/ZKa+tf879nX2KexNU95b31UoTJjRLInNBHHHjFPoCd7lQ==",
"bin": {
"esparse": "bin/esparse.js",
"esvalidate": "bin/esvalidate.js"
@@ -25402,8 +25585,8 @@
"version": "4.17.22",
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.22.tgz",
"integrity": "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==",
- "license": "MIT",
- "optional": true
+ "devOptional": true,
+ "license": "MIT"
},
"node_modules/lodash.clonedeepwith": {
"version": "4.5.0",
@@ -26120,7 +26303,6 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
@@ -26139,11 +26321,11 @@
}
},
"node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
"dev": true,
- "license": "ISC",
+ "license": "BlueOak-1.0.0",
"engines": {
"node": ">=16 || 14 >=14.17"
}
@@ -26567,9 +26749,9 @@
"license": "MIT"
},
"node_modules/ng-extract-i18n-merge": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ng-extract-i18n-merge/-/ng-extract-i18n-merge-3.2.1.tgz",
- "integrity": "sha512-Yq8uEBa32/Imlo+vnyY6rk+h0VOjWQT8r4Vgiw/YlnK0AzIXFxr6H/Ji3gTJKVsuRY6Tt1swBgmnkAUeDmklRw==",
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/ng-extract-i18n-merge/-/ng-extract-i18n-merge-3.3.0.tgz",
+ "integrity": "sha512-9VCi2gMSjvlz5+bvJ9wTzHEeEiVCM0lb/uvGx2K3FavG4p0HKhg0Y9Tjr/Hr23DSHAQQXS0gssIvznWW3DHIXQ==",
"license": "MIT",
"dependencies": {
"@angular-devkit/architect": ">=0.2000.0 <0.2200.0",
@@ -26996,9 +27178,9 @@
"license": "MIT"
},
"node_modules/nx": {
- "version": "22.4.5",
- "resolved": "https://registry.npmjs.org/nx/-/nx-22.4.5.tgz",
- "integrity": "sha512-l68kzhnemXXGCDS9/W8eccZ7Bzse9pw1oJ466pzDM89MbA6hEaOQ0p+eDXZI++iWl0T+lYJ56EDhO23syKzt9g==",
+ "version": "22.5.3",
+ "resolved": "https://registry.npmjs.org/nx/-/nx-22.5.3.tgz",
+ "integrity": "sha512-IaEPqdgaFBIr0Bfmnt6WAcX3t660sOuDXQ71lpoS8GgpD8cqX1LIW2ZyzEAdOvCP1iD6HCZehpofcVvaaL1GNQ==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -27008,12 +27190,12 @@
"@yarnpkg/parsers": "3.0.2",
"@zkochan/js-yaml": "0.0.7",
"axios": "^1.12.0",
- "chalk": "^4.1.0",
"cli-cursor": "3.1.0",
"cli-spinners": "2.6.1",
"cliui": "^8.0.1",
"dotenv": "~16.4.5",
"dotenv-expand": "~11.0.6",
+ "ejs": "^3.1.7",
"enquirer": "~2.3.6",
"figures": "3.2.0",
"flat": "^5.0.2",
@@ -27022,11 +27204,12 @@
"jest-diff": "^30.0.2",
"jsonc-parser": "3.2.0",
"lines-and-columns": "2.0.3",
- "minimatch": "10.1.1",
+ "minimatch": "10.2.1",
"node-machine-id": "1.1.12",
"npm-run-path": "^4.0.1",
"open": "^8.4.0",
"ora": "5.3.0",
+ "picocolors": "^1.1.0",
"resolve.exports": "2.0.3",
"semver": "^7.6.3",
"string-width": "^4.2.3",
@@ -27044,20 +27227,20 @@
"nx-cloud": "bin/nx-cloud.js"
},
"optionalDependencies": {
- "@nx/nx-darwin-arm64": "22.4.5",
- "@nx/nx-darwin-x64": "22.4.5",
- "@nx/nx-freebsd-x64": "22.4.5",
- "@nx/nx-linux-arm-gnueabihf": "22.4.5",
- "@nx/nx-linux-arm64-gnu": "22.4.5",
- "@nx/nx-linux-arm64-musl": "22.4.5",
- "@nx/nx-linux-x64-gnu": "22.4.5",
- "@nx/nx-linux-x64-musl": "22.4.5",
- "@nx/nx-win32-arm64-msvc": "22.4.5",
- "@nx/nx-win32-x64-msvc": "22.4.5"
+ "@nx/nx-darwin-arm64": "22.5.3",
+ "@nx/nx-darwin-x64": "22.5.3",
+ "@nx/nx-freebsd-x64": "22.5.3",
+ "@nx/nx-linux-arm-gnueabihf": "22.5.3",
+ "@nx/nx-linux-arm64-gnu": "22.5.3",
+ "@nx/nx-linux-arm64-musl": "22.5.3",
+ "@nx/nx-linux-x64-gnu": "22.5.3",
+ "@nx/nx-linux-x64-musl": "22.5.3",
+ "@nx/nx-win32-arm64-msvc": "22.5.3",
+ "@nx/nx-win32-x64-msvc": "22.5.3"
},
"peerDependencies": {
- "@swc-node/register": "^1.8.0",
- "@swc/core": "^1.3.85"
+ "@swc-node/register": "^1.11.1",
+ "@swc/core": "^1.15.8"
},
"peerDependenciesMeta": {
"@swc-node/register": {
@@ -27090,6 +27273,29 @@
"tslib": "^2.4.0"
}
},
+ "node_modules/nx/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/nx/node_modules/brace-expansion": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz",
+ "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
"node_modules/nx/node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -27203,13 +27409,13 @@
"license": "MIT"
},
"node_modules/nx/node_modules/minimatch": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
- "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
+ "version": "10.2.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.1.tgz",
+ "integrity": "sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
- "@isaacs/brace-expansion": "^5.0.0"
+ "brace-expansion": "^5.0.2"
},
"engines": {
"node": "20 || >=22"
@@ -27930,6 +28136,16 @@
"node": ">=6"
}
},
+ "node_modules/parse-imports-exports": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz",
+ "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parse-statements": "1.0.11"
+ }
+ },
"node_modules/parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@@ -27983,6 +28199,13 @@
"node": ">=0.10.0"
}
},
+ "node_modules/parse-statements": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz",
+ "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/parse5": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz",
@@ -29956,6 +30179,15 @@
"node": ">=4"
}
},
+ "node_modules/redis-info": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/redis-info/-/redis-info-3.1.0.tgz",
+ "integrity": "sha512-ER4L9Sh/vm63DkIE0bkSjxluQlioBiBgf5w1UuldaW/3vPcecdljVDisZhmnCMvsxHNiARTTDDHGg9cGwTfrKg==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.17.11"
+ }
+ },
"node_modules/redis-parser": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
@@ -30231,15 +30463,15 @@
}
},
"node_modules/replace-in-file": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-8.3.0.tgz",
- "integrity": "sha512-4VhddQiMCPIuypiwHDTM+XHjZoVu9h7ngBbSCnwGRcwdHwxltjt/m//Ep3GDwqaOx1fDSrKFQ+n7uo4uVcEz9Q==",
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-8.4.0.tgz",
+ "integrity": "sha512-D28k8jy2LtUGbCzCnR3znajaTWIjJ/Uee3UdodzcHRxE7zn6NmYW/dcSqyivnsYU3W+MxdX6SbF28NvJ0GRoLA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "chalk": "^5.3.0",
- "glob": "^10.4.2",
- "yargs": "^17.7.2"
+ "chalk": "^5.6.2",
+ "glob": "^13.0.0",
+ "yargs": "^18.0.0"
},
"bin": {
"replace-in-file": "bin/cli.js"
@@ -30248,10 +30480,33 @@
"node": ">=18"
}
},
+ "node_modules/replace-in-file/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/replace-in-file/node_modules/brace-expansion": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz",
+ "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
"node_modules/replace-in-file/node_modules/chalk": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
- "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "version": "5.6.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
+ "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -30261,23 +30516,65 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/replace-in-file/node_modules/yargs": {
- "version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "node_modules/replace-in-file/node_modules/glob": {
+ "version": "13.0.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
+ "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
"dev": true,
- "license": "MIT",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "cliui": "^8.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
- "y18n": "^5.0.5",
- "yargs-parser": "^21.1.1"
+ "minimatch": "^10.2.2",
+ "minipass": "^7.1.3",
+ "path-scurry": "^2.0.2"
},
"engines": {
- "node": ">=12"
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/replace-in-file/node_modules/lru-cache": {
+ "version": "11.2.7",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz",
+ "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/replace-in-file/node_modules/minimatch": {
+ "version": "10.2.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz",
+ "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/replace-in-file/node_modules/path-scurry": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
+ "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/require-directory": {
@@ -32269,103 +32566,12 @@
"license": "MIT"
},
"node_modules/static-eval": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz",
- "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==",
- "license": "MIT",
- "dependencies": {
- "escodegen": "^1.8.1"
- }
- },
- "node_modules/static-eval/node_modules/escodegen": {
- "version": "1.14.3",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
- "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "esprima": "^4.0.1",
- "estraverse": "^4.2.0",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1"
- },
- "bin": {
- "escodegen": "bin/escodegen.js",
- "esgenerate": "bin/esgenerate.js"
- },
- "engines": {
- "node": ">=4.0"
- },
- "optionalDependencies": {
- "source-map": "~0.6.1"
- }
- },
- "node_modules/static-eval/node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/static-eval/node_modules/levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
- "license": "MIT",
- "dependencies": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/static-eval/node_modules/optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
- "license": "MIT",
- "dependencies": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.6",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "word-wrap": "~1.2.3"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/static-eval/node_modules/prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/static-eval/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "license": "BSD-3-Clause",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/static-eval/node_modules/type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz",
+ "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==",
"license": "MIT",
"dependencies": {
- "prelude-ls": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.8.0"
+ "escodegen": "^2.1.0"
}
},
"node_modules/statuses": {
@@ -32720,9 +32926,9 @@
}
},
"node_modules/stripe": {
- "version": "20.3.0",
- "resolved": "https://registry.npmjs.org/stripe/-/stripe-20.3.0.tgz",
- "integrity": "sha512-DYzcmV1MfYhycr1GwjCjeQVYk9Gu8dpxyTlu7qeDCsuguug7oUTxPsUQuZeSf/OPzK7pofqobvOKVqAwlpgf/Q==",
+ "version": "20.4.1",
+ "resolved": "https://registry.npmjs.org/stripe/-/stripe-20.4.1.tgz",
+ "integrity": "sha512-axCguHItc8Sxt0HC6aSkdVRPffjYPV7EQqZRb2GkIa8FzWDycE7nHJM19C6xAIynH1Qp1/BHiopSi96jGBxT0w==",
"license": "MIT",
"engines": {
"node": ">=16"
@@ -32797,7 +33003,6 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
@@ -32826,9 +33031,9 @@
"license": "BSD-2-Clause"
},
"node_modules/svgmap": {
- "version": "2.14.0",
- "resolved": "https://registry.npmjs.org/svgmap/-/svgmap-2.14.0.tgz",
- "integrity": "sha512-+Vklx4DO1uv1SFq6wnJWl/dRjX4uRT9CcsIHuADxAcZ+h5X1OSyDVbNdIu837fx5TtYYuaGRhWuFCXIioN/1ww==",
+ "version": "2.19.2",
+ "resolved": "https://registry.npmjs.org/svgmap/-/svgmap-2.19.2.tgz",
+ "integrity": "sha512-mRqRcQiwwSTh9kTOPhjTmd3ywxA9aTfybBHGAoyuGn9CI9PnAQsuZ7H/2/VEIvgJhi1xM5IGBfk8i4/Ke4iTCQ==",
"license": "MIT",
"dependencies": {
"svg-pan-zoom": "^3.6.2"
@@ -33575,18 +33780,15 @@
}
},
"node_modules/ts-checker-rspack-plugin": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/ts-checker-rspack-plugin/-/ts-checker-rspack-plugin-1.2.6.tgz",
- "integrity": "sha512-aAJIfoNr2cPu8G6mqp/oPoNlUT/LgNoqt2n3SsbxWG0TwQogbjsYsr2f/fdsufUDoGDu8Jolmpf3L4PmIH/cEg==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/ts-checker-rspack-plugin/-/ts-checker-rspack-plugin-1.3.0.tgz",
+ "integrity": "sha512-89oK/BtApjdid1j9CGjPGiYry+EZBhsnTAM481/8ipgr/y2IOgCbW1HPnan+fs5FnzlpUgf9dWGNZ4Ayw3Bd8A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.27.1",
"@rspack/lite-tapable": "^1.1.0",
"chokidar": "^3.6.0",
- "is-glob": "^4.0.3",
- "memfs": "^4.51.1",
- "minimatch": "^9.0.5",
+ "memfs": "^4.56.10",
"picocolors": "^1.1.1"
},
"peerDependencies": {
@@ -33599,16 +33801,6 @@
}
}
},
- "node_modules/ts-checker-rspack-plugin/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
"node_modules/ts-checker-rspack-plugin/node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
@@ -33677,22 +33869,6 @@
"tslib": "2"
}
},
- "node_modules/ts-checker-rspack-plugin/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/ts-checker-rspack-plugin/node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
@@ -34258,9 +34434,9 @@
}
},
"node_modules/underscore": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz",
- "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==",
+ "version": "1.13.6",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
+ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==",
"license": "MIT"
},
"node_modules/undici": {
@@ -35878,6 +36054,7 @@
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
"integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -36028,9 +36205,9 @@
}
},
"node_modules/yahoo-finance2": {
- "version": "3.13.0",
- "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-3.13.0.tgz",
- "integrity": "sha512-czBj2q/MD68YEsB7aXNnGhJvWxYZn01O5r/i7VYiQV2m2sWwhca6tKgjwf/LT7zHHEVxhKNiGLB46glLnmq9Ag==",
+ "version": "3.13.2",
+ "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-3.13.2.tgz",
+ "integrity": "sha512-aAOJEjuLClfDxVPRKxjcwFoyzMr8BE/svgUqr5IjnQR+kppYbKO92Wl3SbAGz5DRghy6FiUfqi5FBDSBA/e2jg==",
"license": "MIT",
"dependencies": {
"@deno/shim-deno": "~0.18.0",
diff --git a/package.json b/package.json
index 9218e1def..b0c2be6d2 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ghostfolio",
- "version": "2.245.0",
+ "version": "2.252.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",
@@ -66,10 +66,13 @@
"@angular/platform-browser-dynamic": "21.1.1",
"@angular/router": "21.1.1",
"@angular/service-worker": "21.1.1",
+ "@bull-board/api": "6.20.3",
+ "@bull-board/express": "6.20.3",
+ "@bull-board/nestjs": "6.20.3",
"@codewithdan/observable-store": "2.2.15",
"@date-fns/utc": "2.1.1",
"@internationalized/number": "3.6.5",
- "@ionic/angular": "8.7.8",
+ "@ionic/angular": "8.8.1",
"@keyv/redis": "4.4.0",
"@nestjs/bull": "11.0.4",
"@nestjs/cache-manager": "3.1.0",
@@ -99,10 +102,11 @@
"chartjs-plugin-datalabels": "2.2.0",
"cheerio": "1.2.0",
"class-transformer": "0.5.1",
- "class-validator": "0.14.3",
+ "class-validator": "0.15.1",
"color": "5.0.3",
+ "cookie-parser": "1.4.7",
"countries-and-timezones": "3.8.0",
- "countries-list": "3.2.2",
+ "countries-list": "3.3.0",
"countup.js": "2.9.0",
"date-fns": "4.1.0",
"dotenv": "17.2.3",
@@ -114,11 +118,11 @@
"helmet": "7.0.0",
"http-status-codes": "2.3.0",
"ionicons": "8.0.13",
- "jsonpath": "1.1.1",
+ "jsonpath": "1.2.1",
"lodash": "4.17.23",
"marked": "17.0.2",
"ms": "3.0.0-canary.1",
- "ng-extract-i18n-merge": "3.2.1",
+ "ng-extract-i18n-merge": "3.3.0",
"ngx-device-detector": "11.0.0",
"ngx-markdown": "21.1.0",
"ngx-skeleton-loader": "12.0.0",
@@ -131,11 +135,11 @@
"passport-openidconnect": "0.1.2",
"reflect-metadata": "0.2.2",
"rxjs": "7.8.1",
- "stripe": "20.3.0",
- "svgmap": "2.14.0",
+ "stripe": "20.4.1",
+ "svgmap": "2.19.2",
"tablemark": "4.1.0",
"twitter-api-v2": "1.29.0",
- "yahoo-finance2": "3.13.0",
+ "yahoo-finance2": "3.13.2",
"zone.js": "0.16.0"
},
"devDependencies": {
@@ -154,21 +158,22 @@
"@eslint/js": "9.35.0",
"@nestjs/schematics": "11.0.9",
"@nestjs/testing": "11.1.14",
- "@nx/angular": "22.4.5",
- "@nx/eslint-plugin": "22.4.5",
- "@nx/jest": "22.4.5",
- "@nx/js": "22.4.5",
- "@nx/module-federation": "22.4.5",
- "@nx/nest": "22.4.5",
- "@nx/node": "22.4.5",
- "@nx/storybook": "22.4.5",
- "@nx/web": "22.4.5",
- "@nx/workspace": "22.4.5",
+ "@nx/angular": "22.5.3",
+ "@nx/eslint-plugin": "22.5.3",
+ "@nx/jest": "22.5.3",
+ "@nx/js": "22.5.3",
+ "@nx/module-federation": "22.5.3",
+ "@nx/nest": "22.5.3",
+ "@nx/node": "22.5.3",
+ "@nx/storybook": "22.5.3",
+ "@nx/web": "22.5.3",
+ "@nx/workspace": "22.5.3",
"@schematics/angular": "21.1.1",
"@storybook/addon-docs": "10.1.10",
"@storybook/angular": "10.1.10",
- "@trivago/prettier-plugin-sort-imports": "5.2.2",
+ "@trivago/prettier-plugin-sort-imports": "6.0.2",
"@types/big.js": "6.2.2",
+ "@types/cookie-parser": "1.4.10",
"@types/fast-redact": "3.0.4",
"@types/google-spreadsheet": "3.1.5",
"@types/jest": "30.0.0",
@@ -176,7 +181,7 @@
"@types/lodash": "4.17.23",
"@types/node": "22.15.17",
"@types/papaparse": "5.3.7",
- "@types/passport-google-oauth20": "2.0.16",
+ "@types/passport-google-oauth20": "2.0.17",
"@types/passport-openidconnect": "0.1.3",
"@typescript-eslint/eslint-plugin": "8.43.0",
"@typescript-eslint/parser": "8.43.0",
@@ -188,13 +193,13 @@
"jest": "30.2.0",
"jest-environment-jsdom": "30.2.0",
"jest-preset-angular": "16.0.0",
- "nx": "22.4.5",
+ "nx": "22.5.3",
"prettier": "3.8.1",
"prettier-plugin-organize-attributes": "1.0.0",
"prisma": "7.3.0",
"react": "18.2.0",
"react-dom": "18.2.0",
- "replace-in-file": "8.3.0",
+ "replace-in-file": "8.4.0",
"shx": "0.4.0",
"storybook": "10.1.10",
"ts-jest": "29.4.0",
diff --git a/prisma/migrations/20260321200654_added_index_for_type_to_order/migration.sql b/prisma/migrations/20260321200654_added_index_for_type_to_order/migration.sql
new file mode 100644
index 000000000..ba4d1b1ff
--- /dev/null
+++ b/prisma/migrations/20260321200654_added_index_for_type_to_order/migration.sql
@@ -0,0 +1,2 @@
+-- CreateIndex
+CREATE INDEX "Order_type_idx" ON "Order"("type");
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index 6714a5361..5174d8901 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -157,6 +157,7 @@ model Order {
@@index([accountId])
@@index([date])
@@index([isDraft])
+ @@index([type])
@@index([userId])
}