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) ) {

- Report Data Glitch + @if (data.hasPermissionToAccessAdminControl) { + Manage Asset Profile... + } + @if ( + dataSource?.data.length > 0 && + data.hasPermissionToReportDataGlitch === true + ) { + Report Data Glitch... + }
} 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 + + diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index b24e89c97..150429eee 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -1046,11 +1046,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 @@ -1370,7 +1370,7 @@ Datenfehler melden apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 423 + 443 @@ -1474,7 +1474,7 @@ Okay apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 154 apps/client/src/app/core/http-response.interceptor.ts @@ -1641,8 +1641,8 @@ My Ghostfolio Mein 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 @@ -1650,7 +1650,7 @@ Bitte gebe deinen Gutscheincode ein. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 202 + 215 @@ -1658,7 +1658,7 @@ Gutscheincode konnte nicht eingelöst werden apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 166 + 179 @@ -1666,7 +1666,7 @@ Gutscheincode wurde eingelöst apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 192 @@ -1674,7 +1674,7 @@ Neu laden apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 180 + 193 @@ -1682,7 +1682,7 @@ Möchtest du diese Anmeldemethode wirklich löschen? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 252 + 282 @@ -2906,7 +2906,7 @@ Automatisch apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 41 + 71 @@ -3110,7 +3110,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 411 @@ -3118,11 +3118,11 @@ Keine Daten verfügbar 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 @@ -5716,7 +5716,7 @@ Ups, der Cash-Bestand Transfer ist fehlgeschlagen. apps/client/src/app/pages/accounts/accounts-page.component.ts - 322 + 330 @@ -6241,7 +6241,7 @@ Möchtest du dieses Ghostfolio Konto wirklich schliessen? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 178 + 208 @@ -6289,7 +6289,7 @@ Ups! Beim Einrichten der biometrischen Authentifizierung ist ein Fehler aufgetreten. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 306 + 336 @@ -7083,7 +7083,7 @@ API-Schlüssel konnte nicht erstellt werden apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 128 + 141 @@ -7091,7 +7091,7 @@ Setze diesen API-Schlüssel in deiner selbst gehosteten Umgebung: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 143 + 156 @@ -7099,7 +7099,7 @@ API-Schlüssel für den Ghostfolio Premium Datenanbieter apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 146 + 159 @@ -7107,7 +7107,7 @@ Möchtest du wirklich einen neuen API-Schlüssel erstellen? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 151 + 164 @@ -7171,7 +7171,7 @@ Ich apps/client/src/app/components/user-account-access/user-account-access.component.ts - 191 + 213 @@ -7411,7 +7411,7 @@ apps/client/src/app/components/user-account-access/user-account-access.component.ts - 149 + 171 @@ -8008,7 +8008,7 @@ Möchtest du wirklich ein neues Sicherheits-Token generieren? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 154 + 176 @@ -8047,6 +8047,14 @@ 56 + + Manage Asset Profile + Anlageprofil verwalten + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 434 + + diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 1b856c08d..e0ef4dd37 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -1031,11 +1031,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 @@ -1355,7 +1355,7 @@ Reporta un anomalía de los datos apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 423 + 443 @@ -1459,7 +1459,7 @@ De acuerdo apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 154 apps/client/src/app/core/http-response.interceptor.ts @@ -1626,8 +1626,8 @@ My Ghostfolio Mi 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 @@ -1635,7 +1635,7 @@ Por favor, ingresa tu código de cupón: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 202 + 215 @@ -1643,7 +1643,7 @@ No se puede canjear este código de cupón apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 166 + 179 @@ -1651,7 +1651,7 @@ El codigo de cupón ha sido canjeado apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 192 @@ -1659,7 +1659,7 @@ Refrescar apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 180 + 193 @@ -1667,7 +1667,7 @@ ¿Estás seguro de eliminar este método de acceso? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 252 + 282 @@ -2891,7 +2891,7 @@ Automático apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 41 + 71 @@ -3095,7 +3095,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 411 @@ -3103,11 +3103,11 @@ Sin datos disponibles 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 @@ -5693,7 +5693,7 @@ Oops, el saldo de efectivo no se ha transferido. apps/client/src/app/pages/accounts/accounts-page.component.ts - 322 + 330 @@ -6218,7 +6218,7 @@ ¿Estás seguro de querer borrar tu cuenta de Ghostfolio? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 178 + 208 @@ -6266,7 +6266,7 @@ ¡Ups! Hubo un error al configurar la autenticación biométrica. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 306 + 336 @@ -6279,7 +6279,7 @@ Benchmarks - Benchmarks + Puntos de referencia apps/client/src/app/components/admin-market-data/admin-market-data.component.ts 91 @@ -6303,7 +6303,7 @@ Oops! Could not delete profiles. - Oops! Could not delete profiles. + ¡Ups! No se pudieron eliminar los perfiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts 56 @@ -6327,7 +6327,7 @@ Would you like to refine your personal investment strategy? - Would you like to refine your personal investment strategy? + ¿Te gustaría refinar tu estrategia de inversión personal? apps/client/src/app/pages/public/public-page.html 211 @@ -6335,7 +6335,7 @@ Alternative - Alternative + Alternativa apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 80 @@ -6343,7 +6343,7 @@ App - App + Aplicación apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 81 @@ -6351,7 +6351,7 @@ Budgeting - Budgeting + Presupuestación apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 82 @@ -6359,7 +6359,7 @@ Community - Community + Comunidad apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 83 @@ -6367,7 +6367,7 @@ Family Office - Family Office + Family Office apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 84 @@ -6375,7 +6375,7 @@ Investor - Investor + Inversor apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 87 @@ -6383,7 +6383,7 @@ Open Source - Open Source + Código abierto apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 88 @@ -6391,7 +6391,7 @@ Personal Finance - Personal Finance + Finanzas personales apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 90 @@ -6399,7 +6399,7 @@ Privacy - Privacy + Privacidad apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 91 @@ -6407,7 +6407,7 @@ Software - Software + Software apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 93 @@ -6415,7 +6415,7 @@ Tool - Tool + Herramienta apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 @@ -6423,7 +6423,7 @@ User Experience - User Experience + Experiencia del usuario apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 95 @@ -6431,7 +6431,7 @@ Wealth - Wealth + Riqueza apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 96 @@ -6439,7 +6439,7 @@ Wealth Management - Wealth Management + Gestión de patrimonios apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 97 @@ -6447,7 +6447,7 @@ Australia - Australia + Australia libs/ui/src/lib/i18n.ts 74 @@ -6455,7 +6455,7 @@ Austria - Austria + Austria libs/ui/src/lib/i18n.ts 75 @@ -6463,7 +6463,7 @@ Belgium - Belgium + Bélgica libs/ui/src/lib/i18n.ts 76 @@ -6471,7 +6471,7 @@ Bulgaria - Bulgaria + Bulgaria libs/ui/src/lib/i18n.ts 78 @@ -6479,7 +6479,7 @@ Canada - Canada + Canadá libs/ui/src/lib/i18n.ts 79 @@ -6487,7 +6487,7 @@ Czech Republic - Czech Republic + República Checa libs/ui/src/lib/i18n.ts 80 @@ -6495,7 +6495,7 @@ Finland - Finland + Finlandia libs/ui/src/lib/i18n.ts 81 @@ -6503,7 +6503,7 @@ France - France + Francia libs/ui/src/lib/i18n.ts 82 @@ -6511,7 +6511,7 @@ Germany - Germany + Alemania libs/ui/src/lib/i18n.ts 83 @@ -6519,7 +6519,7 @@ India - India + India libs/ui/src/lib/i18n.ts 84 @@ -7060,7 +7060,7 @@ Could not generate an API key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 128 + 141 @@ -7068,7 +7068,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 @@ -7076,7 +7076,7 @@ Ghostfolio Premium Data Provider API Key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 146 + 159 @@ -7084,7 +7084,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 @@ -7148,7 +7148,7 @@ Me apps/client/src/app/components/user-account-access/user-account-access.component.ts - 191 + 213 @@ -7388,7 +7388,7 @@ apps/client/src/app/components/user-account-access/user-account-access.component.ts - 149 + 171 @@ -8009,7 +8009,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 @@ -8048,6 +8048,14 @@ 56 + + Manage Asset Profile + Manage Asset Profile + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 434 + + diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index fad013356..2ef2876ff 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -1342,11 +1342,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 @@ -1706,7 +1706,7 @@ Signaler une Erreur de Données apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 423 + 443 @@ -1810,7 +1810,7 @@ D’accord apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 154 apps/client/src/app/core/http-response.interceptor.ts @@ -1881,8 +1881,8 @@ My Ghostfolio Mon 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 @@ -1890,7 +1890,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 41 + 71 @@ -1898,7 +1898,7 @@ Veuillez entrer votre code promotionnel. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 202 + 215 @@ -1906,7 +1906,7 @@ Le code promotionnel n’a pas pu être appliqué apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 166 + 179 @@ -1914,7 +1914,7 @@ Le code promotionnel a été appliqué apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 192 @@ -1922,7 +1922,7 @@ Rafraîchir apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 180 + 193 @@ -1930,7 +1930,7 @@ Voulez-vous vraiment supprimer cette méthode de connexion ? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 252 + 282 @@ -3154,7 +3154,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 411 @@ -3330,11 +3330,11 @@ Pas de données disponibles 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 @@ -5692,7 +5692,7 @@ Oops, échec du transfert de la cash balance. apps/client/src/app/pages/accounts/accounts-page.component.ts - 322 + 330 @@ -6217,7 +6217,7 @@ Confirmer la suppresion de votre compte Ghostfolio ? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 178 + 208 @@ -6265,7 +6265,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 - 306 + 336 @@ -7059,7 +7059,7 @@ Impossible de générer une clé API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 128 + 141 @@ -7067,7 +7067,7 @@ Définissez cette clé API dans votre environnement auto-hébergé : apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 143 + 156 @@ -7075,7 +7075,7 @@ Clé API du fournisseur de données Ghostfolio Premium apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 146 + 159 @@ -7083,7 +7083,7 @@ Voulez-vous vraiment générer une nouvelle clé API ? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 151 + 164 @@ -7147,7 +7147,7 @@ Moi 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 + + diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index e5329e2a7..f5906fb07 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -1031,11 +1031,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 @@ -1355,7 +1355,7 @@ Segnala un’anomalia dei dati apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 423 + 443 @@ -1459,7 +1459,7 @@ Bene apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 154 apps/client/src/app/core/http-response.interceptor.ts @@ -1626,8 +1626,8 @@ My Ghostfolio Il mio 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 @@ -1635,7 +1635,7 @@ Inserisci il tuo codice del buono: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 202 + 215 @@ -1643,7 +1643,7 @@ Impossibile riscattare il codice del buono apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 166 + 179 @@ -1651,7 +1651,7 @@ Il codice del buono è stato riscattato apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 192 @@ -1659,7 +1659,7 @@ Ricarica apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 180 + 193 @@ -1667,7 +1667,7 @@ Vuoi davvero rimuovere questo metodo di accesso? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 252 + 282 @@ -2891,7 +2891,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 41 + 71 @@ -3095,7 +3095,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 411 @@ -3103,11 +3103,11 @@ Nessun dato disponibile 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 @@ -5693,7 +5693,7 @@ Ops, il trasferimento del saldo di cassa è fallito. apps/client/src/app/pages/accounts/accounts-page.component.ts - 322 + 330 @@ -6218,7 +6218,7 @@ Confermi di voler chiudere il tuo account Ghostfolio? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 178 + 208 @@ -6266,7 +6266,7 @@ Ops! C’è stato un errore impostando l’autenticazione biometrica. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 306 + 336 @@ -7060,7 +7060,7 @@ Non è stato possibile generare un API key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 128 + 141 @@ -7068,7 +7068,7 @@ Imposta questa API key nel tuo ambiente self-hosted: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 143 + 156 @@ -7076,7 +7076,7 @@ API Key for Ghostfolio Premium Data Provider apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 146 + 159 @@ -7084,7 +7084,7 @@ Vuoi davvero generare una nuova API key? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 151 + 164 @@ -7148,7 +7148,7 @@ Me apps/client/src/app/components/user-account-access/user-account-access.component.ts - 191 + 213 @@ -7388,7 +7388,7 @@ apps/client/src/app/components/user-account-access/user-account-access.component.ts - 149 + 171 @@ -8009,7 +8009,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 @@ -8048,6 +8048,14 @@ 56 + + Manage Asset Profile + Manage Asset Profile + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 434 + + diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index c8d146588..981de4dd9 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -1030,11 +1030,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 @@ -1354,7 +1354,7 @@ Gegevensstoring melden apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 423 + 443 @@ -1458,7 +1458,7 @@ Oké apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 154 apps/client/src/app/core/http-response.interceptor.ts @@ -1625,8 +1625,8 @@ My Ghostfolio Mijn 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 @@ -1634,7 +1634,7 @@ Voer je couponcode in: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 202 + 215 @@ -1642,7 +1642,7 @@ Kon je kortingscode niet inwisselen apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 166 + 179 @@ -1650,7 +1650,7 @@ Je couponcode is ingewisseld apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 192 @@ -1658,7 +1658,7 @@ Herladen apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 180 + 193 @@ -1666,7 +1666,7 @@ Wil je deze aanmeldingsmethode echt verwijderen? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 252 + 282 @@ -2890,7 +2890,7 @@ Automatisch apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 41 + 71 @@ -3094,7 +3094,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 411 @@ -3102,11 +3102,11 @@ Geen gegevens beschikbaar 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 @@ -5692,7 +5692,7 @@ Oeps, geldoverdracht is mislukt. apps/client/src/app/pages/accounts/accounts-page.component.ts - 322 + 330 @@ -6217,7 +6217,7 @@ Wilt u uw Ghostfolio account echt sluiten? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 178 + 208 @@ -6265,7 +6265,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 - 306 + 336 @@ -7059,7 +7059,7 @@ Er kon geen API-sleutel worden gegenereerd apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 128 + 141 @@ -7067,7 +7067,7 @@ Stel deze API-sleutel in uw zelf-gehoste omgeving in: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 143 + 156 @@ -7075,7 +7075,7 @@ Ghostfolio Premium Gegevensleverancier API-sleutel apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 146 + 159 @@ -7083,7 +7083,7 @@ Wilt u echt een nieuwe API-sleutel genereren? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 151 + 164 @@ -7147,7 +7147,7 @@ Ik 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 @@ Wilt u echt een nieuwe securitytoken genereren? 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 + + diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index f88625f65..a033efef6 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -2015,11 +2015,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 @@ -2515,7 +2515,7 @@ Zgłoś Błąd Danych apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 423 + 443 @@ -2759,7 +2759,7 @@ Wpisz kod kuponu: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 202 + 215 @@ -2767,7 +2767,7 @@ Nie udało się zrealizować kodu kuponu apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 166 + 179 @@ -2775,7 +2775,7 @@ Kupon został zrealizowany apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 192 @@ -2783,7 +2783,7 @@ Odśwież apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 180 + 193 @@ -2819,7 +2819,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 41 + 71 @@ -2827,7 +2827,7 @@ Czy na pewno chcesz usunąć tą metode logowania? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 252 + 282 @@ -3035,7 +3035,7 @@ Okej apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 154 apps/client/src/app/core/http-response.interceptor.ts @@ -3119,7 +3119,7 @@ Ups, transfer salda nie powiódł się. apps/client/src/app/pages/accounts/accounts-page.component.ts - 322 + 330 @@ -5067,8 +5067,8 @@ My Ghostfolio Moje 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 @@ -5428,7 +5428,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 411 @@ -5728,11 +5728,11 @@ Brak danych 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 @@ -6217,7 +6217,7 @@ Czy na pewno chcesz zamknąć swoje konto Ghostfolio? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 178 + 208 @@ -6265,7 +6265,7 @@ Ups! Wystąpił błąd podczas konfigurowania uwierzytelniania biometrycznego. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 306 + 336 @@ -7059,7 +7059,7 @@ Nie udało się wygenerować klucza API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 128 + 141 @@ -7067,7 +7067,7 @@ Ustaw ten klucz API w samodzielnie hostowanym środowisku: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 143 + 156 @@ -7075,7 +7075,7 @@ Klucz API dostawcy danych Premium Ghostfolio apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 146 + 159 @@ -7083,7 +7083,7 @@ Czy na pewno chcesz wygenerować nowy klucz API? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 151 + 164 @@ -7147,7 +7147,7 @@ Ja 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 + + diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 2e97ca5a6..1c9ac7f97 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -1214,11 +1214,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 @@ -1666,7 +1666,7 @@ Dados do Relatório com Problema apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 423 + 443 @@ -1794,7 +1794,7 @@ OK apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 154 apps/client/src/app/core/http-response.interceptor.ts @@ -1865,8 +1865,8 @@ My Ghostfolio O 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 @@ -1874,7 +1874,7 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 41 + 71 @@ -1882,7 +1882,7 @@ Por favor, insira o seu código de cupão: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 202 + 215 @@ -1890,7 +1890,7 @@ Não foi possível resgatar o código de cupão apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 166 + 179 @@ -1898,7 +1898,7 @@ Código de cupão foi resgatado apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 192 @@ -1906,7 +1906,7 @@ Atualizar apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 180 + 193 @@ -1914,7 +1914,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 - 252 + 282 @@ -3002,7 +3002,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 411 @@ -3178,11 +3178,11 @@ Sem dados disponíveis 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 @@ -5692,7 +5692,7 @@ Ops, a transferência do saldo em dinheiro falhou. apps/client/src/app/pages/accounts/accounts-page.component.ts - 322 + 330 @@ -6217,7 +6217,7 @@ Você realmente deseja encerrar sua conta Ghostfolio? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 178 + 208 @@ -6265,7 +6265,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 - 306 + 336 @@ -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 + + diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index bf84d20d5..d0a24a9ac 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -1863,11 +1863,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 @@ -2355,7 +2355,7 @@ Rapor Veri Sorunu apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 423 + 443 @@ -2611,7 +2611,7 @@ Tamam apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 154 apps/client/src/app/core/http-response.interceptor.ts @@ -4551,8 +4551,8 @@ My Ghostfolio Benim Ghostfolio’m - 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 @@ -4560,7 +4560,7 @@ Otomatik apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 41 + 71 @@ -4568,7 +4568,7 @@ Lütfen kupon kodunuzu girin: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 202 + 215 @@ -4576,7 +4576,7 @@ Kupon kodu kullanılamadı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 166 + 179 @@ -4584,7 +4584,7 @@ Kupon kodu kullanıldı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 192 @@ -4592,7 +4592,7 @@ Yeniden Yükle apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 180 + 193 @@ -4600,7 +4600,7 @@ Bu giriş yöntemini kaldırmayı gerçekten istiyor musunuz? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 252 + 282 @@ -5144,7 +5144,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 411 @@ -5392,11 +5392,11 @@ Veri mevcut değil 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 @@ -5692,7 +5692,7 @@ Hay Allah, Nakit bakiyesi tranferi başarısız oldu. apps/client/src/app/pages/accounts/accounts-page.component.ts - 322 + 330 @@ -6217,7 +6217,7 @@ Ghostfolio hesabınızı kapatmak istediğinize emin misiniz? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 178 + 208 @@ -6265,7 +6265,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 - 306 + 336 @@ -7059,7 +7059,7 @@ API anahtarı oluşturulamadı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 128 + 141 @@ -7067,7 +7067,7 @@ Bu API anahtarını kendi barındırılan ortamınıza ayarlayın: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 143 + 156 @@ -7075,7 +7075,7 @@ Ghostfolio Premium Veri Sağlayıcı API Anahtarı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 146 + 159 @@ -7083,7 +7083,7 @@ Yeni bir API anahtarı oluşturmak istediğinize emin misiniz? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 151 + 164 @@ -7147,7 +7147,7 @@ Ben 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 + + diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index e2e90189f..f865634f0 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -2299,11 +2299,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 @@ -2431,7 +2431,7 @@ Повідомити про збій даних apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 423 + 443 @@ -3163,7 +3163,7 @@ Я apps/client/src/app/components/user-account-access/user-account-access.component.ts - 191 + 213 @@ -3187,7 +3187,7 @@ Не вдалося згенерувати ключ API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 128 + 141 @@ -3195,7 +3195,7 @@ ОК apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 154 apps/client/src/app/core/http-response.interceptor.ts @@ -3211,7 +3211,7 @@ Встановіть цей ключ API у вашому self-hosted середовищі: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 143 + 156 @@ -3219,7 +3219,7 @@ Ключ API Ghostfolio Premium Data Provider apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 146 + 159 @@ -3227,7 +3227,7 @@ Ви дійсно хочете згенерувати новий ключ API? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 151 + 164 @@ -3235,7 +3235,7 @@ Не вдалося обміняти код купона apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 166 + 179 @@ -3243,7 +3243,7 @@ Код купона був обміняний apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 192 @@ -3251,7 +3251,7 @@ Перезавантажити apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 180 + 193 @@ -3259,7 +3259,7 @@ Будь ласка, введіть ваш код купона. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 202 + 215 @@ -3303,7 +3303,7 @@ Автоматичний apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 41 + 71 @@ -3311,7 +3311,7 @@ Ви дійсно хочете закрити ваш обліковий запис Ghostfolio? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 178 + 208 @@ -3319,7 +3319,7 @@ Ви дійсно хочете вилучити цей спосіб входу? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 252 + 282 @@ -3327,7 +3327,7 @@ Упс! Виникла помилка під час налаштування біометричної автентифікації. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 306 + 336 @@ -3631,7 +3631,7 @@ Упс, перенесення балансу готівки не вдалося. apps/client/src/app/pages/accounts/accounts-page.component.ts - 322 + 330 @@ -6126,8 +6126,8 @@ My Ghostfolio Мій 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 @@ -6663,7 +6663,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 411 @@ -7151,11 +7151,11 @@ Дані недоступні 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 @@ -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 + + diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 0dab1affa..50f5929d7 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -1904,11 +1904,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 @@ -2356,7 +2356,7 @@ Report Data Glitch apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 423 + 443 @@ -2580,28 +2580,28 @@ Please enter your coupon code. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 202 + 215 Could not redeem coupon code apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 166 + 179 Coupon code has been redeemed apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 192 Reload apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 180 + 193 @@ -2633,14 +2633,14 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 41 + 71 Do you really want to remove this sign in method? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 252 + 282 @@ -2825,7 +2825,7 @@ Okay apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 154 apps/client/src/app/core/http-response.interceptor.ts @@ -2900,7 +2900,7 @@ Oops, cash balance transfer has failed. apps/client/src/app/pages/accounts/accounts-page.component.ts - 322 + 330 @@ -4660,8 +4660,8 @@ My 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 @@ -5001,7 +5001,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 411 @@ -5264,11 +5264,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 @@ -5655,7 +5655,7 @@ Do you really want to close your Ghostfolio account? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 178 + 208 @@ -5690,7 +5690,7 @@ Oops! There was an error setting up biometric authentication. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 306 + 336 @@ -6408,28 +6408,28 @@ Could not generate an API key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 128 + 141 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 Ghostfolio Premium Data Provider API Key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 146 + 159 Set this API key in your self-hosted environment: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 143 + 156 @@ -6471,7 +6471,7 @@ Me apps/client/src/app/components/user-account-access/user-account-access.component.ts - 191 + 213 @@ -6682,7 +6682,7 @@ apps/client/src/app/components/user-account-access/user-account-access.component.ts - 149 + 171 @@ -7209,7 +7209,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 @@ -7235,6 +7235,13 @@ 56 + + Manage Asset Profile + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 434 + + diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 820a69521..df3c3a5b0 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -2024,11 +2024,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 @@ -2524,7 +2524,7 @@ 报告数据故障 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 423 + 443 @@ -2768,7 +2768,7 @@ 请输入您的优惠券代码。 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 202 + 215 @@ -2776,7 +2776,7 @@ 无法兑换优惠券代码 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 166 + 179 @@ -2784,7 +2784,7 @@ 优惠券代码已兑换 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 192 @@ -2792,7 +2792,7 @@ 重新加载 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 180 + 193 @@ -2828,7 +2828,7 @@ 自动 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 41 + 71 @@ -2836,7 +2836,7 @@ 您确实要删除此登录方法吗? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 252 + 282 @@ -3044,7 +3044,7 @@ 好的 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 154 apps/client/src/app/core/http-response.interceptor.ts @@ -3128,7 +3128,7 @@ 糟糕,现金余额转账失败。 apps/client/src/app/pages/accounts/accounts-page.component.ts - 322 + 330 @@ -5100,8 +5100,8 @@ My Ghostfolio 我的 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 @@ -5485,7 +5485,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 411 @@ -5785,11 +5785,11 @@ 无可用数据 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 @@ -6218,7 +6218,7 @@ 您确定要关闭您的 Ghostfolio 账户吗? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 178 + 208 @@ -6266,7 +6266,7 @@ 哎呀!设置生物识别认证时发生错误。 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 306 + 336 @@ -7060,7 +7060,7 @@ 无法生成 API 密钥 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 128 + 141 @@ -7068,7 +7068,7 @@ 在您的自托管环境中设置此 API 密钥: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 143 + 156 @@ -7076,7 +7076,7 @@ Ghostfolio Premium 数据提供者 API 密钥 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 146 + 159 @@ -7084,7 +7084,7 @@ 您确定要生成新的 API 密钥吗? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 151 + 164 @@ -7148,7 +7148,7 @@ apps/client/src/app/components/user-account-access/user-account-access.component.ts - 191 + 213 @@ -7388,7 +7388,7 @@ apps/client/src/app/components/user-account-access/user-account-access.component.ts - 149 + 171 @@ -8009,7 +8009,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 @@ -8048,6 +8048,14 @@ 56 + + Manage Asset Profile + Manage Asset Profile + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 434 + + diff --git a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts index 457df01ff..fe8530d7b 100644 --- a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts +++ b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts @@ -1,4 +1,5 @@ import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; +import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { SearchMode } from '@ghostfolio/ui/assistant/enums/search-mode'; import { IAssetSearchResultItem, @@ -54,13 +55,16 @@ export class GfAssistantListItemComponent dataSource: this.item?.dataSource, symbol: this.item?.symbol }; - this.routerLink = ['/admin', 'market-data']; + + this.routerLink = + internalRoutes.adminControl.subRoutes.marketData.routerLink; } else if (this.item?.mode === SearchMode.HOLDING) { this.queryParams = { dataSource: this.item?.dataSource, holdingDetailDialog: true, symbol: this.item?.symbol }; + this.routerLink = []; } else if (this.item?.mode === SearchMode.QUICK_LINK) { this.queryParams = {}; diff --git a/libs/ui/src/lib/i18n.ts b/libs/ui/src/lib/i18n.ts index 62b7d162a..749509f82 100644 --- a/libs/ui/src/lib/i18n.ts +++ b/libs/ui/src/lib/i18n.ts @@ -41,7 +41,7 @@ const locales = { SELL: $localize`Sell`, // AssetClass (enum) - CASH: $localize`Cash`, + ALTERNATIVE_INVESTMENT: $localize`Alternative Investment`, COMMODITY: $localize`Commodity`, EQUITY: $localize`Equity`, FIXED_INCOME: $localize`Fixed Income`, @@ -50,6 +50,8 @@ const locales = { // AssetSubClass (enum) BOND: $localize`Bond`, + CASH: $localize`Cash`, + COLLECTIBLE: $localize`Collectible`, CRYPTOCURRENCY: $localize`Cryptocurrency`, ETF: $localize`ETF`, MUTUALFUND: $localize`Mutual Fund`, 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 bc15ede04..1c5883d60 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 @@ -29,6 +29,7 @@ import { ArcElement } from 'chart.js'; import { DoughnutController } from 'chart.js'; import { Chart } from 'chart.js'; import ChartDataLabels from 'chartjs-plugin-datalabels'; +import { isUUID } from 'class-validator'; import Color from 'color'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; @@ -245,9 +246,13 @@ export class GfPortfolioProportionChartComponent let lightnessRatio = 0.2; Object.keys(item.subCategory ?? {}).forEach((subCategory) => { - backgroundColorSubCategory.push( - Color(item.color).lighten(lightnessRatio).hex() - ); + if (item.name === UNKNOWN_KEY) { + backgroundColorSubCategory.push(item.color); + } else { + backgroundColorSubCategory.push( + Color(item.color).lighten(lightnessRatio).hex() + ); + } dataSubCategory.push(item.subCategory[subCategory].value.toNumber()); labelSubCategory.push(subCategory); @@ -344,8 +349,14 @@ export class GfPortfolioProportionChartComponent align: 'end', anchor: 'end', formatter: (value, context) => { + const symbol = context.chart.data.labels?.[ + context.dataIndex + ] as string; + return value > 0 - ? context.chart.data.labels?.[context.dataIndex] + ? isUUID(symbol) + ? (translate(this.data[symbol]?.name) ?? symbol) + : symbol : ''; }, offset: 8 diff --git a/package-lock.json b/package-lock.json index b806edd9c..b8dfa6a1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.178.0", + "version": "2.179.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.178.0", + "version": "2.179.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 60863424d..74b7f981f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.178.0", + "version": "2.179.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", diff --git a/prisma/migrations/20250708090630_added_alternative_investment_to_asset_class/migration.sql b/prisma/migrations/20250708090630_added_alternative_investment_to_asset_class/migration.sql new file mode 100644 index 000000000..dceb644ff --- /dev/null +++ b/prisma/migrations/20250708090630_added_alternative_investment_to_asset_class/migration.sql @@ -0,0 +1,2 @@ +-- AlterEnum +ALTER TYPE "AssetClass" ADD VALUE 'ALTERNATIVE_INVESTMENT'; diff --git a/prisma/migrations/20250708090631_added_collectible_to_asset_sub_class/migration.sql b/prisma/migrations/20250708090631_added_collectible_to_asset_sub_class/migration.sql new file mode 100644 index 000000000..ddfa2d9ee --- /dev/null +++ b/prisma/migrations/20250708090631_added_collectible_to_asset_sub_class/migration.sql @@ -0,0 +1,2 @@ +-- AlterEnum +ALTER TYPE "AssetSubClass" ADD VALUE 'COLLECTIBLE'; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index bddb0f78c..6080a1aa6 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -278,6 +278,7 @@ enum AccessPermission { } enum AssetClass { + ALTERNATIVE_INVESTMENT COMMODITY EQUITY FIXED_INCOME @@ -288,6 +289,7 @@ enum AssetClass { enum AssetSubClass { BOND CASH + COLLECTIBLE COMMODITY CRYPTOCURRENCY ETF