From ced7f1f2062b3a3f61769db5b799f8c90eb7d083 Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Tue, 10 Jun 2025 00:51:27 +0700 Subject: [PATCH] Feature/extend search in assistant by quick links (#4870) * Extend search in assistant by quick links * Update changelog --- CHANGELOG.md | 4 + apps/client/src/app/app-routing.module.ts | 2 +- apps/client/src/app/app.component.ts | 2 +- .../access-table/access-table.component.ts | 2 +- .../account-detail-dialog.component.ts | 2 +- .../admin-settings.component.ts | 2 +- .../benchmark-comparator.component.ts | 2 +- .../app/components/header/header.component.ts | 2 +- .../holding-detail-dialog.component.ts | 2 +- .../home-holdings/home-holdings.component.ts | 2 +- .../home-overview/home-overview.component.ts | 2 +- ...scription-interstitial-dialog.component.ts | 2 +- .../user-account-membership.component.ts | 2 +- apps/client/src/app/core/auth.guard.ts | 2 +- .../src/app/core/http-response.interceptor.ts | 2 +- .../pages/about/about-page-routing.module.ts | 2 +- .../app/pages/about/about-page.component.ts | 2 +- .../overview/about-overview-page.component.ts | 2 +- .../accounts/accounts-page-routing.module.ts | 2 +- .../pages/admin/admin-page-routing.module.ts | 2 +- .../app/pages/admin/admin-page.component.ts | 2 +- .../hallo-ghostfolio-page.component.ts | 2 +- .../hello-ghostfolio-page.component.ts | 2 +- ...st-months-in-open-source-page.component.ts | 2 +- ...-meets-internet-identity-page.component.ts | 2 +- ...get-my-finances-in-order-page.component.ts | 2 +- .../500-stars-on-github-page.component.ts | 2 +- .../hacktoberfest-2022-page.component.ts | 2 +- .../black-friday-2022-page.component.ts | 2 +- ...g-your-personal-finances-page.component.ts | 2 +- ...auf-sackgeld-vorgestellt-page.component.ts | 2 +- .../ghostfolio-meets-umbrel-page.component.ts | 2 +- .../1000-stars-on-github-page.component.ts | 2 +- ...otential-with-ghostfolio-page.component.ts | 2 +- ...ploring-the-path-to-fire-page.component.ts | 2 +- ...tfolio-joins-oss-friends-page.component.ts | 2 +- .../ghostfolio-2-page.component.ts | 2 +- .../hacktoberfest-2023-page.component.ts | 2 +- .../black-week-2023-page.component.ts | 2 +- ...oberfest-2023-debriefing-page.component.ts | 2 +- .../hacktoberfest-2024-page.component.ts | 2 +- .../black-weeks-2024-page.component.ts | 2 +- .../app/pages/faq/faq-page-routing.module.ts | 2 +- .../src/app/pages/faq/faq-page.component.ts | 2 +- .../overview/faq-overview-page.component.ts | 2 +- .../app/pages/faq/saas/saas-page.component.ts | 2 +- .../self-hosting-page.component.ts | 2 +- .../pages/features/features-page.component.ts | 2 +- .../pages/home/home-page-routing.module.ts | 2 +- .../src/app/pages/home/home-page.component.ts | 2 +- .../pages/landing/landing-page.component.ts | 2 +- .../pages/open/open-page-routing.module.ts | 2 +- .../activities-page-routing.module.ts | 2 +- .../portfolio-page-routing.module.ts | 2 +- .../portfolio/portfolio-page.component.ts | 2 +- .../pages/pricing/pricing-page.component.ts | 2 +- .../register/register-page-routing.module.ts | 2 +- .../show-access-token-dialog.component.ts | 2 +- .../glossary/resources-glossary.component.ts | 2 +- .../overview/resources-overview.component.ts | 2 +- ...sonal-finance-tools-page-routing.module.ts | 2 +- .../personal-finance-tools-page.component.ts | 2 +- .../product-page.component.ts | 2 +- .../resources-page-routing.module.ts | 2 +- .../resources/resources-page.component.ts | 2 +- .../user-account-page-routing.module.ts | 2 +- .../user-account-page.component.ts | 2 +- .../app/pages/zen/zen-page-routing.module.ts | 2 +- .../src/app/pages/zen/zen-page.component.ts | 2 +- .../src/lib/routes/interfaces/interfaces.ts | 7 + libs/common/src/lib/{ => routes}/routes.ts | 5 +- .../assistant-list-item.component.ts | 38 ++- .../assistant-list-item.html | 18 +- .../src/lib/assistant/assistant.component.ts | 244 +++++++++++++----- libs/ui/src/lib/assistant/assistant.html | 31 ++- .../ui/src/lib/assistant/enums/search-mode.ts | 5 + .../lib/assistant/interfaces/interfaces.ts | 20 +- .../membership-card.component.ts | 2 +- .../no-transactions-info.component.ts | 2 +- .../premium-indicator.component.ts | 2 +- 80 files changed, 354 insertions(+), 160 deletions(-) create mode 100644 libs/common/src/lib/routes/interfaces/interfaces.ts rename libs/common/src/lib/{ => routes}/routes.ts (95%) create mode 100644 libs/ui/src/lib/assistant/enums/search-mode.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 419d4596e..d1d515ba6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- Included quick links in the search results of the assistant + ### Changed - Improved the language localization for Portuguese (`pt`) diff --git a/apps/client/src/app/app-routing.module.ts b/apps/client/src/app/app-routing.module.ts index 46473d35d..97b16e534 100644 --- a/apps/client/src/app/app-routing.module.ts +++ b/apps/client/src/app/app-routing.module.ts @@ -4,7 +4,7 @@ import { publicRoutes, routes as ghostfolioRoutes, internalRoutes -} from '@ghostfolio/common/routes'; +} from '@ghostfolio/common/routes/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes, TitleStrategy } from '@angular/router'; diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index 7f308c7a7..5e5a0b9eb 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -7,7 +7,7 @@ import { internalRoutes, publicRoutes, routes -} from '@ghostfolio/common/routes'; +} from '@ghostfolio/common/routes/routes'; import { ColorScheme } from '@ghostfolio/common/types'; import { DOCUMENT } from '@angular/common'; diff --git a/apps/client/src/app/components/access-table/access-table.component.ts b/apps/client/src/app/components/access-table/access-table.component.ts index 5487f570d..50d823def 100644 --- a/apps/client/src/app/components/access-table/access-table.component.ts +++ b/apps/client/src/app/components/access-table/access-table.component.ts @@ -1,7 +1,7 @@ import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { Access, User } from '@ghostfolio/common/interfaces'; -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Clipboard } from '@angular/cdk/clipboard'; import { diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts index aea1c544c..493d6324d 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts @@ -10,7 +10,7 @@ import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { internalRoutes } from '@ghostfolio/common/routes'; +import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { OrderWithAccount } from '@ghostfolio/common/types'; import { diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.ts b/apps/client/src/app/components/admin-settings/admin-settings.component.ts index e6fdb53cc..155791d1b 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.component.ts +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.ts @@ -10,7 +10,7 @@ import { DataProviderInfo, User } from '@ghostfolio/common/interfaces'; -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { ChangeDetectionStrategy, diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts index 74a2f85d6..32ac71afa 100644 --- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts +++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -13,7 +13,7 @@ import { } from '@ghostfolio/common/helper'; import { LineChartItem, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { ColorScheme } from '@ghostfolio/common/types'; import { diff --git a/apps/client/src/app/components/header/header.component.ts b/apps/client/src/app/components/header/header.component.ts index 23049ada9..f689ae9c3 100644 --- a/apps/client/src/app/components/header/header.component.ts +++ b/apps/client/src/app/components/header/header.component.ts @@ -16,7 +16,7 @@ import { internalRoutes, publicRoutes, routes -} from '@ghostfolio/common/routes'; +} from '@ghostfolio/common/routes/routes'; import { DateRange } from '@ghostfolio/common/types'; import { GfAssistantComponent } from '@ghostfolio/ui/assistant/assistant.component'; 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 6e8fc2af5..a90c36c3d 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 @@ -14,7 +14,7 @@ import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { internalRoutes } from '@ghostfolio/common/routes'; +import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { GfDataProviderCreditsComponent } from '@ghostfolio/ui/data-provider-credits'; import { GfHistoricalMarketDataEditorComponent } from '@ghostfolio/ui/historical-market-data-editor'; diff --git a/apps/client/src/app/components/home-holdings/home-holdings.component.ts b/apps/client/src/app/components/home-holdings/home-holdings.component.ts index 03de79f44..735365353 100644 --- a/apps/client/src/app/components/home-holdings/home-holdings.component.ts +++ b/apps/client/src/app/components/home-holdings/home-holdings.component.ts @@ -8,7 +8,7 @@ import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { internalRoutes } from '@ghostfolio/common/routes'; +import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { HoldingType, HoldingsViewMode } from '@ghostfolio/common/types'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; diff --git a/apps/client/src/app/components/home-overview/home-overview.component.ts b/apps/client/src/app/components/home-overview/home-overview.component.ts index 776967c3d..ada6f9661 100644 --- a/apps/client/src/app/components/home-overview/home-overview.component.ts +++ b/apps/client/src/app/components/home-overview/home-overview.component.ts @@ -11,7 +11,7 @@ import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { internalRoutes } from '@ghostfolio/common/routes'; +import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; diff --git a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts index df257a001..70d4b9ed7 100644 --- a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts +++ b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { ChangeDetectionStrategy, 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 27655915b..a8ca4eead 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 @@ -5,7 +5,7 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { getDateFormatString } from '@ghostfolio/common/helper'; import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { ChangeDetectionStrategy, diff --git a/apps/client/src/app/core/auth.guard.ts b/apps/client/src/app/core/auth.guard.ts index 919a88bd5..28af9fd34 100644 --- a/apps/client/src/app/core/auth.guard.ts +++ b/apps/client/src/app/core/auth.guard.ts @@ -5,7 +5,7 @@ import { internalRoutes, publicRoutes, routes -} from '@ghostfolio/common/routes'; +} from '@ghostfolio/common/routes/routes'; import { Injectable } from '@angular/core'; import { diff --git a/apps/client/src/app/core/http-response.interceptor.ts b/apps/client/src/app/core/http-response.interceptor.ts index 31e1c1947..97b0ab3a3 100644 --- a/apps/client/src/app/core/http-response.interceptor.ts +++ b/apps/client/src/app/core/http-response.interceptor.ts @@ -2,7 +2,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { WebAuthnService } from '@ghostfolio/client/services/web-authn.service'; import { InfoItem } from '@ghostfolio/common/interfaces'; -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { HTTP_INTERCEPTORS, diff --git a/apps/client/src/app/pages/about/about-page-routing.module.ts b/apps/client/src/app/pages/about/about-page-routing.module.ts index d17612584..353b165a5 100644 --- a/apps/client/src/app/pages/about/about-page-routing.module.ts +++ b/apps/client/src/app/pages/about/about-page-routing.module.ts @@ -1,5 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes'; +import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; diff --git a/apps/client/src/app/pages/about/about-page.component.ts b/apps/client/src/app/pages/about/about-page.component.ts index de307cbf9..2afdd6838 100644 --- a/apps/client/src/app/pages/about/about-page.component.ts +++ b/apps/client/src/app/pages/about/about-page.component.ts @@ -2,7 +2,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; 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 c4ce08aee..2b545e1dd 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 @@ -2,7 +2,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { publicRoutes, routes } from '@ghostfolio/common/routes'; +import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { Subject } from 'rxjs'; 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 index d34ab48fb..8d3da2c35 100644 --- a/apps/client/src/app/pages/accounts/accounts-page-routing.module.ts +++ b/apps/client/src/app/pages/accounts/accounts-page-routing.module.ts @@ -1,5 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { internalRoutes } from '@ghostfolio/common/routes'; +import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; diff --git a/apps/client/src/app/pages/admin/admin-page-routing.module.ts b/apps/client/src/app/pages/admin/admin-page-routing.module.ts index f19f27051..31c51dbab 100644 --- a/apps/client/src/app/pages/admin/admin-page-routing.module.ts +++ b/apps/client/src/app/pages/admin/admin-page-routing.module.ts @@ -4,7 +4,7 @@ import { AdminOverviewComponent } from '@ghostfolio/client/components/admin-over import { AdminSettingsComponent } from '@ghostfolio/client/components/admin-settings/admin-settings.component'; import { AdminUsersComponent } from '@ghostfolio/client/components/admin-users/admin-users.component'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes'; +import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; diff --git a/apps/client/src/app/pages/admin/admin-page.component.ts b/apps/client/src/app/pages/admin/admin-page.component.ts index eea04f930..38cbf545b 100644 --- a/apps/client/src/app/pages/admin/admin-page.component.ts +++ b/apps/client/src/app/pages/admin/admin-page.component.ts @@ -1,5 +1,5 @@ import { TabConfiguration } from '@ghostfolio/common/interfaces'; -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; diff --git a/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts index 430166065..1227f5b01 100644 --- a/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts +++ b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; diff --git a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts index 0c8584cd0..a8b333dd5 100644 --- a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts +++ b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; diff --git a/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.component.ts b/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.component.ts index 0b5e6f659..ef6b719f4 100644 --- a/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; diff --git a/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.component.ts b/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.component.ts index a644c7996..2d43e7fe0 100644 --- a/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; diff --git a/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.component.ts b/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.component.ts index c7ab04820..28c3d03b7 100644 --- a/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; diff --git a/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts b/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts index 635a8bde3..9d255f791 100644 --- a/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; diff --git a/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.component.ts b/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.component.ts index 8b15e9f2f..616c33525 100644 --- a/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; diff --git a/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts b/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts index 07ffd76d9..0779de28a 100644 --- a/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { Component } from '@angular/core'; diff --git a/apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.component.ts b/apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.component.ts index f9ebee82b..eebab2cc8 100644 --- a/apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; diff --git a/apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.component.ts b/apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.component.ts index 363bfc8eb..ebbb1e39b 100644 --- a/apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; diff --git a/apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.component.ts b/apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.component.ts index 9d6af906c..2e28e70c1 100644 --- a/apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; diff --git a/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.component.ts b/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.component.ts index 4e1360622..2cade60f2 100644 --- a/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; diff --git a/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts b/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts index e97dce009..a115ae6d6 100644 --- a/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; diff --git a/apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component.ts b/apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component.ts index abe3d9383..123d4c28a 100644 --- a/apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; diff --git a/apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts b/apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts index 0811f2df7..bea7ee417 100644 --- a/apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; diff --git a/apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts b/apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts index 4d5581251..92f4b0395 100644 --- a/apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; diff --git a/apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts b/apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts index 162831703..ba74dc288 100644 --- a/apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts @@ -1,4 +1,4 @@ -import { publicRoutes, routes } from '@ghostfolio/common/routes'; +import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; diff --git a/apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts b/apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts index a3b02004e..13168c1fa 100644 --- a/apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { Component } from '@angular/core'; diff --git a/apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.component.ts b/apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.component.ts index 689581bf1..e851c9ea1 100644 --- a/apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; diff --git a/apps/client/src/app/pages/blog/2024/09/hacktoberfest-2024/hacktoberfest-2024-page.component.ts b/apps/client/src/app/pages/blog/2024/09/hacktoberfest-2024/hacktoberfest-2024-page.component.ts index 28b24cb00..f4205dddc 100644 --- a/apps/client/src/app/pages/blog/2024/09/hacktoberfest-2024/hacktoberfest-2024-page.component.ts +++ b/apps/client/src/app/pages/blog/2024/09/hacktoberfest-2024/hacktoberfest-2024-page.component.ts @@ -1,4 +1,4 @@ -import { publicRoutes, routes } from '@ghostfolio/common/routes'; +import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; diff --git a/apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts b/apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts index b29a82b57..394896470 100644 --- a/apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts +++ b/apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { Component } from '@angular/core'; diff --git a/apps/client/src/app/pages/faq/faq-page-routing.module.ts b/apps/client/src/app/pages/faq/faq-page-routing.module.ts index 47870958d..984410e67 100644 --- a/apps/client/src/app/pages/faq/faq-page-routing.module.ts +++ b/apps/client/src/app/pages/faq/faq-page-routing.module.ts @@ -1,5 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes'; +import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; diff --git a/apps/client/src/app/pages/faq/faq-page.component.ts b/apps/client/src/app/pages/faq/faq-page.component.ts index 8bfbdcbcc..93786e1ea 100644 --- a/apps/client/src/app/pages/faq/faq-page.component.ts +++ b/apps/client/src/app/pages/faq/faq-page.component.ts @@ -1,7 +1,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { TabConfiguration } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; diff --git a/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts b/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts index a59bb7160..835bc826f 100644 --- a/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts +++ b/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts @@ -1,6 +1,6 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { User } from '@ghostfolio/common/interfaces'; -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; import { Subject, takeUntil } from 'rxjs'; diff --git a/apps/client/src/app/pages/faq/saas/saas-page.component.ts b/apps/client/src/app/pages/faq/saas/saas-page.component.ts index 7f7e2c709..fe1a124b0 100644 --- a/apps/client/src/app/pages/faq/saas/saas-page.component.ts +++ b/apps/client/src/app/pages/faq/saas/saas-page.component.ts @@ -1,6 +1,6 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { User } from '@ghostfolio/common/interfaces'; -import { publicRoutes, routes } from '@ghostfolio/common/routes'; +import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; import { Subject, takeUntil } from 'rxjs'; diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts index 864db7af3..27f14f116 100644 --- a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts +++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component, OnDestroy } from '@angular/core'; import { Subject } from 'rxjs'; diff --git a/apps/client/src/app/pages/features/features-page.component.ts b/apps/client/src/app/pages/features/features-page.component.ts index abe5cab0f..7d4ff2675 100644 --- a/apps/client/src/app/pages/features/features-page.component.ts +++ b/apps/client/src/app/pages/features/features-page.component.ts @@ -2,7 +2,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { InfoItem, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { publicRoutes, routes } from '@ghostfolio/common/routes'; +import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; diff --git a/apps/client/src/app/pages/home/home-page-routing.module.ts b/apps/client/src/app/pages/home/home-page-routing.module.ts index 7f00ceabe..bc209b7fd 100644 --- a/apps/client/src/app/pages/home/home-page-routing.module.ts +++ b/apps/client/src/app/pages/home/home-page-routing.module.ts @@ -7,7 +7,7 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { routes as ghostfolioRoutes, internalRoutes -} from '@ghostfolio/common/routes'; +} from '@ghostfolio/common/routes/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; diff --git a/apps/client/src/app/pages/home/home-page.component.ts b/apps/client/src/app/pages/home/home-page.component.ts index 870930b4e..8b31d400e 100644 --- a/apps/client/src/app/pages/home/home-page.component.ts +++ b/apps/client/src/app/pages/home/home-page.component.ts @@ -1,7 +1,7 @@ import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; -import { internalRoutes, routes } from '@ghostfolio/common/routes'; +import { internalRoutes, routes } from '@ghostfolio/common/routes/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; diff --git a/apps/client/src/app/pages/landing/landing-page.component.ts b/apps/client/src/app/pages/landing/landing-page.component.ts index bdfff38fb..e16778fd3 100644 --- a/apps/client/src/app/pages/landing/landing-page.component.ts +++ b/apps/client/src/app/pages/landing/landing-page.component.ts @@ -1,7 +1,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { Statistics } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { publicRoutes, routes } from '@ghostfolio/common/routes'; +import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; import { Component, OnDestroy, OnInit } from '@angular/core'; import { format } from 'date-fns'; diff --git a/apps/client/src/app/pages/open/open-page-routing.module.ts b/apps/client/src/app/pages/open/open-page-routing.module.ts index cd113d361..c56fe80ba 100644 --- a/apps/client/src/app/pages/open/open-page-routing.module.ts +++ b/apps/client/src/app/pages/open/open-page-routing.module.ts @@ -1,5 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { publicRoutes } from '@ghostfolio/common/routes'; +import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts b/apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts index 38a594c99..3d1d0597a 100644 --- a/apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts +++ b/apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts @@ -1,5 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { internalRoutes } from '@ghostfolio/common/routes'; +import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; diff --git a/apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts b/apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts index 87c1a2785..8a33e1489 100644 --- a/apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts +++ b/apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -2,7 +2,7 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { routes as ghostfolioRoutes, internalRoutes -} from '@ghostfolio/common/routes'; +} from '@ghostfolio/common/routes/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; diff --git a/apps/client/src/app/pages/portfolio/portfolio-page.component.ts b/apps/client/src/app/pages/portfolio/portfolio-page.component.ts index 8e0748f64..c9479976b 100644 --- a/apps/client/src/app/pages/portfolio/portfolio-page.component.ts +++ b/apps/client/src/app/pages/portfolio/portfolio-page.component.ts @@ -1,6 +1,6 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; -import { internalRoutes, routes } from '@ghostfolio/common/routes'; +import { internalRoutes, routes } from '@ghostfolio/common/routes/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; diff --git a/apps/client/src/app/pages/pricing/pricing-page.component.ts b/apps/client/src/app/pages/pricing/pricing-page.component.ts index 1e9001632..15d820f56 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.component.ts +++ b/apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -3,7 +3,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { publicRoutes, routes } from '@ghostfolio/common/routes'; +import { publicRoutes, routes } from '@ghostfolio/common/routes/routes'; import { translate } from '@ghostfolio/ui/i18n'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; diff --git a/apps/client/src/app/pages/register/register-page-routing.module.ts b/apps/client/src/app/pages/register/register-page-routing.module.ts index 81af9f09f..157302999 100644 --- a/apps/client/src/app/pages/register/register-page-routing.module.ts +++ b/apps/client/src/app/pages/register/register-page-routing.module.ts @@ -1,5 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { publicRoutes } from '@ghostfolio/common/routes'; +import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; diff --git a/apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.component.ts b/apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.component.ts index fb35a357d..2f93b83c5 100644 --- a/apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.component.ts +++ b/apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.component.ts @@ -1,5 +1,5 @@ import { DataService } from '@ghostfolio/client/services/data.service'; -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { ChangeDetectionStrategy, diff --git a/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts b/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts index f05b353d2..706249752 100644 --- a/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts +++ b/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts @@ -1,7 +1,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { InfoItem } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component, OnInit } from '@angular/core'; diff --git a/apps/client/src/app/pages/resources/overview/resources-overview.component.ts b/apps/client/src/app/pages/resources/overview/resources-overview.component.ts index 6cf136ed9..4db78d512 100644 --- a/apps/client/src/app/pages/resources/overview/resources-overview.component.ts +++ b/apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component } from '@angular/core'; diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts index 921b7340d..e8c256c0d 100644 --- a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts +++ b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts @@ -1,6 +1,6 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; -import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes'; +import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts index e6394098c..1faceedab 100644 --- a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts +++ b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts @@ -1,5 +1,5 @@ import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component, OnDestroy } from '@angular/core'; import { Subject } from 'rxjs'; diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts index 9024acc7e..42fcbb926 100644 --- a/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts +++ b/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -1,7 +1,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { Product } from '@ghostfolio/common/interfaces'; import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { translate } from '@ghostfolio/ui/i18n'; import { Component, OnInit } from '@angular/core'; diff --git a/apps/client/src/app/pages/resources/resources-page-routing.module.ts b/apps/client/src/app/pages/resources/resources-page-routing.module.ts index fe226a896..960d6c283 100644 --- a/apps/client/src/app/pages/resources/resources-page-routing.module.ts +++ b/apps/client/src/app/pages/resources/resources-page-routing.module.ts @@ -1,5 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes'; +import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; diff --git a/apps/client/src/app/pages/resources/resources-page.component.ts b/apps/client/src/app/pages/resources/resources-page.component.ts index 907779ed8..770d463bd 100644 --- a/apps/client/src/app/pages/resources/resources-page.component.ts +++ b/apps/client/src/app/pages/resources/resources-page.component.ts @@ -1,4 +1,4 @@ -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { Component, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; 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 index 9701c20a2..a9c41b68d 100644 --- 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 @@ -2,7 +2,7 @@ import { UserAccountAccessComponent } from '@ghostfolio/client/components/user-a 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 { routes as ghostfolioRoutes } from '@ghostfolio/common/routes'; +import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; 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 da53c1fd6..e8edc8e03 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 @@ -1,6 +1,6 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; -import { routes } from '@ghostfolio/common/routes'; +import { routes } from '@ghostfolio/common/routes/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; diff --git a/apps/client/src/app/pages/zen/zen-page-routing.module.ts b/apps/client/src/app/pages/zen/zen-page-routing.module.ts index 8ca947957..f5a8f222f 100644 --- a/apps/client/src/app/pages/zen/zen-page-routing.module.ts +++ b/apps/client/src/app/pages/zen/zen-page-routing.module.ts @@ -1,7 +1,7 @@ import { HomeHoldingsComponent } from '@ghostfolio/client/components/home-holdings/home-holdings.component'; import { HomeOverviewComponent } from '@ghostfolio/client/components/home-overview/home-overview.component'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { internalRoutes } from '@ghostfolio/common/routes'; +import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; diff --git a/apps/client/src/app/pages/zen/zen-page.component.ts b/apps/client/src/app/pages/zen/zen-page.component.ts index ae15c1532..004ddab60 100644 --- a/apps/client/src/app/pages/zen/zen-page.component.ts +++ b/apps/client/src/app/pages/zen/zen-page.component.ts @@ -1,6 +1,6 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; -import { internalRoutes } from '@ghostfolio/common/routes'; +import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; diff --git a/libs/common/src/lib/routes/interfaces/interfaces.ts b/libs/common/src/lib/routes/interfaces/interfaces.ts new file mode 100644 index 000000000..5e9f65b40 --- /dev/null +++ b/libs/common/src/lib/routes/interfaces/interfaces.ts @@ -0,0 +1,7 @@ +export interface IRoute { + excludeFromAssistant?: boolean; + path: string; + routerLink: string[]; + subRoutes?: Record; + title: string; +} diff --git a/libs/common/src/lib/routes.ts b/libs/common/src/lib/routes/routes.ts similarity index 95% rename from libs/common/src/lib/routes.ts rename to libs/common/src/lib/routes/routes.ts index 44a19bc8a..7e8910b54 100644 --- a/libs/common/src/lib/routes.ts +++ b/libs/common/src/lib/routes/routes.ts @@ -1,5 +1,7 @@ import '@angular/localize/init'; +import { IRoute } from './interfaces/interfaces'; + export const routes = { access: 'access', account: 'account', @@ -44,14 +46,13 @@ export const routes = { termsOfService: $localize`:kebab-case:terms-of-service` }; -export const internalRoutes = { +export const internalRoutes: Record = { accounts: { path: 'accounts', routerLink: ['/accounts'], title: $localize`Accounts` }, home: { - excludeFromAssistant: true, path: 'home', routerLink: ['/home'], subRoutes: { 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 a0744db9f..457df01ff 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,5 +1,9 @@ import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; -import { ISearchResultItem } from '@ghostfolio/ui/assistant/interfaces/interfaces'; +import { SearchMode } from '@ghostfolio/ui/assistant/enums/search-mode'; +import { + IAssetSearchResultItem, + ISearchResultItem +} from '@ghostfolio/ui/assistant/interfaces/interfaces'; import { FocusableOption } from '@angular/cdk/a11y'; import { @@ -32,7 +36,6 @@ export class GfAssistantListItemComponent } @Input() item: ISearchResultItem; - @Input() mode: 'assetProfile' | 'holding'; @Output() clicked = new EventEmitter(); @@ -45,23 +48,23 @@ export class GfAssistantListItemComponent public constructor(private changeDetectorRef: ChangeDetectorRef) {} public ngOnChanges() { - const dataSource = this.item?.dataSource; - const symbol = this.item?.symbol; - - if (this.mode === 'assetProfile') { + if (this.item?.mode === SearchMode.ASSET_PROFILE) { this.queryParams = { - dataSource, - symbol, - assetProfileDialog: true + assetProfileDialog: true, + dataSource: this.item?.dataSource, + symbol: this.item?.symbol }; this.routerLink = ['/admin', 'market-data']; - } else if (this.mode === 'holding') { + } else if (this.item?.mode === SearchMode.HOLDING) { this.queryParams = { - dataSource, - symbol, - holdingDetailDialog: true + dataSource: this.item?.dataSource, + holdingDetailDialog: true, + symbol: this.item?.symbol }; this.routerLink = []; + } else if (this.item?.mode === SearchMode.QUICK_LINK) { + this.queryParams = {}; + this.routerLink = this.item.routerLink; } } @@ -71,6 +74,15 @@ export class GfAssistantListItemComponent this.changeDetectorRef.markForCheck(); } + public isAsset(item: ISearchResultItem): item is IAssetSearchResultItem { + return ( + (item.mode === SearchMode.ASSET_PROFILE || + item.mode === SearchMode.HOLDING) && + !!item.dataSource && + !!item.symbol + ); + } + public onClick() { this.clicked.emit(); } diff --git a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.html b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.html index 46c8a4c24..09465b669 100644 --- a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.html +++ b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.html @@ -7,11 +7,13 @@ >{{ item?.name }} -
- {{ item?.symbol | gfSymbol }} · {{ item?.currency }} - @if (item?.assetSubClassString) { - · {{ item.assetSubClassString }} - } - + @if (item && isAsset(item)) { +
+ {{ item?.symbol | gfSymbol }} · {{ item?.currency }} + @if (item?.assetSubClassString) { + · {{ item.assetSubClassString }} + } + + } + diff --git a/libs/ui/src/lib/assistant/assistant.component.ts b/libs/ui/src/lib/assistant/assistant.component.ts index 2aac45146..a74ef310a 100644 --- a/libs/ui/src/lib/assistant/assistant.component.ts +++ b/libs/ui/src/lib/assistant/assistant.component.ts @@ -3,6 +3,8 @@ import { AdminService } from '@ghostfolio/client/services/admin.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { Filter, PortfolioPosition, User } from '@ghostfolio/common/interfaces'; +import { IRoute } from '@ghostfolio/common/routes/interfaces/interfaces'; +import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { DateRange } from '@ghostfolio/common/types'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { translate } from '@ghostfolio/ui/i18n'; @@ -39,17 +41,20 @@ import { MatSelectModule } from '@angular/material/select'; import { RouterModule } from '@angular/router'; import { Account, AssetClass, DataSource } from '@prisma/client'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; -import { EMPTY, Observable, Subject, lastValueFrom } from 'rxjs'; +import { EMPTY, Observable, Subject, merge, of } from 'rxjs'; import { catchError, debounceTime, distinctUntilChanged, map, - mergeMap, - takeUntil + scan, + switchMap, + takeUntil, + tap } from 'rxjs/operators'; import { GfAssistantListItemComponent } from './assistant-list-item/assistant-list-item.component'; +import { SearchMode } from './enums/search-mode'; import { IDateRangeOption, ISearchResultItem, @@ -138,13 +143,18 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { tag: new FormControl(undefined) }); public holdings: PortfolioPosition[] = []; - public isLoading = false; + public isLoading = { + assetProfiles: false, + holdings: false, + quickLinks: false + }; public isOpen = false; - public placeholder = $localize`Find holding...`; + public placeholder = $localize`Find holding or page...`; public searchFormControl = new FormControl(''); public searchResults: ISearchResults = { assetProfiles: [], - holdings: [] + holdings: [], + quickLinks: [] }; public tags: Filter[] = []; @@ -177,39 +187,145 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { this.searchFormControl.valueChanges .pipe( map((searchTerm) => { - this.isLoading = true; + this.isLoading = { + assetProfiles: true, + holdings: true, + quickLinks: true + }; this.searchResults = { assetProfiles: [], - holdings: [] + holdings: [], + quickLinks: [] }; this.changeDetectorRef.markForCheck(); - return searchTerm; + return searchTerm?.trim(); }), debounceTime(300), distinctUntilChanged(), - mergeMap(async (searchTerm) => { - const result = { + switchMap((searchTerm) => { + const results = { assetProfiles: [], - holdings: [] + holdings: [], + quickLinks: [] } as ISearchResults; - try { - if (searchTerm) { - return await this.getSearchResults(searchTerm); - } - } catch {} + if (!searchTerm) { + return of(results).pipe( + tap(() => { + this.isLoading = { + assetProfiles: false, + holdings: false, + quickLinks: false + }; + }) + ); + } + + // Asset profiles + const assetProfiles$: Observable> = this + .hasPermissionToAccessAdminControl + ? this.searchAssetProfiles(searchTerm).pipe( + map((assetProfiles) => ({ + assetProfiles: assetProfiles.slice( + 0, + GfAssistantComponent.SEARCH_RESULTS_DEFAULT_LIMIT + ) + })), + catchError((error) => { + console.error( + 'Error fetching asset profiles for assistant:', + error + ); + return of({ assetProfiles: [] as ISearchResultItem[] }); + }), + tap(() => { + this.isLoading.assetProfiles = false; + this.changeDetectorRef.markForCheck(); + }) + ) + : of({ assetProfiles: [] as ISearchResultItem[] }).pipe( + tap(() => { + this.isLoading.assetProfiles = false; + this.changeDetectorRef.markForCheck(); + }) + ); + + // Holdings + const holdings$: Observable> = + this.searchHoldings(searchTerm).pipe( + map((holdings) => ({ + holdings: holdings.slice( + 0, + GfAssistantComponent.SEARCH_RESULTS_DEFAULT_LIMIT + ) + })), + catchError((error) => { + console.error('Error fetching holdings for assistant:', error); + return of({ holdings: [] as ISearchResultItem[] }); + }), + tap(() => { + this.isLoading.holdings = false; + this.changeDetectorRef.markForCheck(); + }) + ); + + // Quick links + const quickLinks$: Observable> = of( + this.searchQuickLinks(searchTerm) + ).pipe( + map((quickLinks) => ({ + quickLinks: quickLinks.slice( + 0, + GfAssistantComponent.SEARCH_RESULTS_DEFAULT_LIMIT + ) + })), + tap(() => { + this.isLoading.quickLinks = false; + this.changeDetectorRef.markForCheck(); + }) + ); - return result; + // Merge all results + return merge(quickLinks$, assetProfiles$, holdings$).pipe( + scan( + (acc: ISearchResults, curr: Partial) => ({ + ...acc, + ...curr + }), + { + assetProfiles: [], + holdings: [], + quickLinks: [] + } as ISearchResults + ) + ); }), takeUntil(this.unsubscribeSubject) ) - .subscribe((searchResults) => { - this.searchResults = searchResults; - this.isLoading = false; - - this.changeDetectorRef.markForCheck(); + .subscribe({ + next: (searchResults) => { + this.searchResults = searchResults; + this.changeDetectorRef.markForCheck(); + }, + error: (error) => { + console.error('Assistant search stream error:', error); + this.searchResults = { + assetProfiles: [], + holdings: [], + quickLinks: [] + }; + this.changeDetectorRef.markForCheck(); + }, + complete: () => { + this.isLoading = { + assetProfiles: false, + holdings: false, + quickLinks: false + }; + this.changeDetectorRef.markForCheck(); + } }); } @@ -307,11 +423,16 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { } public initialize() { - this.isLoading = true; + this.isLoading = { + assetProfiles: true, + holdings: true, + quickLinks: true + }; this.keyManager = new FocusKeyManager(this.assistantListItems).withWrap(); this.searchResults = { assetProfiles: [], - holdings: [] + holdings: [], + quickLinks: [] }; for (const item of this.assistantListItems) { @@ -323,7 +444,11 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { this.searchElement?.nativeElement?.focus(); }); - this.isLoading = false; + this.isLoading = { + assetProfiles: false, + holdings: false, + quickLinks: false + }; this.setIsOpen(true); this.dataService @@ -412,36 +537,6 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { }); } - private async getSearchResults(aSearchTerm: string) { - let assetProfiles: ISearchResultItem[] = []; - let holdings: ISearchResultItem[] = []; - - if (this.hasPermissionToAccessAdminControl) { - try { - assetProfiles = await lastValueFrom( - this.searchAssetProfiles(aSearchTerm) - ); - assetProfiles = assetProfiles.slice( - 0, - GfAssistantComponent.SEARCH_RESULTS_DEFAULT_LIMIT - ); - } catch {} - } - - try { - holdings = await lastValueFrom(this.searchHoldings(aSearchTerm)); - holdings = holdings.slice( - 0, - GfAssistantComponent.SEARCH_RESULTS_DEFAULT_LIMIT - ); - } catch {} - - return { - assetProfiles, - holdings - }; - } - private searchAssetProfiles( aSearchTerm: string ): Observable { @@ -467,7 +562,8 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { dataSource, name, symbol, - assetSubClassString: translate(assetSubClass) + assetSubClassString: translate(assetSubClass), + mode: SearchMode.ASSET_PROFILE as const }; } ); @@ -499,7 +595,8 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { dataSource, name, symbol, - assetSubClassString: translate(assetSubClass) + assetSubClassString: translate(assetSubClass), + mode: SearchMode.HOLDING as const }; } ); @@ -508,6 +605,37 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { ); } + private searchQuickLinks(aSearchTerm: string): ISearchResultItem[] { + const searchTerm = aSearchTerm.toLowerCase(); + + const allRoutes = Object.values(internalRoutes) + .filter(({ excludeFromAssistant }) => { + return !excludeFromAssistant; + }) + .reduce((acc, route) => { + acc.push(route); + if (route.subRoutes) { + acc.push(...Object.values(route.subRoutes)); + } + return acc; + }, [] as IRoute[]); + + return allRoutes + .filter(({ title }) => { + return title.toLowerCase().includes(searchTerm); + }) + .map(({ routerLink, title }) => { + return { + routerLink, + mode: SearchMode.QUICK_LINK as const, + name: title + }; + }) + .sort((a, b) => { + return a.name.localeCompare(b.name); + }); + } + private setFilterFormValues() { const dataSource = this.user?.settings?.[ 'filters.dataSource' diff --git a/libs/ui/src/lib/assistant/assistant.html b/libs/ui/src/lib/assistant/assistant.html index a0e19674a..eac14fdd5 100644 --- a/libs/ui/src/lib/assistant/assistant.html +++ b/libs/ui/src/lib/assistant/assistant.html @@ -37,19 +37,41 @@ }
+
+
Quick Links
+ + + @if (isLoading.quickLinks) { + + } + +
Holdings
- @if (isLoading) { + @if (isLoading.holdings) { Asset Profiles
- @if (isLoading) { + @if (isLoading.assetProfiles) {