diff --git a/CHANGELOG.md b/CHANGELOG.md
index 37093c6f6..3a2c6a367 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
+### Added
+
+- Added alternative investment as an asset class
+- Added collectible as an asset sub class
+
+### Changed
+
+- Improved the language localization for Catalan (`ca`)
+
+## 2.179.0 - 2025-07-07
+
+### Added
+
+- Added a _Manage Asset Profile_ button for administrators to the holding detail dialog
+
### Changed
- Respected the filter by account for accounts when exporting activities on the portfolio activities page
@@ -20,13 +35,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- Improved the language localization in the users table of the admin control panel
+- Refactored the accounts pages to standalone
- Refactored the portfolio pages to standalone
+- Refactored the user account pages to standalone
- Renamed `Settings` to `settings` in the `User` database schema
+- Improved the language localization for Catalan (`ca`)
- Improved the language localization for Dutch (`nl`)
- Improved the language localization for Español (`es`)
- Improved the language localization for German (`de`)
- Upgraded `ionicons` from version `7.4.0` to `8.0.10`
+### Fixed
+
+- Fixed the allocations by asset class for unknown asset classes on the allocations page
+
## 2.178.0 - 2025-07-05
### Changed
diff --git a/apps/client/src/app/app-routing.module.ts b/apps/client/src/app/app-routing.module.ts
index d93920a6f..4abd93b83 100644
--- a/apps/client/src/app/app-routing.module.ts
+++ b/apps/client/src/app/app-routing.module.ts
@@ -16,16 +16,14 @@ const routes: Routes = [
{
path: internalRoutes.account.path,
loadChildren: () =>
- import('./pages/user-account/user-account-page.module').then(
- (m) => m.UserAccountPageModule
+ import('./pages/user-account/user-account-page.routes').then(
+ (m) => m.routes
)
},
{
path: internalRoutes.accounts.path,
loadChildren: () =>
- import('./pages/accounts/accounts-page.module').then(
- (m) => m.AccountsPageModule
- )
+ import('./pages/accounts/accounts-page.routes').then((m) => m.routes)
},
{
path: internalRoutes.adminControl.path,
diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts
index 4751c3dc7..a370d8539 100644
--- a/apps/client/src/app/app.component.ts
+++ b/apps/client/src/app/app.component.ts
@@ -320,6 +320,10 @@ export class AppComponent implements OnDestroy, OnInit {
colorScheme: this.user?.settings?.colorScheme,
deviceType: this.deviceType,
hasImpersonationId: this.hasImpersonationId,
+ hasPermissionToAccessAdminControl: hasPermission(
+ this.user?.permissions,
+ permissions.accessAdminControl
+ ),
hasPermissionToCreateOrder:
!this.hasImpersonationId &&
hasPermission(this.user?.permissions, permissions.createOrder) &&
diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
index e50d2545f..30ab1aa04 100644
--- a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
+++ b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
@@ -68,16 +68,10 @@ export class AdminMarketDataComponent
@ViewChild(MatSort) sort: MatSort;
public activeFilters: Filter[] = [];
- public allFilters: Filter[] = [
- AssetSubClass.BOND,
- AssetSubClass.COMMODITY,
- AssetSubClass.CRYPTOCURRENCY,
- AssetSubClass.ETF,
- AssetSubClass.MUTUALFUND,
- AssetSubClass.PRECIOUS_METAL,
- AssetSubClass.PRIVATE_EQUITY,
- AssetSubClass.STOCK
- ]
+ public allFilters: Filter[] = Object.keys(AssetSubClass)
+ .filter((assetSubClass) => {
+ return assetSubClass !== 'CASH';
+ })
.map((assetSubClass) => {
return {
id: assetSubClass.toString(),
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 bf489013a..105ddfe13 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
@@ -46,12 +46,13 @@ import { MatFormFieldModule } from '@angular/material/form-field';
import { SortDirection } from '@angular/material/sort';
import { MatTableDataSource } from '@angular/material/table';
import { MatTabsModule } from '@angular/material/tabs';
-import { Router } from '@angular/router';
+import { Router, RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
import { Account, MarketData, Tag } from '@prisma/client';
import { format, isSameMonth, isToday, parseISO } from 'date-fns';
import { addIcons } from 'ionicons';
import {
+ createOutline,
flagOutline,
readerOutline,
serverOutline,
@@ -85,7 +86,8 @@ import { HoldingDetailDialogParams } from './interfaces/interfaces';
MatDialogModule,
MatFormFieldModule,
MatTabsModule,
- NgxSkeletonLoaderModule
+ NgxSkeletonLoaderModule,
+ RouterModule
],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
selector: 'gf-holding-detail-dialog',
@@ -127,6 +129,8 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
public quantity: number;
public quantityPrecision = 2;
public reportDataGlitchMail: string;
+ public routerLinkAdminControlMarketData =
+ internalRoutes.adminControl.subRoutes.marketData.routerLink;
public sectors: {
[name: string]: { name: string; value: number };
};
@@ -152,6 +156,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
private userService: UserService
) {
addIcons({
+ createOutline,
flagOutline,
readerOutline,
serverOutline,
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 d288a8953..4625de712 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
@@ -412,16 +412,37 @@
/>
@if (
- dataSource?.data.length > 0 &&
- data.hasPermissionToReportDataGlitch === true
+ data.hasPermissionToAccessAdminControl ||
+ (dataSource?.data.length > 0 &&
+ data.hasPermissionToReportDataGlitch === true)
) {
}
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 cb98ab3a7..e7d9edefb 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
@@ -8,6 +8,7 @@ export interface HoldingDetailDialogParams {
dataSource: DataSource;
deviceType: string;
hasImpersonationId: boolean;
+ hasPermissionToAccessAdminControl: boolean;
hasPermissionToCreateOrder: boolean;
hasPermissionToReportDataGlitch: boolean;
hasPermissionToUpdateOrder: boolean;
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 11a3f57a4..960ad1310 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,4 +1,5 @@
import { CreateAccessDto } from '@ghostfolio/api/app/access/create-access.dto';
+import { GfPortfolioAccessTableModule } from '@ghostfolio/client/components/access-table/access-table.module';
import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type';
import { NotificationService } from '@ghostfolio/client/core/notification/notification.service';
import { DataService } from '@ghostfolio/client/services/data.service';
@@ -6,17 +7,24 @@ import { TokenStorageService } from '@ghostfolio/client/services/token-storage.s
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { Access, User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
+import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
+import { CommonModule } from '@angular/common';
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
+ CUSTOM_ELEMENTS_SCHEMA,
OnDestroy,
OnInit
} from '@angular/core';
-import { FormBuilder, Validators } from '@angular/forms';
-import { MatDialog } from '@angular/material/dialog';
-import { ActivatedRoute, Router } from '@angular/router';
+import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';
+import { MatButtonModule } from '@angular/material/button';
+import { MatDialog, MatDialogModule } from '@angular/material/dialog';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatInputModule } from '@angular/material/input';
+import { ActivatedRoute, Router, RouterModule } from '@angular/router';
+import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { addOutline, eyeOffOutline, eyeOutline } from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
@@ -24,16 +32,30 @@ import { EMPTY, Subject } from 'rxjs';
import { catchError, takeUntil } from 'rxjs/operators';
import { CreateOrUpdateAccessDialog } from './create-or-update-access-dialog/create-or-update-access-dialog.component';
+import { GfCreateOrUpdateAccessDialogModule } from './create-or-update-access-dialog/create-or-update-access-dialog.module';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
host: { class: 'has-fab' },
+ imports: [
+ CommonModule,
+ GfCreateOrUpdateAccessDialogModule,
+ GfPortfolioAccessTableModule,
+ GfPremiumIndicatorComponent,
+ IonIcon,
+ MatButtonModule,
+ MatDialogModule,
+ MatFormFieldModule,
+ MatInputModule,
+ ReactiveFormsModule,
+ RouterModule
+ ],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
selector: 'gf-user-account-access',
styleUrls: ['./user-account-access.scss'],
- templateUrl: './user-account-access.html',
- standalone: false
+ templateUrl: './user-account-access.html'
})
-export class UserAccountAccessComponent implements OnDestroy, OnInit {
+export class GfUserAccountAccessComponent implements OnDestroy, OnInit {
public accessesGet: Access[];
public accessesGive: Access[];
public deviceType: string;
diff --git a/apps/client/src/app/components/user-account-access/user-account-access.module.ts b/apps/client/src/app/components/user-account-access/user-account-access.module.ts
deleted file mode 100644
index d38a4665e..000000000
--- a/apps/client/src/app/components/user-account-access/user-account-access.module.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { GfPortfolioAccessTableModule } from '@ghostfolio/client/components/access-table/access-table.module';
-import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
-
-import { CommonModule } from '@angular/common';
-import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
-import { ReactiveFormsModule } from '@angular/forms';
-import { MatButtonModule } from '@angular/material/button';
-import { MatDialogModule } from '@angular/material/dialog';
-import { MatFormFieldModule } from '@angular/material/form-field';
-import { MatInputModule } from '@angular/material/input';
-import { RouterModule } from '@angular/router';
-import { IonIcon } from '@ionic/angular/standalone';
-
-import { GfCreateOrUpdateAccessDialogModule } from './create-or-update-access-dialog/create-or-update-access-dialog.module';
-import { UserAccountAccessComponent } from './user-account-access.component';
-
-@NgModule({
- declarations: [UserAccountAccessComponent],
- exports: [UserAccountAccessComponent],
- imports: [
- CommonModule,
- GfCreateOrUpdateAccessDialogModule,
- GfPortfolioAccessTableModule,
- GfPremiumIndicatorComponent,
- IonIcon,
- MatButtonModule,
- MatDialogModule,
- MatFormFieldModule,
- MatInputModule,
- ReactiveFormsModule,
- RouterModule
- ],
- schemas: [CUSTOM_ELEMENTS_SCHEMA]
-})
-export class GfUserAccountAccessModule {}
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 68c8b649f..f2f63b32b 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
@@ -6,14 +6,20 @@ import { getDateFormatString } from '@ghostfolio/common/helper';
import { User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { publicRoutes } from '@ghostfolio/common/routes/routes';
+import { GfMembershipCardComponent } from '@ghostfolio/ui/membership-card';
+import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
+import { CommonModule } from '@angular/common';
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
OnDestroy
} from '@angular/core';
+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 { StripeService } from 'ngx-stripe';
import { EMPTY, Subject } from 'rxjs';
@@ -21,12 +27,19 @@ import { catchError, switchMap, takeUntil } from 'rxjs/operators';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [
+ CommonModule,
+ GfMembershipCardComponent,
+ GfPremiumIndicatorComponent,
+ MatButtonModule,
+ MatCardModule,
+ RouterModule
+ ],
selector: 'gf-user-account-membership',
styleUrls: ['./user-account-membership.scss'],
- templateUrl: './user-account-membership.html',
- standalone: false
+ templateUrl: './user-account-membership.html'
})
-export class UserAccountMembershipComponent implements OnDestroy {
+export class GfUserAccountMembershipComponent implements OnDestroy {
public baseCurrency: string;
public coupon: number;
public couponId: string;
diff --git a/apps/client/src/app/components/user-account-membership/user-account-membership.module.ts b/apps/client/src/app/components/user-account-membership/user-account-membership.module.ts
deleted file mode 100644
index 90646c09e..000000000
--- a/apps/client/src/app/components/user-account-membership/user-account-membership.module.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { GfMembershipCardComponent } from '@ghostfolio/ui/membership-card';
-import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
-import { GfValueComponent } from '@ghostfolio/ui/value';
-
-import { CommonModule } from '@angular/common';
-import { NgModule } from '@angular/core';
-import { MatButtonModule } from '@angular/material/button';
-import { MatCardModule } from '@angular/material/card';
-import { RouterModule } from '@angular/router';
-
-import { UserAccountMembershipComponent } from './user-account-membership.component';
-
-@NgModule({
- declarations: [UserAccountMembershipComponent],
- exports: [UserAccountMembershipComponent],
- imports: [
- CommonModule,
- GfMembershipCardComponent,
- GfPremiumIndicatorComponent,
- GfValueComponent,
- MatButtonModule,
- MatCardModule,
- RouterModule
- ]
-})
-export class GfUserAccountMembershipModule {}
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 d4683421d..4beebe510 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
@@ -13,16 +13,33 @@ import { downloadAsFile } from '@ghostfolio/common/helper';
import { User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
+import { CommonModule } from '@angular/common';
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
+ CUSTOM_ELEMENTS_SCHEMA,
OnDestroy,
OnInit
} from '@angular/core';
-import { FormBuilder, Validators } from '@angular/forms';
-import { MatSlideToggleChange } from '@angular/material/slide-toggle';
+import {
+ FormBuilder,
+ FormsModule,
+ ReactiveFormsModule,
+ Validators
+} from '@angular/forms';
+import { MatButtonModule } from '@angular/material/button';
+import { MatCardModule } from '@angular/material/card';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatInputModule } from '@angular/material/input';
+import { MatSelectModule } from '@angular/material/select';
+import {
+ MatSlideToggleChange,
+ MatSlideToggleModule
+} from '@angular/material/slide-toggle';
import { MatSnackBar } from '@angular/material/snack-bar';
+import { RouterModule } from '@angular/router';
+import { IonIcon } from '@ionic/angular/standalone';
import { format, parseISO } from 'date-fns';
import { addIcons } from 'ionicons';
import { eyeOffOutline, eyeOutline } from 'ionicons/icons';
@@ -32,12 +49,25 @@ import { catchError, takeUntil } from 'rxjs/operators';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
+ imports: [
+ CommonModule,
+ FormsModule,
+ IonIcon,
+ MatButtonModule,
+ MatCardModule,
+ MatFormFieldModule,
+ MatInputModule,
+ MatSelectModule,
+ MatSlideToggleModule,
+ ReactiveFormsModule,
+ RouterModule
+ ],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
selector: 'gf-user-account-settings',
styleUrls: ['./user-account-settings.scss'],
- templateUrl: './user-account-settings.html',
- standalone: false
+ templateUrl: './user-account-settings.html'
})
-export class UserAccountSettingsComponent implements OnDestroy, OnInit {
+export class GfUserAccountSettingsComponent implements OnDestroy, OnInit {
public appearancePlaceholder = $localize`Auto`;
public baseCurrency: string;
public currencies: string[] = [];
diff --git a/apps/client/src/app/components/user-account-settings/user-account-settings.module.ts b/apps/client/src/app/components/user-account-settings/user-account-settings.module.ts
deleted file mode 100644
index 3b82dff51..000000000
--- a/apps/client/src/app/components/user-account-settings/user-account-settings.module.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { GfValueComponent } from '@ghostfolio/ui/value';
-
-import { CommonModule } from '@angular/common';
-import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
-import { FormsModule, ReactiveFormsModule } from '@angular/forms';
-import { MatButtonModule } from '@angular/material/button';
-import { MatCardModule } from '@angular/material/card';
-import { MatFormFieldModule } from '@angular/material/form-field';
-import { MatInputModule } from '@angular/material/input';
-import { MatSelectModule } from '@angular/material/select';
-import { MatSlideToggleModule } from '@angular/material/slide-toggle';
-import { RouterModule } from '@angular/router';
-import { IonIcon } from '@ionic/angular/standalone';
-
-import { UserAccountSettingsComponent } from './user-account-settings.component';
-
-@NgModule({
- declarations: [UserAccountSettingsComponent],
- exports: [UserAccountSettingsComponent],
- imports: [
- CommonModule,
- FormsModule,
- GfValueComponent,
- IonIcon,
- MatButtonModule,
- MatCardModule,
- MatFormFieldModule,
- MatInputModule,
- MatSelectModule,
- MatSlideToggleModule,
- ReactiveFormsModule,
- RouterModule
- ],
- schemas: [CUSTOM_ELEMENTS_SCHEMA]
-})
-export class GfUserAccountSettingsModule {}
diff --git a/apps/client/src/app/pages/about/changelog/changelog-page.component.ts b/apps/client/src/app/pages/about/changelog/changelog-page.component.ts
index 87f3008dc..69b397370 100644
--- a/apps/client/src/app/pages/about/changelog/changelog-page.component.ts
+++ b/apps/client/src/app/pages/about/changelog/changelog-page.component.ts
@@ -9,7 +9,7 @@ import { Subject } from 'rxjs';
styleUrls: ['./changelog-page.scss'],
templateUrl: './changelog-page.html'
})
-export class ChangelogPageComponent implements OnDestroy {
+export class GfChangelogPageComponent implements OnDestroy {
public isLoading = true;
private unsubscribeSubject = new Subject();
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 78ac2ad9e..523218acc 100644
--- a/apps/client/src/app/pages/about/changelog/changelog-page.routes.ts
+++ b/apps/client/src/app/pages/about/changelog/changelog-page.routes.ts
@@ -3,12 +3,12 @@ import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { Routes } from '@angular/router';
-import { ChangelogPageComponent } from './changelog-page.component';
+import { GfChangelogPageComponent } from './changelog-page.component';
export const routes: Routes = [
{
canActivate: [AuthGuard],
- component: ChangelogPageComponent,
+ component: GfChangelogPageComponent,
path: '',
title: publicRoutes.about.subRoutes.changelog.title
}
diff --git a/apps/client/src/app/pages/about/license/license-page.component.ts b/apps/client/src/app/pages/about/license/license-page.component.ts
index 0d4b2a97c..0dc5b2f51 100644
--- a/apps/client/src/app/pages/about/license/license-page.component.ts
+++ b/apps/client/src/app/pages/about/license/license-page.component.ts
@@ -8,7 +8,7 @@ import { Subject } from 'rxjs';
styleUrls: ['./license-page.scss'],
templateUrl: './license-page.html'
})
-export class LicensePageComponent implements OnDestroy {
+export class GfLicensePageComponent implements OnDestroy {
private unsubscribeSubject = new Subject();
public ngOnDestroy() {
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 d842485ed..1684bb0c5 100644
--- a/apps/client/src/app/pages/about/license/license-page.routes.ts
+++ b/apps/client/src/app/pages/about/license/license-page.routes.ts
@@ -3,12 +3,12 @@ import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { Routes } from '@angular/router';
-import { LicensePageComponent } from './license-page.component';
+import { GfLicensePageComponent } from './license-page.component';
export const routes: Routes = [
{
canActivate: [AuthGuard],
- component: LicensePageComponent,
+ component: GfLicensePageComponent,
path: '',
title: publicRoutes.about.subRoutes.license.title
}
diff --git a/apps/client/src/app/pages/about/oss-friends/oss-friends-page.component.ts b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.component.ts
index c34a4073e..bdbbdf9a7 100644
--- a/apps/client/src/app/pages/about/oss-friends/oss-friends-page.component.ts
+++ b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.component.ts
@@ -14,7 +14,7 @@ const ossFriends = require('../../../../assets/oss-friends.json');
styleUrls: ['./oss-friends-page.scss'],
templateUrl: './oss-friends-page.html'
})
-export class OpenSourceSoftwareFriendsPageComponent implements OnDestroy {
+export class GfOpenSourceSoftwareFriendsPageComponent implements OnDestroy {
public ossFriends = ossFriends.data;
private unsubscribeSubject = new Subject();
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 ac0bd2a9f..8dbb9d52a 100644
--- a/apps/client/src/app/pages/about/oss-friends/oss-friends-page.routes.ts
+++ b/apps/client/src/app/pages/about/oss-friends/oss-friends-page.routes.ts
@@ -3,12 +3,12 @@ import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { Routes } from '@angular/router';
-import { OpenSourceSoftwareFriendsPageComponent } from './oss-friends-page.component';
+import { GfOpenSourceSoftwareFriendsPageComponent } from './oss-friends-page.component';
export const routes: Routes = [
{
canActivate: [AuthGuard],
- component: OpenSourceSoftwareFriendsPageComponent,
+ component: GfOpenSourceSoftwareFriendsPageComponent,
path: '',
title: publicRoutes.about.subRoutes.ossFriends.title
}
diff --git a/apps/client/src/app/pages/about/overview/about-overview-page.component.ts b/apps/client/src/app/pages/about/overview/about-overview-page.component.ts
index 707b97e89..d315f2cbd 100644
--- a/apps/client/src/app/pages/about/overview/about-overview-page.component.ts
+++ b/apps/client/src/app/pages/about/overview/about-overview-page.component.ts
@@ -33,7 +33,7 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./about-overview-page.scss'],
templateUrl: './about-overview-page.html'
})
-export class AboutOverviewPageComponent implements OnDestroy, OnInit {
+export class GfAboutOverviewPageComponent implements OnDestroy, OnInit {
public hasPermissionForStatistics: boolean;
public hasPermissionForSubscription: boolean;
public isLoggedIn: boolean;
diff --git a/apps/client/src/app/pages/about/overview/about-overview-page.routes.ts b/apps/client/src/app/pages/about/overview/about-overview-page.routes.ts
index 8774ceee5..79047855f 100644
--- a/apps/client/src/app/pages/about/overview/about-overview-page.routes.ts
+++ b/apps/client/src/app/pages/about/overview/about-overview-page.routes.ts
@@ -2,12 +2,12 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { Routes } from '@angular/router';
-import { AboutOverviewPageComponent } from './about-overview-page.component';
+import { GfAboutOverviewPageComponent } from './about-overview-page.component';
export const routes: Routes = [
{
canActivate: [AuthGuard],
- component: AboutOverviewPageComponent,
+ component: GfAboutOverviewPageComponent,
path: '',
title: $localize`About`
}
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 166963f9d..78881cd2c 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
@@ -8,7 +8,7 @@ import { Subject } from 'rxjs';
styleUrls: ['./privacy-policy-page.scss'],
templateUrl: './privacy-policy-page.html'
})
-export class PrivacyPolicyPageComponent implements OnDestroy {
+export class GfPrivacyPolicyPageComponent implements OnDestroy {
private unsubscribeSubject = new Subject();
public ngOnDestroy() {
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 950fee5b5..e87436c17 100644
--- a/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.routes.ts
+++ b/apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.routes.ts
@@ -3,12 +3,12 @@ import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { Routes } from '@angular/router';
-import { PrivacyPolicyPageComponent } from './privacy-policy-page.component';
+import { GfPrivacyPolicyPageComponent } from './privacy-policy-page.component';
export const routes: Routes = [
{
canActivate: [AuthGuard],
- component: PrivacyPolicyPageComponent,
+ component: GfPrivacyPolicyPageComponent,
path: '',
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 4278bb69f..dbf07ef19 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
@@ -8,7 +8,7 @@ import { Subject } from 'rxjs';
styleUrls: ['./terms-of-service-page.scss'],
templateUrl: './terms-of-service-page.html'
})
-export class TermsOfServicePageComponent implements OnDestroy {
+export class GfTermsOfServicePageComponent implements OnDestroy {
private unsubscribeSubject = new Subject();
public ngOnDestroy() {
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 1cc6907c5..34d7a72d0 100644
--- a/apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.routes.ts
+++ b/apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.routes.ts
@@ -3,12 +3,12 @@ import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { Routes } from '@angular/router';
-import { TermsOfServicePageComponent } from './terms-of-service-page.component';
+import { GfTermsOfServicePageComponent } from './terms-of-service-page.component';
export const routes: Routes = [
{
canActivate: [AuthGuard],
- component: TermsOfServicePageComponent,
+ component: GfTermsOfServicePageComponent,
path: '',
title: publicRoutes.about.subRoutes.termsOfService.title
}
diff --git a/apps/client/src/app/pages/accounts/accounts-page-routing.module.ts b/apps/client/src/app/pages/accounts/accounts-page-routing.module.ts
deleted file mode 100644
index 8d3da2c35..000000000
--- a/apps/client/src/app/pages/accounts/accounts-page-routing.module.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
-import { internalRoutes } from '@ghostfolio/common/routes/routes';
-
-import { NgModule } from '@angular/core';
-import { RouterModule, Routes } from '@angular/router';
-
-import { AccountsPageComponent } from './accounts-page.component';
-
-const routes: Routes = [
- {
- canActivate: [AuthGuard],
- component: AccountsPageComponent,
- path: '',
- title: internalRoutes.accounts.title
- }
-];
-
-@NgModule({
- imports: [RouterModule.forChild(routes)],
- exports: [RouterModule]
-})
-export class AccountsPageRoutingModule {}
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 8d1db08b5..7d139bd5d 100644
--- a/apps/client/src/app/pages/accounts/accounts-page.component.ts
+++ b/apps/client/src/app/pages/accounts/accounts-page.component.ts
@@ -2,7 +2,9 @@ import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto
import { TransferBalanceDto } from '@ghostfolio/api/app/account/transfer-balance.dto';
import { UpdateAccountDto } from '@ghostfolio/api/app/account/update-account.dto';
import { AccountDetailDialog } from '@ghostfolio/client/components/account-detail-dialog/account-detail-dialog.component';
+import { GfAccountDetailDialogModule } from '@ghostfolio/client/components/account-detail-dialog/account-detail-dialog.module';
import { AccountDetailDialogParams } from '@ghostfolio/client/components/account-detail-dialog/interfaces/interfaces';
+import { GfAccountsTableModule } from '@ghostfolio/client/components/accounts-table/accounts-table.module';
import { NotificationService } from '@ghostfolio/client/core/notification/notification.service';
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
@@ -11,8 +13,9 @@ import { User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
+import { MatButtonModule } from '@angular/material/button';
import { MatDialog } from '@angular/material/dialog';
-import { ActivatedRoute, Router } from '@angular/router';
+import { ActivatedRoute, Router, RouterModule } from '@angular/router';
import { Account as AccountModel } from '@prisma/client';
import { addIcons } from 'ionicons';
import { addOutline } from 'ionicons/icons';
@@ -20,17 +23,22 @@ import { DeviceDetectorService } from 'ngx-device-detector';
import { EMPTY, Subject, Subscription } from 'rxjs';
import { catchError, takeUntil } from 'rxjs/operators';
-import { CreateOrUpdateAccountDialog } from './create-or-update-account-dialog/create-or-update-account-dialog.component';
-import { TransferBalanceDialog } from './transfer-balance/transfer-balance-dialog.component';
+import { GfCreateOrUpdateAccountDialogComponent } from './create-or-update-account-dialog/create-or-update-account-dialog.component';
+import { GfTransferBalanceDialogComponent } from './transfer-balance/transfer-balance-dialog.component';
@Component({
host: { class: 'has-fab page' },
+ imports: [
+ GfAccountDetailDialogModule,
+ GfAccountsTableModule,
+ MatButtonModule,
+ RouterModule
+ ],
selector: 'gf-accounts-page',
styleUrls: ['./accounts-page.scss'],
- templateUrl: './accounts-page.html',
- standalone: false
+ templateUrl: './accounts-page.html'
})
-export class AccountsPageComponent implements OnDestroy, OnInit {
+export class GfAccountsPageComponent implements OnDestroy, OnInit {
public accounts: AccountModel[];
public deviceType: string;
public hasImpersonationId: boolean;
@@ -177,7 +185,7 @@ export class AccountsPageComponent implements OnDestroy, OnInit {
name,
platformId
}: AccountModel) {
- const dialogRef = this.dialog.open(CreateOrUpdateAccountDialog, {
+ const dialogRef = this.dialog.open(GfCreateOrUpdateAccountDialogComponent, {
data: {
account: {
balance,
@@ -251,7 +259,7 @@ export class AccountsPageComponent implements OnDestroy, OnInit {
}
private openCreateAccountDialog() {
- const dialogRef = this.dialog.open(CreateOrUpdateAccountDialog, {
+ const dialogRef = this.dialog.open(GfCreateOrUpdateAccountDialogComponent, {
data: {
account: {
balance: 0,
@@ -293,7 +301,7 @@ export class AccountsPageComponent implements OnDestroy, OnInit {
}
private openTransferBalanceDialog() {
- const dialogRef = this.dialog.open(TransferBalanceDialog, {
+ const dialogRef = this.dialog.open(GfTransferBalanceDialogComponent, {
data: {
accounts: this.accounts
},
diff --git a/apps/client/src/app/pages/accounts/accounts-page.module.ts b/apps/client/src/app/pages/accounts/accounts-page.module.ts
deleted file mode 100644
index 5315ddbf8..000000000
--- a/apps/client/src/app/pages/accounts/accounts-page.module.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { GfAccountDetailDialogModule } from '@ghostfolio/client/components/account-detail-dialog/account-detail-dialog.module';
-import { GfAccountsTableModule } from '@ghostfolio/client/components/accounts-table/accounts-table.module';
-
-import { CommonModule } from '@angular/common';
-import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
-import { MatButtonModule } from '@angular/material/button';
-import { RouterModule } from '@angular/router';
-import { IonIcon } from '@ionic/angular/standalone';
-
-import { AccountsPageRoutingModule } from './accounts-page-routing.module';
-import { AccountsPageComponent } from './accounts-page.component';
-import { GfCreateOrUpdateAccountDialogModule } from './create-or-update-account-dialog/create-or-update-account-dialog.module';
-import { GfTransferBalanceDialogModule } from './transfer-balance/transfer-balance-dialog.module';
-
-@NgModule({
- declarations: [AccountsPageComponent],
- imports: [
- AccountsPageRoutingModule,
- CommonModule,
- GfAccountDetailDialogModule,
- GfAccountsTableModule,
- GfCreateOrUpdateAccountDialogModule,
- GfTransferBalanceDialogModule,
- IonIcon,
- MatButtonModule,
- RouterModule
- ],
- schemas: [CUSTOM_ELEMENTS_SCHEMA]
-})
-export class AccountsPageModule {}
diff --git a/apps/client/src/app/pages/accounts/accounts-page.routes.ts b/apps/client/src/app/pages/accounts/accounts-page.routes.ts
new file mode 100644
index 000000000..e4edc39c1
--- /dev/null
+++ b/apps/client/src/app/pages/accounts/accounts-page.routes.ts
@@ -0,0 +1,15 @@
+import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
+import { internalRoutes } from '@ghostfolio/common/routes/routes';
+
+import { Routes } from '@angular/router';
+
+import { GfAccountsPageComponent } from './accounts-page.component';
+
+export const routes: Routes = [
+ {
+ canActivate: [AuthGuard],
+ component: GfAccountsPageComponent,
+ path: '',
+ title: internalRoutes.accounts.title
+ }
+];
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 15f4c35ee..beb815e0c 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
@@ -2,7 +2,10 @@ import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto
import { UpdateAccountDto } from '@ghostfolio/api/app/account/update-account.dto';
import { DataService } from '@ghostfolio/client/services/data.service';
import { validateObjectForForm } from '@ghostfolio/client/util/form.util';
+import { GfCurrencySelectorComponent } from '@ghostfolio/ui/currency-selector';
+import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo';
+import { CommonModule, NgClass } from '@angular/common';
import {
ChangeDetectionStrategy,
Component,
@@ -13,10 +16,20 @@ import {
AbstractControl,
FormBuilder,
FormGroup,
+ ReactiveFormsModule,
ValidatorFn,
Validators
} from '@angular/forms';
-import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
+import { MatAutocompleteModule } from '@angular/material/autocomplete';
+import { MatButtonModule } from '@angular/material/button';
+import { MatCheckboxModule } from '@angular/material/checkbox';
+import {
+ MAT_DIALOG_DATA,
+ MatDialogModule,
+ MatDialogRef
+} from '@angular/material/dialog';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatInputModule } from '@angular/material/input';
import { Platform } from '@prisma/client';
import { Observable, Subject } from 'rxjs';
import { map, startWith } from 'rxjs/operators';
@@ -24,14 +37,26 @@ import { map, startWith } from 'rxjs/operators';
import { CreateOrUpdateAccountDialogParams } from './interfaces/interfaces';
@Component({
+ changeDetection: ChangeDetectionStrategy.OnPush,
host: { class: 'h-100' },
+ imports: [
+ CommonModule,
+ GfCurrencySelectorComponent,
+ GfEntityLogoComponent,
+ MatAutocompleteModule,
+ MatButtonModule,
+ MatCheckboxModule,
+ MatDialogModule,
+ MatFormFieldModule,
+ MatInputModule,
+ NgClass,
+ ReactiveFormsModule
+ ],
selector: 'gf-create-or-update-account-dialog',
- changeDetection: ChangeDetectionStrategy.OnPush,
styleUrls: ['./create-or-update-account-dialog.scss'],
- templateUrl: 'create-or-update-account-dialog.html',
- standalone: false
+ templateUrl: 'create-or-update-account-dialog.html'
})
-export class CreateOrUpdateAccountDialog implements OnDestroy {
+export class GfCreateOrUpdateAccountDialogComponent implements OnDestroy {
public accountForm: FormGroup;
public currencies: string[] = [];
public filteredPlatforms: Observable;
@@ -42,7 +67,7 @@ export class CreateOrUpdateAccountDialog implements OnDestroy {
public constructor(
@Inject(MAT_DIALOG_DATA) public data: CreateOrUpdateAccountDialogParams,
private dataService: DataService,
- public dialogRef: MatDialogRef,
+ public dialogRef: MatDialogRef,
private formBuilder: FormBuilder
) {}
diff --git a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.module.ts b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.module.ts
deleted file mode 100644
index 8543d37f4..000000000
--- a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.module.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { GfCurrencySelectorComponent } from '@ghostfolio/ui/currency-selector';
-import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo';
-
-import { CommonModule } from '@angular/common';
-import { NgModule } from '@angular/core';
-import { FormsModule, ReactiveFormsModule } from '@angular/forms';
-import { MatAutocompleteModule } from '@angular/material/autocomplete';
-import { MatButtonModule } from '@angular/material/button';
-import { MatCheckboxModule } from '@angular/material/checkbox';
-import { MatDialogModule } from '@angular/material/dialog';
-import { MatFormFieldModule } from '@angular/material/form-field';
-import { MatInputModule } from '@angular/material/input';
-
-import { CreateOrUpdateAccountDialog } from './create-or-update-account-dialog.component';
-
-@NgModule({
- declarations: [CreateOrUpdateAccountDialog],
- imports: [
- CommonModule,
- FormsModule,
- GfCurrencySelectorComponent,
- GfEntityLogoComponent,
- MatAutocompleteModule,
- MatButtonModule,
- MatCheckboxModule,
- MatDialogModule,
- MatFormFieldModule,
- MatInputModule,
- ReactiveFormsModule
- ]
-})
-export class GfCreateOrUpdateAccountDialogModule {}
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 e74ad1193..368c7f2f0 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,4 +1,5 @@
import { TransferBalanceDto } from '@ghostfolio/api/app/account/transfer-balance.dto';
+import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo';
import {
ChangeDetectionStrategy,
@@ -10,24 +11,41 @@ import {
AbstractControl,
FormBuilder,
FormGroup,
+ ReactiveFormsModule,
ValidationErrors,
Validators
} from '@angular/forms';
-import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
+import { MatButtonModule } from '@angular/material/button';
+import {
+ MAT_DIALOG_DATA,
+ MatDialogModule,
+ MatDialogRef
+} from '@angular/material/dialog';
+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';
@Component({
+ changeDetection: ChangeDetectionStrategy.OnPush,
host: { class: 'h-100' },
+ imports: [
+ GfEntityLogoComponent,
+ MatButtonModule,
+ MatDialogModule,
+ MatFormFieldModule,
+ MatInputModule,
+ MatSelectModule,
+ ReactiveFormsModule
+ ],
selector: 'gf-transfer-balance-dialog',
- changeDetection: ChangeDetectionStrategy.OnPush,
styleUrls: ['./transfer-balance-dialog.scss'],
- templateUrl: 'transfer-balance-dialog.html',
- standalone: false
+ templateUrl: 'transfer-balance-dialog.html'
})
-export class TransferBalanceDialog implements OnDestroy {
+export class GfTransferBalanceDialogComponent implements OnDestroy {
public accounts: Account[] = [];
public currency: string;
public transferBalanceForm: FormGroup;
@@ -36,7 +54,7 @@ export class TransferBalanceDialog implements OnDestroy {
public constructor(
@Inject(MAT_DIALOG_DATA) public data: TransferBalanceDialogParams,
- public dialogRef: MatDialogRef,
+ public dialogRef: MatDialogRef,
private formBuilder: FormBuilder
) {}
diff --git a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.module.ts b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.module.ts
deleted file mode 100644
index 19bd98a7f..000000000
--- a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.module.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo';
-
-import { CommonModule } from '@angular/common';
-import { NgModule } from '@angular/core';
-import { ReactiveFormsModule } from '@angular/forms';
-import { MatButtonModule } from '@angular/material/button';
-import { MatDialogModule } from '@angular/material/dialog';
-import { MatFormFieldModule } from '@angular/material/form-field';
-import { MatInputModule } from '@angular/material/input';
-import { MatSelectModule } from '@angular/material/select';
-
-import { TransferBalanceDialog } from './transfer-balance-dialog.component';
-
-@NgModule({
- declarations: [TransferBalanceDialog],
- imports: [
- CommonModule,
- GfEntityLogoComponent,
- MatButtonModule,
- MatDialogModule,
- MatFormFieldModule,
- MatInputModule,
- MatSelectModule,
- ReactiveFormsModule
- ]
-})
-export class GfTransferBalanceDialogModule {}
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 38e24dbf6..26049e069 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
@@ -27,8 +27,8 @@ import { DeviceDetectorService } from 'ngx-device-detector';
import { Subject, Subscription } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
-import { CreateOrUpdateActivityDialog } from './create-or-update-activity-dialog/create-or-update-activity-dialog.component';
-import { ImportActivitiesDialog } from './import-activities-dialog/import-activities-dialog.component';
+import { GfCreateOrUpdateActivityDialog } from './create-or-update-activity-dialog/create-or-update-activity-dialog.component';
+import { GfImportActivitiesDialog } from './import-activities-dialog/import-activities-dialog.component';
import { ImportActivitiesDialogParams } from './import-activities-dialog/interfaces/interfaces';
@Component({
@@ -44,7 +44,7 @@ import { ImportActivitiesDialogParams } from './import-activities-dialog/interfa
styleUrls: ['./activities-page.scss'],
templateUrl: './activities-page.html'
})
-export class ActivitiesPageComponent implements OnDestroy, OnInit {
+export class GfActivitiesPageComponent implements OnDestroy, OnInit {
public dataSource: MatTableDataSource;
public deviceType: string;
public hasImpersonationId: boolean;
@@ -245,7 +245,7 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit {
}
public onImport() {
- const dialogRef = this.dialog.open(ImportActivitiesDialog, {
+ const dialogRef = this.dialog.open(GfImportActivitiesDialog, {
data: {
deviceType: this.deviceType,
user: this.user
@@ -267,7 +267,7 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit {
}
public onImportDividends() {
- const dialogRef = this.dialog.open(ImportActivitiesDialog, {
+ const dialogRef = this.dialog.open(GfImportActivitiesDialog, {
data: {
activityTypes: ['DIVIDEND'],
deviceType: this.deviceType,
@@ -304,7 +304,7 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit {
}
public openUpdateActivityDialog(activity: Activity) {
- const dialogRef = this.dialog.open(CreateOrUpdateActivityDialog, {
+ const dialogRef = this.dialog.open(GfCreateOrUpdateActivityDialog, {
data: {
activity,
accounts: this.user?.accounts,
@@ -345,7 +345,7 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit {
.subscribe((user) => {
this.updateUser(user);
- const dialogRef = this.dialog.open(CreateOrUpdateActivityDialog, {
+ const dialogRef = this.dialog.open(GfCreateOrUpdateActivityDialog, {
data: {
accounts: this.user?.accounts,
activity: {
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 11a3e8a2a..c96c8a558 100644
--- a/apps/client/src/app/pages/portfolio/activities/activities-page.routes.ts
+++ b/apps/client/src/app/pages/portfolio/activities/activities-page.routes.ts
@@ -3,12 +3,12 @@ import { internalRoutes } from '@ghostfolio/common/routes/routes';
import { Routes } from '@angular/router';
-import { ActivitiesPageComponent } from './activities-page.component';
+import { GfActivitiesPageComponent } from './activities-page.component';
export const routes: Routes = [
{
canActivate: [AuthGuard],
- component: ActivitiesPageComponent,
+ component: GfActivitiesPageComponent,
path: '',
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 937a01086..c3a75611e 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
@@ -71,7 +71,7 @@ import { CreateOrUpdateActivityDialogParams } from './interfaces/interfaces';
styleUrls: ['./create-or-update-activity-dialog.scss'],
templateUrl: 'create-or-update-activity-dialog.html'
})
-export class CreateOrUpdateActivityDialog implements OnDestroy {
+export class GfCreateOrUpdateActivityDialog implements OnDestroy {
public activityForm: FormGroup;
public assetClasses = Object.keys(AssetClass).map((assetClass) => {
return { id: assetClass, label: translate(assetClass) };
@@ -101,7 +101,7 @@ export class CreateOrUpdateActivityDialog implements OnDestroy {
@Inject(MAT_DIALOG_DATA) public data: CreateOrUpdateActivityDialogParams,
private dataService: DataService,
private dateAdapter: DateAdapter,
- public dialogRef: MatDialogRef,
+ public dialogRef: MatDialogRef,
private formBuilder: FormBuilder,
@Inject(MAT_DATE_LOCALE) private locale: string,
private userService: UserService
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 3ffad35aa..b9f0986ac 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
@@ -74,7 +74,7 @@ import { ImportActivitiesDialogParams } from './interfaces/interfaces';
styleUrls: ['./import-activities-dialog.scss'],
templateUrl: 'import-activities-dialog.html'
})
-export class ImportActivitiesDialog implements OnDestroy {
+export class GfImportActivitiesDialog implements OnDestroy {
public accounts: CreateAccountDto[] = [];
public activities: Activity[] = [];
public assetProfileForm: FormGroup;
@@ -102,7 +102,7 @@ export class ImportActivitiesDialog implements OnDestroy {
private dataService: DataService,
private deviceService: DeviceDetectorService,
private formBuilder: FormBuilder,
- public dialogRef: MatDialogRef,
+ public dialogRef: MatDialogRef,
private importActivitiesService: ImportActivitiesService,
private snackBar: MatSnackBar
) {
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 46d6cd4c6..37eeae61f 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
@@ -27,7 +27,13 @@ import { MatCardModule } from '@angular/material/card';
import { MatDialog } from '@angular/material/dialog';
import { MatProgressBarModule } from '@angular/material/progress-bar';
import { ActivatedRoute, Router } from '@angular/router';
-import { Account, AssetClass, DataSource, Platform } from '@prisma/client';
+import {
+ Account,
+ AssetClass,
+ AssetSubClass,
+ DataSource,
+ Platform
+} from '@prisma/client';
import { isNumber } from 'lodash';
import { DeviceDetectorService } from 'ngx-device-detector';
import { Subject } from 'rxjs';
@@ -48,7 +54,7 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./allocations-page.scss'],
templateUrl: './allocations-page.html'
})
-export class AllocationsPageComponent implements OnDestroy, OnInit {
+export class GfAllocationsPageComponent implements OnDestroy, OnInit {
public accounts: {
[id: string]: Pick & {
id: string;
@@ -63,6 +69,18 @@ export class AllocationsPageComponent implements OnDestroy, OnInit {
};
public deviceType: string;
public hasImpersonationId: boolean;
+ public holdings: {
+ [symbol: string]: Pick<
+ PortfolioPosition,
+ | 'assetClass'
+ | 'assetClassLabel'
+ | 'assetSubClass'
+ | 'assetSubClassLabel'
+ | 'currency'
+ | 'exchange'
+ | 'name'
+ > & { etfProvider: string; value: number };
+ };
public isLoading = false;
public markets: {
[key in Market]: { id: Market; valueInPercentage: number };
@@ -81,18 +99,6 @@ export class AllocationsPageComponent implements OnDestroy, OnInit {
};
};
public portfolioDetails: PortfolioDetails;
- public positions: {
- [symbol: string]: Pick<
- PortfolioPosition,
- | 'assetClass'
- | 'assetClassLabel'
- | 'assetSubClass'
- | 'assetSubClassLabel'
- | 'currency'
- | 'exchange'
- | 'name'
- > & { etfProvider: string; value: number };
- };
public sectors: {
[name: string]: { name: string; value: number };
};
@@ -237,6 +243,7 @@ export class AllocationsPageComponent implements OnDestroy, OnInit {
value: 0
}
};
+ this.holdings = {};
this.marketsAdvanced = {
[UNKNOWN_KEY]: {
id: UNKNOWN_KEY,
@@ -282,7 +289,6 @@ export class AllocationsPageComponent implements OnDestroy, OnInit {
platforms: {},
summary: undefined
};
- this.positions = {};
this.sectors = {
[UNKNOWN_KEY]: {
name: UNKNOWN_KEY,
@@ -319,16 +325,6 @@ export class AllocationsPageComponent implements OnDestroy, OnInit {
};
}
- this.markets = this.portfolioDetails.markets;
-
- Object.values(this.portfolioDetails.marketsAdvanced).forEach(
- ({ id, valueInBaseCurrency, valueInPercentage }) => {
- this.marketsAdvanced[id].value = isNumber(valueInBaseCurrency)
- ? valueInBaseCurrency
- : valueInPercentage;
- }
- );
-
for (const [symbol, position] of Object.entries(
this.portfolioDetails.holdings
)) {
@@ -340,12 +336,12 @@ export class AllocationsPageComponent implements OnDestroy, OnInit {
value = position.valueInBaseCurrency;
}
- this.positions[symbol] = {
+ this.holdings[symbol] = {
value,
- assetClass: position.assetClass,
- assetClassLabel: position.assetClassLabel,
- assetSubClass: position.assetSubClass,
- assetSubClassLabel: position.assetSubClassLabel,
+ assetClass: position.assetClass || (UNKNOWN_KEY as AssetClass),
+ assetClassLabel: position.assetClassLabel || UNKNOWN_KEY,
+ assetSubClass: position.assetSubClass || (UNKNOWN_KEY as AssetSubClass),
+ assetSubClassLabel: position.assetSubClassLabel || UNKNOWN_KEY,
currency: position.currency,
etfProvider: this.extractEtfProvider({
assetSubClass: position.assetSubClass,
@@ -462,8 +458,8 @@ export class AllocationsPageComponent implements OnDestroy, OnInit {
}
}
- if (this.positions[symbol].assetSubClass === 'ETF') {
- this.totalValueInEtf += this.positions[symbol].value;
+ if (this.holdings[symbol].assetSubClass === 'ETF') {
+ this.totalValueInEtf += this.holdings[symbol].value;
}
this.symbols[prettifySymbol(symbol)] = {
@@ -476,6 +472,16 @@ export class AllocationsPageComponent implements OnDestroy, OnInit {
};
}
+ this.markets = this.portfolioDetails.markets;
+
+ Object.values(this.portfolioDetails.marketsAdvanced).forEach(
+ ({ id, valueInBaseCurrency, valueInPercentage }) => {
+ this.marketsAdvanced[id].value = isNumber(valueInBaseCurrency)
+ ? valueInBaseCurrency
+ : valueInPercentage;
+ }
+ );
+
for (const [
id,
{ name, valueInBaseCurrency, valueInPercentage }
diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html
index 1436f6ab4..7153e2e53 100644
--- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html
+++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html
@@ -70,7 +70,7 @@
;
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 81ea8f64e..91cf4c91b 100644
--- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.routes.ts
+++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.routes.ts
@@ -3,12 +3,12 @@ import { internalRoutes } from '@ghostfolio/common/routes/routes';
import { Routes } from '@angular/router';
-import { AnalysisPageComponent } from './analysis-page.component';
+import { GfAnalysisPageComponent } from './analysis-page.component';
export const routes: Routes = [
{
canActivate: [AuthGuard],
- component: AnalysisPageComponent,
+ component: GfAnalysisPageComponent,
path: '',
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 154c047bd..83650d9ca 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
@@ -27,7 +27,7 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./fire-page.scss'],
templateUrl: './fire-page.html'
})
-export class FirePageComponent implements OnDestroy, OnInit {
+export class GfFirePageComponent implements OnDestroy, OnInit {
public deviceType: string;
public fireWealth: Big;
public hasImpersonationId: boolean;
diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page.routes.ts b/apps/client/src/app/pages/portfolio/fire/fire-page.routes.ts
index 2cf8628cf..1d3926dd1 100644
--- a/apps/client/src/app/pages/portfolio/fire/fire-page.routes.ts
+++ b/apps/client/src/app/pages/portfolio/fire/fire-page.routes.ts
@@ -2,12 +2,12 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { Routes } from '@angular/router';
-import { FirePageComponent } from './fire-page.component';
+import { GfFirePageComponent } from './fire-page.component';
export const routes: Routes = [
{
canActivate: [AuthGuard],
- component: FirePageComponent,
+ component: GfFirePageComponent,
path: '',
title: 'FIRE'
}
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 99c5d21c6..5aabfc749 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
@@ -35,7 +35,7 @@ import { Subject, takeUntil } from 'rxjs';
styleUrl: './x-ray-page.component.scss',
templateUrl: './x-ray-page.component.html'
})
-export class XRayPageComponent {
+export class GfXRayPageComponent {
public accountClusterRiskRules: PortfolioReportRule[];
public assetClassClusterRiskRules: PortfolioReportRule[];
public currencyClusterRiskRules: PortfolioReportRule[];
diff --git a/apps/client/src/app/pages/portfolio/x-ray/x-ray-page.routes.ts b/apps/client/src/app/pages/portfolio/x-ray/x-ray-page.routes.ts
index 664df261c..3c861eb0a 100644
--- a/apps/client/src/app/pages/portfolio/x-ray/x-ray-page.routes.ts
+++ b/apps/client/src/app/pages/portfolio/x-ray/x-ray-page.routes.ts
@@ -2,12 +2,12 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { Routes } from '@angular/router';
-import { XRayPageComponent } from './x-ray-page.component';
+import { GfXRayPageComponent } from './x-ray-page.component';
export const routes: Routes = [
{
canActivate: [AuthGuard],
- component: XRayPageComponent,
+ component: GfXRayPageComponent,
path: '',
title: 'X-ray'
}
diff --git a/apps/client/src/app/pages/user-account/user-account-page-routing.module.ts b/apps/client/src/app/pages/user-account/user-account-page-routing.module.ts
deleted file mode 100644
index 598381cc2..000000000
--- a/apps/client/src/app/pages/user-account/user-account-page-routing.module.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import { UserAccountAccessComponent } from '@ghostfolio/client/components/user-account-access/user-account-access.component';
-import { UserAccountMembershipComponent } from '@ghostfolio/client/components/user-account-membership/user-account-membership.component';
-import { UserAccountSettingsComponent } from '@ghostfolio/client/components/user-account-settings/user-account-settings.component';
-import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
-import { internalRoutes } from '@ghostfolio/common/routes/routes';
-
-import { NgModule } from '@angular/core';
-import { RouterModule, Routes } from '@angular/router';
-
-import { UserAccountPageComponent } from './user-account-page.component';
-
-const routes: Routes = [
- {
- canActivate: [AuthGuard],
- children: [
- {
- path: '',
- component: UserAccountSettingsComponent,
- title: internalRoutes.account.title
- },
- {
- path: internalRoutes.account.subRoutes.membership.path,
- component: UserAccountMembershipComponent,
- title: internalRoutes.account.subRoutes.membership.title
- },
- {
- path: internalRoutes.account.subRoutes.access.path,
- component: UserAccountAccessComponent,
- title: internalRoutes.account.subRoutes.access.title
- }
- ],
- component: UserAccountPageComponent,
- path: '',
- title: $localize`My Ghostfolio`
- }
-];
-
-@NgModule({
- imports: [RouterModule.forChild(routes)],
- exports: [RouterModule]
-})
-export class UserAccountPageRoutingModule {}
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 5fc9efeae..4b76dbb9e 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
@@ -2,7 +2,17 @@ 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 { CommonModule } from '@angular/common';
+import {
+ ChangeDetectorRef,
+ Component,
+ CUSTOM_ELEMENTS_SCHEMA,
+ OnDestroy,
+ 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 { diamondOutline, keyOutline, settingsOutline } from 'ionicons/icons';
import { DeviceDetectorService } from 'ngx-device-detector';
@@ -10,12 +20,13 @@ import { Subject, takeUntil } from 'rxjs';
@Component({
host: { class: 'page has-tabs' },
+ imports: [CommonModule, IonIcon, MatTabsModule, RouterModule],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
selector: 'gf-user-account-page',
styleUrls: ['./user-account-page.scss'],
- templateUrl: './user-account-page.html',
- standalone: false
+ templateUrl: './user-account-page.html'
})
-export class UserAccountPageComponent implements OnDestroy, OnInit {
+export class GfUserAccountPageComponent implements OnDestroy, OnInit {
public deviceType: string;
public tabs: TabConfiguration[] = [];
public user: User;
diff --git a/apps/client/src/app/pages/user-account/user-account-page.module.ts b/apps/client/src/app/pages/user-account/user-account-page.module.ts
deleted file mode 100644
index 553591bbe..000000000
--- a/apps/client/src/app/pages/user-account/user-account-page.module.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { GfUserAccountAccessModule } from '@ghostfolio/client/components/user-account-access/user-account-access.module';
-import { GfUserAccountMembershipModule } from '@ghostfolio/client/components/user-account-membership/user-account-membership.module';
-import { GfUserAccountSettingsModule } from '@ghostfolio/client/components/user-account-settings/user-account-settings.module';
-
-import { CommonModule } from '@angular/common';
-import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
-import { MatTabsModule } from '@angular/material/tabs';
-import { IonIcon } from '@ionic/angular/standalone';
-
-import { UserAccountPageRoutingModule } from './user-account-page-routing.module';
-import { UserAccountPageComponent } from './user-account-page.component';
-
-@NgModule({
- declarations: [UserAccountPageComponent],
- imports: [
- CommonModule,
- GfUserAccountAccessModule,
- GfUserAccountMembershipModule,
- GfUserAccountSettingsModule,
- IonIcon,
- MatTabsModule,
- UserAccountPageRoutingModule
- ],
- schemas: [CUSTOM_ELEMENTS_SCHEMA]
-})
-export class UserAccountPageModule {}
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
new file mode 100644
index 000000000..5d0f5b202
--- /dev/null
+++ b/apps/client/src/app/pages/user-account/user-account-page.routes.ts
@@ -0,0 +1,35 @@
+import { GfUserAccountAccessComponent } from '@ghostfolio/client/components/user-account-access/user-account-access.component';
+import { GfUserAccountMembershipComponent } from '@ghostfolio/client/components/user-account-membership/user-account-membership.component';
+import { GfUserAccountSettingsComponent } from '@ghostfolio/client/components/user-account-settings/user-account-settings.component';
+import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
+import { internalRoutes } from '@ghostfolio/common/routes/routes';
+
+import { Routes } from '@angular/router';
+
+import { GfUserAccountPageComponent } from './user-account-page.component';
+
+export const routes: Routes = [
+ {
+ canActivate: [AuthGuard],
+ children: [
+ {
+ path: '',
+ component: GfUserAccountSettingsComponent,
+ title: internalRoutes.account.title
+ },
+ {
+ path: internalRoutes.account.subRoutes.membership.path,
+ component: GfUserAccountMembershipComponent,
+ title: internalRoutes.account.subRoutes.membership.title
+ },
+ {
+ path: internalRoutes.account.subRoutes.access.path,
+ component: GfUserAccountAccessComponent,
+ title: internalRoutes.account.subRoutes.access.title
+ }
+ ],
+ component: GfUserAccountPageComponent,
+ path: '',
+ title: $localize`My Ghostfolio`
+ }
+];
diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf
index e0b491e64..f849aae31 100644
--- a/apps/client/src/locales/messages.ca.xlf
+++ b/apps/client/src/locales/messages.ca.xlf
@@ -2203,11 +2203,11 @@
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 133
+ 155
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 163
+ 193
@@ -2327,7 +2327,7 @@
Informar d’un Problema amb les Dades
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
- 423
+ 443
@@ -3027,7 +3027,7 @@
Introduïu el vostre codi de cupó.
apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
- 202
+ 215
@@ -3035,7 +3035,7 @@
No s’ha pogut bescanviar el codi de cupó
apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
- 166
+ 179
@@ -3043,7 +3043,7 @@
El codi del cupó s’ha bescanviat
apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
- 179
+ 192
@@ -3051,7 +3051,7 @@
Torna a carregar
apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
- 180
+ 193
@@ -3087,7 +3087,7 @@
Automàtic
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 41
+ 71
@@ -3095,7 +3095,7 @@
De debò vols tancar el teu compte de Ghostfolio?
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
- 178
+ 208
@@ -3103,7 +3103,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
- 252
+ 282
@@ -3111,7 +3111,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
- 306
+ 336
@@ -3339,7 +3339,7 @@
D’acord
apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
- 141
+ 154
apps/client/src/app/core/http-response.interceptor.ts
@@ -3431,7 +3431,7 @@
Vaja, la transferència del saldo en efectiu ha fallat.
apps/client/src/app/pages/accounts/accounts-page.component.ts
- 322
+ 330
@@ -5338,7 +5338,7 @@
❌ No
- ❌ No
+ ❌ No
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
147
@@ -5374,7 +5374,7 @@
Self-Hosting
- Self-Hosting
+ Autoallotjament
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
170
@@ -5382,7 +5382,7 @@
Use anonymously
- Use anonymously
+ Utilitza de manera anònima
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
209
@@ -5390,7 +5390,7 @@
Free Plan
- Free Plan
+ Pla gratuït
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
248
@@ -5398,7 +5398,7 @@
Starting from
- Starting from
+ A partir de
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
289
@@ -5410,7 +5410,7 @@
year
- year
+ any
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
290
@@ -5422,7 +5422,7 @@
Notes
- Notes
+ Notes
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
302
@@ -5446,7 +5446,7 @@
Effortlessly track, analyze, and visualize your wealth with Ghostfolio.
- Effortlessly track, analyze, and visualize your wealth with Ghostfolio.
+ Fes un seguiment, analitza i visualitza el teu patrimoni sense esforç amb Ghostfolio.
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
328
@@ -5454,7 +5454,7 @@
Get Started
- Get Started
+ Comença
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
333
@@ -5462,7 +5462,7 @@
Personal Finance Tools
- Personal Finance Tools
+ Eines de finances personals
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
351
@@ -5470,7 +5470,7 @@
Resources
- Resources
+ Recursos
libs/common/src/lib/routes/routes.ts
332
@@ -5478,7 +5478,7 @@
Guides
- Guides
+ Guies
apps/client/src/app/pages/resources/guides/resources-guides.component.html
4
@@ -5486,7 +5486,7 @@
Glossary
- Glossary
+ Glossari
apps/client/src/app/pages/resources/glossary/resources-glossary.component.html
4
@@ -5494,7 +5494,7 @@
Membership
- Membership
+ Pertinença
libs/common/src/lib/routes/routes.ts
31
@@ -5502,7 +5502,7 @@
Access
- Access
+ Access
libs/common/src/lib/routes/routes.ts
26
@@ -5510,10 +5510,10 @@
My Ghostfolio
- My Ghostfolio
+ El meu Ghostfolio
- apps/client/src/app/pages/user-account/user-account-page-routing.module.ts
- 34
+ apps/client/src/app/pages/user-account/user-account-page.routes.ts
+ 33
@@ -5646,7 +5646,7 @@
Week to date
- Week to date
+ Setmana fins avui
libs/ui/src/lib/assistant/assistant.component.ts
354
@@ -5654,7 +5654,7 @@
WTD
- WTD
+ WTD
libs/ui/src/lib/assistant/assistant.component.ts
354
@@ -5662,7 +5662,7 @@
Month to date
- Month to date
+ Mes fins a la data
libs/ui/src/lib/assistant/assistant.component.ts
358
@@ -5670,7 +5670,7 @@
MTD
- MTD
+ MTD
libs/ui/src/lib/assistant/assistant.component.ts
358
@@ -5678,7 +5678,7 @@
Year to date
- Year to date
+ Any fins a la data
libs/ui/src/lib/assistant/assistant.component.ts
362
@@ -5686,7 +5686,7 @@
year
- year
+ any
libs/ui/src/lib/assistant/assistant.component.ts
372
@@ -5694,7 +5694,7 @@
years
- years
+ anys
libs/ui/src/lib/assistant/assistant.component.ts
397
@@ -5702,7 +5702,7 @@
Asset Profiles
- Asset Profiles
+ Perfils d’actius
apps/client/src/app/components/admin-settings/admin-settings.component.html
106
@@ -5710,7 +5710,7 @@
Date Range
- Date Range
+ Interval de dates
libs/ui/src/lib/assistant/assistant.html
130
@@ -5718,7 +5718,7 @@
Reset Filters
- Reset Filters
+ Restableix els filtres
libs/ui/src/lib/assistant/assistant.html
224
@@ -5726,7 +5726,7 @@
Apply Filters
- Apply Filters
+ Aplicar filtres
libs/ui/src/lib/assistant/assistant.html
234
@@ -6009,7 +6009,7 @@
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 400
+ 411
@@ -6317,11 +6317,11 @@
No data available
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 402
+ 413
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
- 415
+ 426
@@ -7059,7 +7059,7 @@
Could not generate an API key
apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
- 128
+ 141
@@ -7067,7 +7067,7 @@
Set this API key in your self-hosted environment:
apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
- 143
+ 156
@@ -7075,7 +7075,7 @@
Ghostfolio Premium Data Provider API Key
apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
- 146
+ 159
@@ -7083,7 +7083,7 @@
Do you really want to generate a new API key?
apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
- 151
+ 164
@@ -7147,7 +7147,7 @@
Me
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 191
+ 213
@@ -7387,7 +7387,7 @@
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 149
+ 171
@@ -8008,7 +8008,7 @@
Do you really want to generate a new security token?
apps/client/src/app/components/user-account-access/user-account-access.component.ts
- 154
+ 176
@@ -8047,6 +8047,14 @@
56
+
+ Manage Asset Profile
+ Manage Asset Profile
+
+ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
+ 434
+
+