From 5f67e069e421b725e05435ad97a28e9495f92d85 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 7 Sep 2025 17:46:22 +0200 Subject: [PATCH 1/3] Bugfix/improve localized content of about page (#5484) * Add spaces --- .../app/pages/about/overview/about-overview-page.html | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/client/src/app/pages/about/overview/about-overview-page.html b/apps/client/src/app/pages/about/overview/about-overview-page.html index cfe753699..4085498a9 100644 --- a/apps/client/src/app/pages/about/overview/about-overview-page.html +++ b/apps/client/src/app/pages/about/overview/about-overview-page.html @@ -11,8 +11,9 @@ individuals to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions. - - The source code is fully available as +   + The source code is fully available as @if (hasPermissionForStatistics) { - - and we share aggregated +   + and we share aggregated key metrics From 950b2606fdee4609c7557fa109cc0678cc955fcc Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Mon, 8 Sep 2025 21:04:47 +0700 Subject: [PATCH 2/3] Task/migrate rule and rules components to standalone (#5488) * Migrate rule and rules components to standalone * Update changelog --- CHANGELOG.md | 2 ++ .../src/app/components/rule/rule.component.ts | 19 ++++++++++++---- .../src/app/components/rule/rule.module.ts | 22 ------------------- .../app/components/rules/rules.component.ts | 11 ++++++---- .../src/app/components/rules/rules.module.ts | 16 -------------- .../portfolio/x-ray/x-ray-page.component.ts | 4 ++-- 6 files changed, 26 insertions(+), 48 deletions(-) delete mode 100644 apps/client/src/app/components/rule/rule.module.ts delete mode 100644 apps/client/src/app/components/rules/rules.module.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f1694c01..3b0a5567d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Refactored the header component to standalone +- Refactored the rule component to standalone +- Refactored the rules component to standalone ## 2.197.0 - 2025-09-07 diff --git a/apps/client/src/app/components/rule/rule.component.ts b/apps/client/src/app/components/rule/rule.component.ts index f9d7c8664..c38de8bbb 100644 --- a/apps/client/src/app/components/rule/rule.component.ts +++ b/apps/client/src/app/components/rule/rule.component.ts @@ -5,6 +5,7 @@ import { XRayRulesSettings } from '@ghostfolio/common/interfaces'; +import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -13,7 +14,10 @@ import { OnInit, Output } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; import { MatDialog } from '@angular/material/dialog'; +import { MatMenuModule } from '@angular/material/menu'; +import { IonIcon } from '@ionic/angular/standalone'; import { addIcons } from 'ionicons'; import { addCircleOutline, @@ -24,19 +28,26 @@ import { warningOutline } from 'ionicons/icons'; import { DeviceDetectorService } from 'ngx-device-detector'; +import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { Subject, takeUntil } from 'rxjs'; import { IRuleSettingsDialogParams } from './rule-settings-dialog/interfaces/interfaces'; import { GfRuleSettingsDialogComponent } from './rule-settings-dialog/rule-settings-dialog.component'; @Component({ - selector: 'gf-rule', changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './rule.component.html', + imports: [ + CommonModule, + IonIcon, + MatButtonModule, + MatMenuModule, + NgxSkeletonLoaderModule + ], + selector: 'gf-rule', styleUrls: ['./rule.component.scss'], - standalone: false + templateUrl: './rule.component.html' }) -export class RuleComponent implements OnInit { +export class GfRuleComponent implements OnInit { @Input() categoryName: string; @Input() hasPermissionToUpdateUserSettings: boolean; @Input() isLoading: boolean; diff --git a/apps/client/src/app/components/rule/rule.module.ts b/apps/client/src/app/components/rule/rule.module.ts deleted file mode 100644 index 43c22e55c..000000000 --- a/apps/client/src/app/components/rule/rule.module.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MatMenuModule } from '@angular/material/menu'; -import { IonIcon } from '@ionic/angular/standalone'; -import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; - -import { RuleComponent } from './rule.component'; - -@NgModule({ - declarations: [RuleComponent], - exports: [RuleComponent], - imports: [ - CommonModule, - IonIcon, - MatButtonModule, - MatMenuModule, - NgxSkeletonLoaderModule - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class GfRuleModule {} diff --git a/apps/client/src/app/components/rules/rules.component.ts b/apps/client/src/app/components/rules/rules.component.ts index 26cbb1a62..6379a40fb 100644 --- a/apps/client/src/app/components/rules/rules.component.ts +++ b/apps/client/src/app/components/rules/rules.component.ts @@ -1,4 +1,5 @@ import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto'; +import { GfRuleComponent } from '@ghostfolio/client/components/rule/rule.component'; import { PortfolioReportRule, XRayRulesSettings @@ -11,15 +12,17 @@ import { Input, Output } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; @Component({ - selector: 'gf-rules', changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './rules.component.html', + imports: [GfRuleComponent, MatButtonModule, MatCardModule], + selector: 'gf-rules', styleUrls: ['./rules.component.scss'], - standalone: false + templateUrl: './rules.component.html' }) -export class RulesComponent { +export class GfRulesComponent { @Input() categoryName: string; @Input() hasPermissionToUpdateUserSettings: boolean; @Input() isLoading: boolean; diff --git a/apps/client/src/app/components/rules/rules.module.ts b/apps/client/src/app/components/rules/rules.module.ts deleted file mode 100644 index c62cbc3bd..000000000 --- a/apps/client/src/app/components/rules/rules.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { GfRuleModule } from '@ghostfolio/client/components/rule/rule.module'; - -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; - -import { RulesComponent } from './rules.component'; - -@NgModule({ - declarations: [RulesComponent], - exports: [RulesComponent], - imports: [CommonModule, GfRuleModule, MatButtonModule, MatCardModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class GfRulesModule {} 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 c0578b5d7..364564383 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 @@ -1,5 +1,5 @@ import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto'; -import { GfRulesModule } from '@ghostfolio/client/components/rules/rules.module'; +import { GfRulesComponent } from '@ghostfolio/client/components/rules/rules.component'; import { DataService } from '@ghostfolio/client/services/data.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; @@ -26,7 +26,7 @@ import { Subject, takeUntil } from 'rxjs'; @Component({ imports: [ GfPremiumIndicatorComponent, - GfRulesModule, + GfRulesComponent, IonIcon, NgClass, NgxSkeletonLoaderModule From aeb3df56d11eaaaa18480dfc68270038262b5a2b Mon Sep 17 00:00:00 2001 From: David Requeno <108202767+DavidReque@users.noreply.github.com> Date: Tue, 9 Sep 2025 11:44:50 -0600 Subject: [PATCH 3/3] Feature/migrate markets page to standalone (#5492) * Migrate markets page to standalone * Update changelog --- CHANGELOG.md | 1 + apps/client/src/app/app-routing.module.ts | 8 +++---- .../markets/markets-page-routing.module.ts | 22 ----------------- .../pages/markets/markets-page.component.ts | 9 ++++--- .../app/pages/markets/markets-page.module.ts | 14 ----------- .../app/pages/markets/markets-page.routes.ts | 24 +++++++++++++++++++ 6 files changed, 34 insertions(+), 44 deletions(-) delete mode 100644 apps/client/src/app/pages/markets/markets-page-routing.module.ts delete mode 100644 apps/client/src/app/pages/markets/markets-page.module.ts create mode 100644 apps/client/src/app/pages/markets/markets-page.routes.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b0a5567d..447f5dc7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Refactored the markets page to standalone - Refactored the header component to standalone - Refactored the rule component to standalone - Refactored the rules component to standalone diff --git a/apps/client/src/app/app-routing.module.ts b/apps/client/src/app/app-routing.module.ts index 2d4f1b227..53db1f06b 100644 --- a/apps/client/src/app/app-routing.module.ts +++ b/apps/client/src/app/app-routing.module.ts @@ -1,11 +1,11 @@ -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { PageTitleStrategy } from '@ghostfolio/client/services/page-title.strategy'; import { publicRoutes, internalRoutes } from '@ghostfolio/common/routes/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes, TitleStrategy } from '@angular/router'; +import { AuthGuard } from './core/auth.guard'; import { ModulePreloadService } from './core/module-preload.service'; +import { PageTitleStrategy } from './services/page-title.strategy'; const routes: Routes = [ { @@ -89,9 +89,7 @@ const routes: Routes = [ { path: publicRoutes.markets.path, loadChildren: () => - import('./pages/markets/markets-page.module').then( - (m) => m.MarketsPageModule - ) + import('./pages/markets/markets-page.routes').then((m) => m.routes) }, { path: publicRoutes.openStartup.path, diff --git a/apps/client/src/app/pages/markets/markets-page-routing.module.ts b/apps/client/src/app/pages/markets/markets-page-routing.module.ts deleted file mode 100644 index 05ab9b275..000000000 --- a/apps/client/src/app/pages/markets/markets-page-routing.module.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { publicRoutes } from '@ghostfolio/common/routes/routes'; - -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { MarketsPageComponent } from './markets-page.component'; - -const routes: Routes = [ - { - canActivate: [AuthGuard], - component: MarketsPageComponent, - path: '', - title: publicRoutes.markets.title - } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class MarketsPageRoutingModule {} diff --git a/apps/client/src/app/pages/markets/markets-page.component.ts b/apps/client/src/app/pages/markets/markets-page.component.ts index be569233e..2d4a25876 100644 --- a/apps/client/src/app/pages/markets/markets-page.component.ts +++ b/apps/client/src/app/pages/markets/markets-page.component.ts @@ -1,14 +1,17 @@ +import { HomeMarketComponent } from '@ghostfolio/client/components/home-market/home-market.component'; + +import { CommonModule } from '@angular/common'; import { Component, OnDestroy } from '@angular/core'; import { Subject } from 'rxjs'; @Component({ host: { class: 'page' }, + imports: [CommonModule, HomeMarketComponent], selector: 'gf-markets-page', styleUrls: ['./markets-page.scss'], - templateUrl: './markets-page.html', - standalone: false + templateUrl: './markets-page.html' }) -export class MarketsPageComponent implements OnDestroy { +export class GfMarketsPageComponent implements OnDestroy { private unsubscribeSubject = new Subject(); public ngOnDestroy() { diff --git a/apps/client/src/app/pages/markets/markets-page.module.ts b/apps/client/src/app/pages/markets/markets-page.module.ts deleted file mode 100644 index 34938612e..000000000 --- a/apps/client/src/app/pages/markets/markets-page.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { HomeMarketComponent } from '@ghostfolio/client/components/home-market/home-market.component'; - -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; - -import { MarketsPageRoutingModule } from './markets-page-routing.module'; -import { MarketsPageComponent } from './markets-page.component'; - -@NgModule({ - declarations: [MarketsPageComponent], - imports: [CommonModule, HomeMarketComponent, MarketsPageRoutingModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class MarketsPageModule {} diff --git a/apps/client/src/app/pages/markets/markets-page.routes.ts b/apps/client/src/app/pages/markets/markets-page.routes.ts new file mode 100644 index 000000000..70ebb5553 --- /dev/null +++ b/apps/client/src/app/pages/markets/markets-page.routes.ts @@ -0,0 +1,24 @@ +import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; +import { publicRoutes } from '@ghostfolio/common/routes/routes'; + +import { Routes } from '@angular/router'; + +import { GfMarketsPageComponent } from './markets-page.component'; + +export const routes: Routes = [ + { + canActivate: [AuthGuard], + children: [ + { + path: '', + loadComponent: () => + import('./markets-page.component').then( + (m) => m.GfMarketsPageComponent + ) + } + ], + component: GfMarketsPageComponent, + path: '', + title: publicRoutes.markets.title + } +];