Your ROOT_URL in app.ini is https://git.cloudchain.link/ but you are visiting https://dash.bss.nz/open-source-mirrors/ghostfolio/commit/46cbbd3bc4af9ed395ef81476190eb37640a83de
You should set ROOT_URL correctly, otherwise the web may not work correctly.
144 changed files with
15942 additions and
17038 deletions
@ -15,7 +15,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Improved support for automatic deletion of unused asset profiles when deleting activities
- Improved the language localization for German (`de`)
- Upgraded the _Stripe_ dependencies
- Upgraded `angular` from version `18.2.8` to `19.0.5`
- Upgraded `husky` from version `9.1.6` to `9.1.7`
- Upgraded `marked` from version `12.0.2` to `15.0.4`
- Upgraded `ng-extract-i18n-merge` from version `2.12.0` to `2.13.1`
- Upgraded `ngx-device-detector` from version `8.0.0` to `9.0.0`
- Upgraded `ngx-markdown` from version `18.0.0` to `19.0.0`
- Upgraded `Nx` from version `20.1.2` to `20.3.0`
- Upgraded `zone.js` from version `0.14.10` to `0.15.0`
## 2.131.0 - 2024-12-25
@ -16,6 +16,12 @@
{
"files" : [ "*.js" , "*.jsx" ] ,
"rules" : { }
} ,
{
"files" : [ "*.ts" ] ,
"rules" : {
"@angular-eslint/prefer-standalone" : "off"
}
}
] ,
"plugins" : [ "@angular-eslint/eslint-plugin" , "@typescript-eslint" ] ,
@ -38,7 +38,8 @@ import { UserService } from './services/user/user.service';
selector : 'gf-root' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
templateUrl : './app.component.html' ,
styleUrls : [ './app.component.scss' ]
styleUrls : [ './app.component.scss' ] ,
standalone : false
} )
export class AppComponent implements OnDestroy , OnInit {
@HostBinding ( 'class.has-info-message' ) get getHasMessage() {
@ -18,7 +18,8 @@ import { MatTableDataSource } from '@angular/material/table';
selector : 'gf-access-table' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
templateUrl : './access-table.component.html' ,
styleUrls : [ './access-table.component.scss' ]
styleUrls : [ './access-table.component.scss' ] ,
standalone : false
} )
export class AccessTableComponent implements OnChanges {
@Input ( ) accesses : Access [ ] ;
@ -37,7 +37,8 @@ import { AccountDetailDialogParams } from './interfaces/interfaces';
selector : 'gf-account-detail-dialog' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
templateUrl : 'account-detail-dialog.html' ,
styleUrls : [ './account-detail-dialog.component.scss' ]
styleUrls : [ './account-detail-dialog.component.scss' ] ,
standalone : false
} )
export class AccountDetailDialog implements OnDestroy , OnInit {
public accountBalances : AccountBalancesResponse [ 'balances' ] ;
@ -23,7 +23,8 @@ import { Subject, Subscription } from 'rxjs';
selector : 'gf-accounts-table' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
templateUrl : './accounts-table.component.html' ,
styleUrls : [ './accounts-table.component.scss' ]
styleUrls : [ './accounts-table.component.scss' ] ,
standalone : false
} )
export class AccountsTableComponent implements OnChanges , OnDestroy {
@Input ( ) accounts : AccountModel [ ] ;
@ -27,7 +27,8 @@ import { takeUntil } from 'rxjs/operators';
changeDetection : ChangeDetectionStrategy.OnPush ,
selector : 'gf-admin-jobs' ,
styleUrls : [ './admin-jobs.scss' ] ,
templateUrl : './admin-jobs.html'
templateUrl : './admin-jobs.html' ,
standalone : false
} )
export class AdminJobsComponent implements OnDestroy , OnInit {
public DATA_GATHERING_QUEUE_PRIORITY_LOW = DATA_GATHERING_QUEUE_PRIORITY_LOW ;
@ -48,7 +48,8 @@ import { CreateAssetProfileDialogParams } from './create-asset-profile-dialog/in
host : { class : 'has-fab' } ,
selector : 'gf-admin-market-data' ,
styleUrls : [ './admin-market-data.scss' ] ,
templateUrl : './admin-market-data.html'
templateUrl : './admin-market-data.html' ,
standalone : false
} )
export class AdminMarketDataComponent
implements AfterViewInit , OnDestroy , OnInit
@ -42,7 +42,8 @@ import { AssetProfileDialogParams } from './interfaces/interfaces';
selector : 'gf-asset-profile-dialog' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
templateUrl : 'asset-profile-dialog.html' ,
styleUrls : [ './asset-profile-dialog.component.scss' ]
styleUrls : [ './asset-profile-dialog.component.scss' ] ,
standalone : false
} )
export class AssetProfileDialog implements OnDestroy , OnInit {
public assetProfileClass : string ;
@ -28,7 +28,8 @@ import { CreateAssetProfileDialogMode } from './interfaces/interfaces';
host : { class : 'h-100' } ,
selector : 'gf-create-asset-profile-dialog' ,
styleUrls : [ './create-asset-profile-dialog.component.scss' ] ,
templateUrl : 'create-asset-profile-dialog.html'
templateUrl : 'create-asset-profile-dialog.html' ,
standalone : false
} )
export class CreateAssetProfileDialog implements OnInit , OnDestroy {
public createAssetProfileForm : FormGroup ;
@ -36,7 +36,8 @@ import { takeUntil } from 'rxjs/operators';
@Component ( {
selector : 'gf-admin-overview' ,
styleUrls : [ './admin-overview.scss' ] ,
templateUrl : './admin-overview.html'
templateUrl : './admin-overview.html' ,
standalone : false
} )
export class AdminOverviewComponent implements OnDestroy , OnInit {
public couponDuration : StringValue = '14 days' ;
@ -29,7 +29,8 @@ import { CreateOrUpdatePlatformDialog } from './create-or-update-platform-dialog
changeDetection : ChangeDetectionStrategy.OnPush ,
selector : 'gf-admin-platform' ,
styleUrls : [ './admin-platform.component.scss' ] ,
templateUrl : './admin-platform.component.html'
templateUrl : './admin-platform.component.html' ,
standalone : false
} )
export class AdminPlatformComponent implements OnInit , OnDestroy {
@ViewChild ( MatSort ) sort : MatSort ;
@ -19,7 +19,8 @@ import { CreateOrUpdatePlatformDialogParams } from './interfaces/interfaces';
host : { class : 'h-100' } ,
selector : 'gf-create-or-update-platform-dialog' ,
styleUrls : [ './create-or-update-platform-dialog.scss' ] ,
templateUrl : 'create-or-update-platform-dialog.html'
templateUrl : 'create-or-update-platform-dialog.html' ,
standalone : false
} )
export class CreateOrUpdatePlatformDialog implements OnDestroy {
public platformForm : FormGroup ;
@ -30,7 +30,8 @@ import { GfGhostfolioPremiumApiDialogComponent } from './ghostfolio-premium-api-
changeDetection : ChangeDetectionStrategy.OnPush ,
selector : 'gf-admin-settings' ,
styleUrls : [ './admin-settings.component.scss' ] ,
templateUrl : './admin-settings.component.html'
templateUrl : './admin-settings.component.html' ,
standalone : false
} )
export class AdminSettingsComponent implements OnDestroy , OnInit {
public defaultDateFormat : string ;
@ -25,7 +25,6 @@ import { GhostfolioPremiumApiDialogParams } from './interfaces/interfaces';
MatDialogModule
] ,
selector : 'gf-ghostfolio-premium-api-dialog' ,
standalone : true ,
styleUrls : [ './ghostfolio-premium-api-dialog.scss' ] ,
templateUrl : './ghostfolio-premium-api-dialog.html'
} )
@ -29,7 +29,8 @@ import { CreateOrUpdateTagDialog } from './create-or-update-tag-dialog/create-or
changeDetection : ChangeDetectionStrategy.OnPush ,
selector : 'gf-admin-tag' ,
styleUrls : [ './admin-tag.component.scss' ] ,
templateUrl : './admin-tag.component.html'
templateUrl : './admin-tag.component.html' ,
standalone : false
} )
export class AdminTagComponent implements OnInit , OnDestroy {
@ViewChild ( MatSort ) sort : MatSort ;
@ -19,7 +19,8 @@ import { CreateOrUpdateTagDialogParams } from './interfaces/interfaces';
host : { class : 'h-100' } ,
selector : 'gf-create-or-update-tag-dialog' ,
styleUrls : [ './create-or-update-tag-dialog.scss' ] ,
templateUrl : 'create-or-update-tag-dialog.html'
templateUrl : 'create-or-update-tag-dialog.html' ,
standalone : false
} )
export class CreateOrUpdateTagDialog implements OnDestroy {
public tagForm : FormGroup ;
@ -29,7 +29,8 @@ import { takeUntil } from 'rxjs/operators';
@Component ( {
selector : 'gf-admin-users' ,
styleUrls : [ './admin-users.scss' ] ,
templateUrl : './admin-users.html'
templateUrl : './admin-users.html' ,
standalone : false
} )
export class AdminUsersComponent implements OnDestroy , OnInit {
@ViewChild ( MatPaginator ) paginator : MatPaginator ;
@ -13,7 +13,6 @@ import { DataSource } from '@prisma/client';
imports : [ CommonModule ] ,
schemas : [ CUSTOM_ELEMENTS_SCHEMA ] ,
selector : 'gf-asset-profile-icon' ,
standalone : true ,
styleUrls : [ './asset-profile-icon.component.scss' ] ,
templateUrl : './asset-profile-icon.component.html'
} )
@ -44,7 +44,8 @@ import annotationPlugin from 'chartjs-plugin-annotation';
selector : 'gf-benchmark-comparator' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
templateUrl : './benchmark-comparator.component.html' ,
styleUrls : [ './benchmark-comparator.component.scss' ]
styleUrls : [ './benchmark-comparator.component.scss' ] ,
standalone : false
} )
export class BenchmarkComparatorComponent implements OnChanges , OnDestroy {
@Input ( ) benchmark : Partial < SymbolProfile > ;
@ -11,7 +11,8 @@ import {
selector : 'gf-dialog-footer' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
templateUrl : './dialog-footer.component.html' ,
styleUrls : [ './dialog-footer.component.scss' ]
styleUrls : [ './dialog-footer.component.scss' ] ,
standalone : false
} )
export class DialogFooterComponent {
@Input ( ) deviceType : string ;
@ -11,7 +11,8 @@ import {
selector : 'gf-dialog-header' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
templateUrl : './dialog-header.component.html' ,
styleUrls : [ './dialog-header.component.scss' ]
styleUrls : [ './dialog-header.component.scss' ] ,
standalone : false
} )
export class DialogHeaderComponent {
@Input ( ) deviceType : string ;
@ -12,7 +12,8 @@ import {
selector : 'gf-fear-and-greed-index' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
templateUrl : './fear-and-greed-index.component.html' ,
styleUrls : [ './fear-and-greed-index.component.scss' ]
styleUrls : [ './fear-and-greed-index.component.scss' ] ,
standalone : false
} )
export class FearAndGreedIndexComponent implements OnChanges {
@Input ( ) fearAndGreedIndex : number ;
@ -35,7 +35,8 @@ import { catchError, takeUntil } from 'rxjs/operators';
selector : 'gf-header' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
templateUrl : './header.component.html' ,
styleUrls : [ './header.component.scss' ]
styleUrls : [ './header.component.scss' ] ,
standalone : false
} )
export class HeaderComponent implements OnChanges {
@HostListener ( 'window:keydown' , [ '$event' ] )
@ -81,7 +81,6 @@ import { HoldingDetailDialogParams } from './interfaces/interfaces';
] ,
schemas : [ CUSTOM_ELEMENTS_SCHEMA ] ,
selector : 'gf-holding-detail-dialog' ,
standalone : true ,
styleUrls : [ './holding-detail-dialog.component.scss' ] ,
templateUrl : 'holding-detail-dialog.html'
} )
@ -20,7 +20,8 @@ import { takeUntil } from 'rxjs/operators';
@Component ( {
selector : 'gf-home-holdings' ,
styleUrls : [ './home-holdings.scss' ] ,
templateUrl : './home-holdings.html'
templateUrl : './home-holdings.html' ,
standalone : false
} )
export class HomeHoldingsComponent implements OnDestroy , OnInit {
public static DEFAULT_HOLDINGS_VIEW_MODE : HoldingsViewMode = 'TABLE' ;
@ -18,7 +18,8 @@ import { takeUntil } from 'rxjs/operators';
@Component ( {
selector : 'gf-home-market' ,
styleUrls : [ './home-market.scss' ] ,
templateUrl : './home-market.html'
templateUrl : './home-market.html' ,
standalone : false
} )
export class HomeMarketComponent implements OnDestroy , OnInit {
public benchmarks : Benchmark [ ] ;
@ -20,7 +20,8 @@ import { takeUntil } from 'rxjs/operators';
@Component ( {
selector : 'gf-home-overview' ,
styleUrls : [ './home-overview.scss' ] ,
templateUrl : './home-overview.html'
templateUrl : './home-overview.html' ,
standalone : false
} )
export class HomeOverviewComponent implements OnDestroy , OnInit {
public dateRangeOptions = ToggleComponent . DEFAULT_DATE_RANGE_OPTIONS ;
@ -16,7 +16,8 @@ import { takeUntil } from 'rxjs/operators';
@Component ( {
selector : 'gf-home-summary' ,
styleUrls : [ './home-summary.scss' ] ,
templateUrl : './home-summary.html'
templateUrl : './home-summary.html' ,
standalone : false
} )
export class HomeSummaryComponent implements OnDestroy , OnInit {
public hasImpersonationId : boolean ;
@ -45,7 +45,8 @@ import { isAfter } from 'date-fns';
selector : 'gf-investment-chart' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
templateUrl : './investment-chart.component.html' ,
styleUrls : [ './investment-chart.component.scss' ]
styleUrls : [ './investment-chart.component.scss' ] ,
standalone : false
} )
export class InvestmentChartComponent implements OnChanges , OnDestroy {
@Input ( ) benchmarkDataItems : InvestmentItem [ ] = [ ] ;
@ -14,7 +14,8 @@ import { Router } from '@angular/router';
selector : 'gf-login-with-access-token-dialog' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
styleUrls : [ './login-with-access-token-dialog.scss' ] ,
templateUrl : 'login-with-access-token-dialog.html'
templateUrl : 'login-with-access-token-dialog.html' ,
standalone : false
} )
export class LoginWithAccessTokenDialog {
public isAccessTokenHidden = true ;
@ -24,7 +24,8 @@ import { isNumber } from 'lodash';
selector : 'gf-portfolio-performance' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
templateUrl : './portfolio-performance.component.html' ,
styleUrls : [ './portfolio-performance.component.scss' ]
styleUrls : [ './portfolio-performance.component.scss' ] ,
standalone : false
} )
export class PortfolioPerformanceComponent implements OnChanges {
@Input ( ) deviceType : string ;
@ -17,7 +17,8 @@ import { formatDistanceToNow } from 'date-fns';
selector : 'gf-portfolio-summary' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
templateUrl : './portfolio-summary.component.html' ,
styleUrls : [ './portfolio-summary.component.scss' ]
styleUrls : [ './portfolio-summary.component.scss' ] ,
standalone : false
} )
export class PortfolioSummaryComponent implements OnChanges {
@Input ( ) baseCurrency : string ;
@ -22,7 +22,6 @@ import { IRuleSettingsDialogParams } from './interfaces/interfaces';
MatSliderModule
] ,
selector : 'gf-rule-settings-dialog' ,
standalone : true ,
styleUrls : [ './rule-settings-dialog.scss' ] ,
templateUrl : './rule-settings-dialog.html'
} )
@ -24,7 +24,8 @@ import { GfRuleSettingsDialogComponent } from './rule-settings-dialog/rule-setti
selector : 'gf-rule' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
templateUrl : './rule.component.html' ,
styleUrls : [ './rule.component.scss' ]
styleUrls : [ './rule.component.scss' ] ,
standalone : false
} )
export class RuleComponent implements OnInit {
@Input ( ) hasPermissionToUpdateUserSettings : boolean ;
@ -16,7 +16,8 @@ import {
selector : 'gf-rules' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
templateUrl : './rules.component.html' ,
styleUrls : [ './rules.component.scss' ]
styleUrls : [ './rules.component.scss' ] ,
standalone : false
} )
export class RulesComponent {
@Input ( ) hasPermissionToUpdateUserSettings : boolean ;
@ -8,7 +8,8 @@ import { SubscriptionInterstitialDialogParams } from './interfaces/interfaces';
host : { class : 'd-flex flex-column flex-grow-1 h-100' } ,
selector : 'gf-subscription-interstitial-dialog' ,
styleUrls : [ './subscription-interstitial-dialog.scss' ] ,
templateUrl : 'subscription-interstitial-dialog.html'
templateUrl : 'subscription-interstitial-dialog.html' ,
standalone : false
} )
export class SubscriptionInterstitialDialog {
private readonly VARIANTS_COUNT = 2 ;
@ -14,7 +14,8 @@ import { FormControl } from '@angular/forms';
selector : 'gf-toggle' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
templateUrl : './toggle.component.html' ,
styleUrls : [ './toggle.component.scss' ]
styleUrls : [ './toggle.component.scss' ] ,
standalone : false
} )
export class ToggleComponent implements OnChanges {
public static DEFAULT_DATE_RANGE_OPTIONS : ToggleOption [ ] = [
@ -22,7 +22,8 @@ import { CreateOrUpdateAccessDialogParams } from './interfaces/interfaces';
host : { class : 'h-100' } ,
selector : 'gf-create-or-update-access-dialog' ,
styleUrls : [ './create-or-update-access-dialog.scss' ] ,
templateUrl : 'create-or-update-access-dialog.html'
templateUrl : 'create-or-update-access-dialog.html' ,
standalone : false
} )
export class CreateOrUpdateAccessDialog implements OnDestroy {
public accessForm : FormGroup ;
@ -24,7 +24,8 @@ import { CreateOrUpdateAccessDialog } from './create-or-update-access-dialog/cre
host : { class : 'has-fab' } ,
selector : 'gf-user-account-access' ,
styleUrls : [ './user-account-access.scss' ] ,
templateUrl : './user-account-access.html'
templateUrl : './user-account-access.html' ,
standalone : false
} )
export class UserAccountAccessComponent implements OnDestroy , OnInit {
public accessesGet : Access [ ] ;
@ -26,7 +26,8 @@ import { catchError, switchMap, takeUntil } from 'rxjs/operators';
changeDetection : ChangeDetectionStrategy.OnPush ,
selector : 'gf-user-account-membership' ,
styleUrls : [ './user-account-membership.scss' ] ,
templateUrl : './user-account-membership.html'
templateUrl : './user-account-membership.html' ,
standalone : false
} )
export class UserAccountMembershipComponent implements OnDestroy {
public baseCurrency : string ;
@ -32,7 +32,8 @@ import { catchError, takeUntil } from 'rxjs/operators';
changeDetection : ChangeDetectionStrategy.OnPush ,
selector : 'gf-user-account-settings' ,
styleUrls : [ './user-account-settings.scss' ] ,
templateUrl : './user-account-settings.html'
templateUrl : './user-account-settings.html' ,
standalone : false
} )
export class UserAccountSettingsComponent implements OnDestroy , OnInit {
public appearancePlaceholder = $localize ` Auto ` ;
@ -14,7 +14,8 @@ import svgMap from 'svgmap';
selector : 'gf-world-map-chart' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
templateUrl : './world-map-chart.component.html' ,
styleUrls : [ './world-map-chart.component.scss' ]
styleUrls : [ './world-map-chart.component.scss' ] ,
standalone : false
} )
export class WorldMapChartComponent implements OnChanges , OnDestroy {
@Input ( ) countries : { [ code : string ] : { name? : string ; value : number } } ;
@ -8,7 +8,6 @@ import { IAlertDialogParams } from './interfaces/interfaces';
@Component ( {
imports : [ CommonModule , MatButtonModule , MatDialogModule ] ,
selector : 'gf-alert-dialog' ,
standalone : true ,
styleUrls : [ './alert-dialog.scss' ] ,
templateUrl : './alert-dialog.html'
} )
@ -9,7 +9,6 @@ import { IConfirmDialogParams } from './interfaces/interfaces';
@Component ( {
imports : [ CommonModule , MatButtonModule , MatDialogModule ] ,
selector : 'gf-confirmation-dialog' ,
standalone : true ,
styleUrls : [ './confirmation-dialog.scss' ] ,
templateUrl : './confirmation-dialog.html'
} )
@ -16,7 +16,6 @@ import { MatInputModule } from '@angular/material/input';
MatInputModule
] ,
selector : 'gf-prompt-dialog' ,
standalone : true ,
templateUrl : './prompt-dialog.html'
} )
export class GfPromptDialogComponent {
@ -1,7 +1,8 @@
import { Directive , EventEmitter , HostListener , Output } from '@angular/core' ;
@Directive ( {
selector : '[gfFileDrop]'
selector : '[gfFileDrop]' ,
standalone : false
} )
export class FileDropDirective {
@Output ( ) filesDropped = new EventEmitter < FileList > ( ) ;
@ -12,7 +12,8 @@ import { takeUntil } from 'rxjs/operators';
host : { class : 'page has-tabs' } ,
selector : 'gf-about-page' ,
styleUrls : [ './about-page.scss' ] ,
templateUrl : './about-page.html'
templateUrl : './about-page.html' ,
standalone : false
} )
export class AboutPageComponent implements OnDestroy , OnInit {
public deviceType : string ;
@ -4,7 +4,8 @@ import { Subject } from 'rxjs';
@Component ( {
selector : 'gf-changelog-page' ,
styleUrls : [ './changelog-page.scss' ] ,
templateUrl : './changelog-page.html'
templateUrl : './changelog-page.html' ,
standalone : false
} )
export class ChangelogPageComponent implements OnDestroy {
private unsubscribeSubject = new Subject < void > ( ) ;
@ -4,7 +4,8 @@ import { Subject } from 'rxjs';
@Component ( {
selector : 'gf-license-page' ,
styleUrls : [ './license-page.scss' ] ,
templateUrl : './license-page.html'
templateUrl : './license-page.html' ,
standalone : false
} )
export class LicensePageComponent implements OnDestroy {
private unsubscribeSubject = new Subject < void > ( ) ;
@ -6,7 +6,8 @@ const ossFriends = require('../../../../assets/oss-friends.json');
@Component ( {
selector : 'gf-oss-friends-page' ,
styleUrls : [ './oss-friends-page.scss' ] ,
templateUrl : './oss-friends-page.html'
templateUrl : './oss-friends-page.html' ,
standalone : false
} )
export class OpenSourceSoftwareFriendsPageComponent implements OnDestroy {
public ossFriends = ossFriends . data ;
@ -10,7 +10,8 @@ import { takeUntil } from 'rxjs/operators';
@Component ( {
selector : 'gf-about-overview-page' ,
styleUrls : [ './about-overview-page.scss' ] ,
templateUrl : './about-overview-page.html'
templateUrl : './about-overview-page.html' ,
standalone : false
} )
export class AboutOverviewPageComponent implements OnDestroy , OnInit {
public hasPermissionForStatistics : boolean ;
@ -4,7 +4,8 @@ import { Subject } from 'rxjs';
@Component ( {
selector : 'gf-privacy-policy-page' ,
styleUrls : [ './privacy-policy-page.scss' ] ,
templateUrl : './privacy-policy-page.html'
templateUrl : './privacy-policy-page.html' ,
standalone : false
} )
export class PrivacyPolicyPageComponent implements OnDestroy {
private unsubscribeSubject = new Subject < void > ( ) ;
@ -25,7 +25,8 @@ import { TransferBalanceDialog } from './transfer-balance/transfer-balance-dialo
host : { class : 'has-fab page' } ,
selector : 'gf-accounts-page' ,
styleUrls : [ './accounts-page.scss' ] ,
templateUrl : './accounts-page.html'
templateUrl : './accounts-page.html' ,
standalone : false
} )
export class AccountsPageComponent implements OnDestroy , OnInit {
public accounts : AccountModel [ ] ;
@ -28,7 +28,8 @@ import { CreateOrUpdateAccountDialogParams } from './interfaces/interfaces';
selector : 'gf-create-or-update-account-dialog' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
styleUrls : [ './create-or-update-account-dialog.scss' ] ,
templateUrl : 'create-or-update-account-dialog.html'
templateUrl : 'create-or-update-account-dialog.html' ,
standalone : false
} )
export class CreateOrUpdateAccountDialog implements OnDestroy {
public accountForm : FormGroup ;
@ -24,7 +24,8 @@ import { TransferBalanceDialogParams } from './interfaces/interfaces';
selector : 'gf-transfer-balance-dialog' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
styleUrls : [ './transfer-balance-dialog.scss' ] ,
templateUrl : 'transfer-balance-dialog.html'
templateUrl : 'transfer-balance-dialog.html' ,
standalone : false
} )
export class TransferBalanceDialog implements OnDestroy {
public accounts : Account [ ] = [ ] ;
@ -8,7 +8,8 @@ import { Subject } from 'rxjs';
host : { class : 'page has-tabs' } ,
selector : 'gf-admin-page' ,
styleUrls : [ './admin-page.scss' ] ,
templateUrl : './admin-page.html'
templateUrl : './admin-page.html' ,
standalone : false
} )
export class AdminPageComponent implements OnDestroy , OnInit {
public deviceType : string ;
@ -21,7 +21,6 @@ import { map, Observable, Subject, takeUntil } from 'rxjs';
host : { class : 'page' } ,
imports : [ CommonModule ] ,
selector : 'gf-api-page' ,
standalone : true ,
styleUrls : [ './api-page.scss' ] ,
templateUrl : './api-page.html'
} )
@ -12,7 +12,8 @@ import { takeUntil } from 'rxjs/operators';
@Component ( {
selector : 'gf-auth-page' ,
templateUrl : './auth-page.html' ,
styleUrls : [ './auth-page.scss' ]
styleUrls : [ './auth-page.scss' ] ,
standalone : false
} )
export class AuthPageComponent implements OnDestroy , OnInit {
private unsubscribeSubject = new Subject < void > ( ) ;
@ -6,7 +6,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ MatButtonModule , RouterModule ] ,
selector : 'gf-hallo-ghostfolio-page' ,
standalone : true ,
templateUrl : './hallo-ghostfolio-page.html'
} )
export class HalloGhostfolioPageComponent {
@ -6,7 +6,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ MatButtonModule , RouterModule ] ,
selector : 'gf-hello-ghostfolio-page' ,
standalone : true ,
templateUrl : './hello-ghostfolio-page.html'
} )
export class HelloGhostfolioPageComponent {
@ -6,7 +6,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ MatButtonModule , RouterModule ] ,
selector : 'gf-first-months-in-open-source-page' ,
standalone : true ,
templateUrl : './first-months-in-open-source-page.html'
} )
export class FirstMonthsInOpenSourcePageComponent {
@ -6,7 +6,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ MatButtonModule , RouterModule ] ,
selector : 'gf-ghostfolio-meets-internet-identity-page' ,
standalone : true ,
templateUrl : './ghostfolio-meets-internet-identity-page.html'
} )
export class GhostfolioMeetsInternetIdentityPageComponent { }
@ -6,7 +6,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ MatButtonModule , RouterModule ] ,
selector : 'gf-how-do-i-get-my-finances-in-order-page' ,
standalone : true ,
templateUrl : './how-do-i-get-my-finances-in-order-page.html'
} )
export class HowDoIGetMyFinancesInOrderPageComponent {
@ -6,7 +6,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ MatButtonModule , RouterModule ] ,
selector : 'gf-500-stars-on-github-page' ,
standalone : true ,
templateUrl : './500-stars-on-github-page.html'
} )
export class FiveHundredStarsOnGitHubPageComponent {
@ -6,7 +6,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ MatButtonModule , RouterModule ] ,
selector : 'gf-hacktoberfest-2022-page' ,
standalone : true ,
templateUrl : './hacktoberfest-2022-page.html'
} )
export class Hacktoberfest2022PageComponent { }
@ -8,7 +8,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ GfPremiumIndicatorComponent , MatButtonModule , RouterModule ] ,
selector : 'gf-black-friday-2022-page' ,
standalone : true ,
templateUrl : './black-friday-2022-page.html'
} )
export class BlackFriday2022PageComponent {
@ -6,7 +6,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ MatButtonModule , RouterModule ] ,
selector : 'gf-the-importance-of-tracking-your-personal-finances-page' ,
standalone : true ,
templateUrl : './the-importance-of-tracking-your-personal-finances-page.html'
} )
export class TheImportanceOfTrackingYourPersonalFinancesPageComponent { }
@ -6,7 +6,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ MatButtonModule , RouterModule ] ,
selector : 'gf-ghostfolio-auf-sackgeld-vorgestellt-page' ,
standalone : true ,
templateUrl : './ghostfolio-auf-sackgeld-vorgestellt-page.html'
} )
export class GhostfolioAufSackgeldVorgestelltPageComponent { }
@ -6,7 +6,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ MatButtonModule , RouterModule ] ,
selector : 'gf-ghostfolio-meets-umbrel-page' ,
standalone : true ,
templateUrl : './ghostfolio-meets-umbrel-page.html'
} )
export class GhostfolioMeetsUmbrelPageComponent { }
@ -6,7 +6,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ MatButtonModule , RouterModule ] ,
selector : 'gf-1000-stars-on-github-page' ,
standalone : true ,
templateUrl : './1000-stars-on-github-page.html'
} )
export class ThousandStarsOnGitHubPageComponent {
@ -6,7 +6,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ MatButtonModule , RouterModule ] ,
selector : 'gf-unlock-your-financial-potential-with-ghostfolio-page' ,
standalone : true ,
templateUrl : './unlock-your-financial-potential-with-ghostfolio-page.html'
} )
export class UnlockYourFinancialPotentialWithGhostfolioPageComponent {
@ -6,7 +6,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ MatButtonModule , RouterModule ] ,
selector : 'gf-exploring-the-path-to-fire-page-page' ,
standalone : true ,
templateUrl : './exploring-the-path-to-fire-page.html'
} )
export class ExploringThePathToFirePageComponent {
@ -6,7 +6,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ MatButtonModule , RouterModule ] ,
selector : 'gf-ghostfolio-joins-oss-friends-page' ,
standalone : true ,
templateUrl : './ghostfolio-joins-oss-friends-page.html'
} )
export class GhostfolioJoinsOssFriendsPageComponent {
@ -6,7 +6,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ MatButtonModule , RouterModule ] ,
selector : 'gf-ghostfolio-2-page' ,
standalone : true ,
templateUrl : './ghostfolio-2-page.html'
} )
export class Ghostfolio2PageComponent {
@ -6,7 +6,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ MatButtonModule , RouterModule ] ,
selector : 'gf-hacktoberfest-2023-page' ,
standalone : true ,
templateUrl : './hacktoberfest-2023-page.html'
} )
export class Hacktoberfest2023PageComponent {
@ -8,7 +8,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ GfPremiumIndicatorComponent , MatButtonModule , RouterModule ] ,
selector : 'gf-black-week-2023-page' ,
standalone : true ,
templateUrl : './black-week-2023-page.html'
} )
export class BlackWeek2023PageComponent {
@ -6,7 +6,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ MatButtonModule , RouterModule ] ,
selector : 'gf-hacktoberfest-2023-debriefing-page' ,
standalone : true ,
templateUrl : './hacktoberfest-2023-debriefing-page.html'
} )
export class Hacktoberfest2023DebriefingPageComponent {
@ -6,7 +6,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ MatButtonModule , RouterModule ] ,
selector : 'gf-hacktoberfest-2024-page' ,
standalone : true ,
templateUrl : './hacktoberfest-2024-page.html'
} )
export class Hacktoberfest2024PageComponent {
@ -8,7 +8,6 @@ import { RouterModule } from '@angular/router';
host : { class : 'page' } ,
imports : [ GfPremiumIndicatorComponent , MatButtonModule , RouterModule ] ,
selector : 'gf-black-weeks-2024-page' ,
standalone : true ,
templateUrl : './black-weeks-2024-page.html'
} )
export class BlackWeeks2024PageComponent {
@ -8,7 +8,8 @@ import { Subject } from 'rxjs';
host : { class : 'page' } ,
selector : 'gf-blog-page' ,
styleUrls : [ './blog-page.scss' ] ,
templateUrl : './blog-page.html'
templateUrl : './blog-page.html' ,
standalone : false
} )
export class BlogPageComponent implements OnDestroy {
public hasPermissionForSubscription : boolean ;
@ -10,7 +10,8 @@ import { Subject } from 'rxjs';
host : { class : 'page has-tabs' } ,
selector : 'gf-faq-page' ,
styleUrls : [ './faq-page.scss' ] ,
templateUrl : './faq-page.html'
templateUrl : './faq-page.html' ,
standalone : false
} )
export class FaqPageComponent implements OnDestroy , OnInit {
public deviceType : string ;
@ -8,7 +8,8 @@ import { Subject, takeUntil } from 'rxjs';
host : { class : 'page' } ,
selector : 'gf-faq-overview-page' ,
styleUrls : [ './faq-overview-page.scss' ] ,
templateUrl : './faq-overview-page.html'
templateUrl : './faq-overview-page.html' ,
standalone : false
} )
export class FaqOverviewPageComponent implements OnDestroy {
public routerLinkFeatures = [ '/' + $localize ` :snake-case:features ` ] ;
@ -8,7 +8,8 @@ import { Subject, takeUntil } from 'rxjs';
host : { class : 'page' } ,
selector : 'gf-saas-page' ,
styleUrls : [ './saas-page.scss' ] ,
templateUrl : './saas-page.html'
templateUrl : './saas-page.html' ,
standalone : false
} )
export class SaasPageComponent implements OnDestroy {
public routerLinkMarkets = [ '/' + $localize ` :snake-case:markets ` ] ;
@ -5,7 +5,8 @@ import { Subject } from 'rxjs';
host : { class : 'page' } ,
selector : 'gf-self-hosting-page' ,
styleUrls : [ './self-hosting-page.scss' ] ,
templateUrl : './self-hosting-page.html'
templateUrl : './self-hosting-page.html' ,
standalone : false
} )
export class SelfHostingPageComponent implements OnDestroy {
private unsubscribeSubject = new Subject < void > ( ) ;
@ -19,7 +19,6 @@ import { Subject, takeUntil } from 'rxjs';
RouterModule
] ,
selector : 'gf-features-page' ,
standalone : true ,
styleUrls : [ './features-page.scss' ] ,
templateUrl : './features-page.html'
} )
@ -11,7 +11,8 @@ import { takeUntil } from 'rxjs/operators';
host : { class : 'page has-tabs' } ,
selector : 'gf-home-page' ,
styleUrls : [ './home-page.scss' ] ,
templateUrl : './home-page.html'
templateUrl : './home-page.html' ,
standalone : false
} )
export class HomePageComponent implements OnDestroy , OnInit {
public deviceType : string ;
@ -11,7 +11,8 @@ import { Subject } from 'rxjs';
host : { class : 'page' } ,
selector : 'gf-landing-page' ,
styleUrls : [ './landing-page.scss' ] ,
templateUrl : './landing-page.html'
templateUrl : './landing-page.html' ,
standalone : false
} )
export class LandingPageComponent implements OnDestroy , OnInit {
public countriesOfSubscribersMap : {
@ -5,7 +5,8 @@ import { Subject } from 'rxjs';
host : { class : 'page' } ,
selector : 'gf-markets-page' ,
styleUrls : [ './markets-page.scss' ] ,
templateUrl : './markets-page.html'
templateUrl : './markets-page.html' ,
standalone : false
} )
export class MarketsPageComponent implements OnDestroy {
private unsubscribeSubject = new Subject < void > ( ) ;
@ -9,7 +9,8 @@ import { Subject, takeUntil } from 'rxjs';
host : { class : 'page' } ,
selector : 'gf-open-page' ,
styleUrls : [ './open-page.scss' ] ,
templateUrl : './open-page.html'
templateUrl : './open-page.html' ,
standalone : false
} )
export class OpenPageComponent implements OnDestroy , OnInit {
public statistics : Statistics ;
@ -29,7 +29,8 @@ import { ImportActivitiesDialogParams } from './import-activities-dialog/interfa
host : { class : 'has-fab' } ,
selector : 'gf-activities-page' ,
styleUrls : [ './activities-page.scss' ] ,
templateUrl : './activities-page.html'
templateUrl : './activities-page.html' ,
standalone : false
} )
export class ActivitiesPageComponent implements OnDestroy , OnInit {
public dataSource : MatTableDataSource < Activity > ;
@ -31,7 +31,8 @@ import { CreateOrUpdateActivityDialogParams } from './interfaces/interfaces';
selector : 'gf-create-or-update-activity-dialog' ,
changeDetection : ChangeDetectionStrategy.OnPush ,
styleUrls : [ './create-or-update-activity-dialog.scss' ] ,
templateUrl : 'create-or-update-activity-dialog.html'
templateUrl : 'create-or-update-activity-dialog.html' ,
standalone : false
} )
export class CreateOrUpdateActivityDialog implements OnDestroy {
@ViewChild ( 'symbolAutocomplete' ) symbolAutocomplete ;
@ -215,12 +216,12 @@ export class CreateOrUpdateActivityDialog implements OnDestroy {
this . total =
this . activityForm . get ( 'quantity' ) . value *
this . activityForm . get ( 'unitPrice' ) . value +
this . activityForm . get ( 'fee' ) . value ? ? 0 ;
( this . activityForm . get ( 'fee' ) . value ? ? 0 ) ;
} else {
this . total =
this . activityForm . get ( 'quantity' ) . value *
this . activityForm . get ( 'unitPrice' ) . value -
this . activityForm . get ( 'fee' ) . value ? ? 0 ;
( this . activityForm . get ( 'fee' ) . value ? ? 0 ) ;
}
this . changeDetectorRef . markForCheck ( ) ;
@ -33,7 +33,8 @@ import { ImportActivitiesDialogParams } from './interfaces/interfaces';
changeDetection : ChangeDetectionStrategy.OnPush ,
selector : 'gf-import-activities-dialog' ,
styleUrls : [ './import-activities-dialog.scss' ] ,
templateUrl : 'import-activities-dialog.html'
templateUrl : 'import-activities-dialog.html' ,
standalone : false
} )
export class ImportActivitiesDialog implements OnDestroy {
public accounts : CreateAccountDto [ ] = [ ] ;
@ -28,7 +28,8 @@ import { takeUntil } from 'rxjs/operators';
@Component ( {
selector : 'gf-allocations-page' ,
styleUrls : [ './allocations-page.scss' ] ,
templateUrl : './allocations-page.html'
templateUrl : './allocations-page.html' ,
standalone : false
} )
export class AllocationsPageComponent implements OnDestroy , OnInit {
public accounts : {
@ -24,7 +24,8 @@ import { takeUntil } from 'rxjs/operators';
@Component ( {
selector : 'gf-analysis-page' ,
styleUrls : [ './analysis-page.scss' ] ,
templateUrl : './analysis-page.html'
templateUrl : './analysis-page.html' ,
standalone : false
} )
export class AnalysisPageComponent implements OnDestroy , OnInit {
public benchmark : Partial < SymbolProfile > ;
@ -13,7 +13,8 @@ import { takeUntil } from 'rxjs/operators';
@Component ( {
selector : 'gf-fire-page' ,
styleUrls : [ './fire-page.scss' ] ,
templateUrl : './fire-page.html'
templateUrl : './fire-page.html' ,
standalone : false
} )
export class FirePageComponent implements OnDestroy , OnInit {
public deviceType : string ;
@ -10,7 +10,8 @@ import { takeUntil } from 'rxjs/operators';
host : { class : 'page has-tabs' } ,
selector : 'gf-portfolio-page' ,
styleUrls : [ './portfolio-page.scss' ] ,
templateUrl : './portfolio-page.html'
templateUrl : './portfolio-page.html' ,
standalone : false
} )
export class PortfolioPageComponent implements OnDestroy , OnInit {
public deviceType : string ;
@ -15,7 +15,8 @@ import { Subject, takeUntil } from 'rxjs';
@Component ( {
selector : 'gf-x-ray-page' ,
styleUrl : './x-ray-page.component.scss' ,
templateUrl : './x-ray-page.component.html'
templateUrl : './x-ray-page.component.html' ,
standalone : false
} )
export class XRayPageComponent {
public accountClusterRiskRules : PortfolioReportRule [ ] ;
@ -15,7 +15,8 @@ import { catchError, switchMap, takeUntil } from 'rxjs/operators';
host : { class : 'page' } ,
selector : 'gf-pricing-page' ,
styleUrls : [ './pricing-page.scss' ] ,
templateUrl : './pricing-page.html'
templateUrl : './pricing-page.html' ,
standalone : false
} )
export class PricingPageComponent implements OnDestroy , OnInit {
public baseCurrency : string ;
@ -20,7 +20,8 @@ import { catchError, takeUntil } from 'rxjs/operators';
host : { class : 'page' } ,
selector : 'gf-public-page' ,
styleUrls : [ './public-page.scss' ] ,
templateUrl : './public-page.html'
templateUrl : './public-page.html' ,
standalone : false
} )
export class PublicPageComponent implements OnInit {
public continents : {