diff --git a/CHANGELOG.md b/CHANGELOG.md index 137c2910ab..8d87e1535b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,9 +11,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Extended the content of the _General_ section by information about the import of activities from _Interactive Brokers_ on the Frequently Asked Questions (FAQ) page +### Changed + +- Improved the _Storybook_ stories of the account selector, accounts table, activities table and holdings table components +- Improved the language localization for Spanish (`es`) + ### Fixed -- Fixed the missing list numbers in the top and bottom holdings of the analysis page in Safari +- Fixed the missing list numbers in the top and bottom holdings on the analysis page in Safari +- Fixed the missing first data point in the portfolio evolution chart on the analysis page +- Fixed the missing mapping for Korea in the country weightings of the _Financial Modeling Prep_ service ## 3.81.0 - 2026-10-07 diff --git a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts index d3b72ab349..e6ad639b84 100644 --- a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts +++ b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts @@ -58,6 +58,7 @@ export class FinancialModelingPrepService 'Congo (Dem. Rep. of the)': 'CD', 'Congo (Rep. of)': 'CG', 'Czech Republic': 'CZ', + Korea: 'KR', 'Korea (the Republic of)': 'KR', Macau: 'MO', 'Russian Federation': 'RU', diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts index 5629965006..62debb78a5 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -329,36 +329,30 @@ export class GfAnalysisPageComponent implements OnInit { this.performanceDataItems = []; this.performanceDataItemsInPercentage = []; - for (const [ - index, - { - date, - dividendInPercentageWithCurrencyEffect, - netPerformanceInPercentageWithCurrencyEffect, - totalInvestmentValueWithCurrencyEffect, - valueInPercentage, - valueWithCurrencyEffect + for (const { + date, + dividendInPercentageWithCurrencyEffect, + netPerformanceInPercentageWithCurrencyEffect, + totalInvestmentValueWithCurrencyEffect, + valueInPercentage, + valueWithCurrencyEffect + } of chart ?? []) { + if (totalInvestmentValueWithCurrencyEffect !== undefined) { + this.investments.push({ + date, + investment: totalInvestmentValueWithCurrencyEffect + }); } - ] of (chart ?? []).entries()) { - // Ignore first item where value is 0 - if (index > 0 || this.user?.settings?.dateRange === 'max') { - if (totalInvestmentValueWithCurrencyEffect !== undefined) { - this.investments.push({ - date, - investment: totalInvestmentValueWithCurrencyEffect - }); - } - const value = isNumber(valueWithCurrencyEffect) - ? valueWithCurrencyEffect - : valueInPercentage; + const value = isNumber(valueWithCurrencyEffect) + ? valueWithCurrencyEffect + : valueInPercentage; - if (isNumber(value)) { - this.performanceDataItems.push({ - date, - value - }); - } + if (isNumber(value)) { + this.performanceDataItems.push({ + date, + value + }); } if (isNumber(netPerformanceInPercentageWithCurrencyEffect)) { diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index b38233ad0f..fd6f7b98d4 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -100,7 +100,7 @@ Any person who has the link can view the data. - Any person who has the link can view the data. + Cualquier persona que tenga el enlace puede ver los datos. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 42 @@ -388,7 +388,7 @@ View and manage - View and manage + Ver y administrar libs/ui/src/lib/access-level-icon/access-level-icon.component.html 9 @@ -648,7 +648,7 @@ Explore our guides to help you get started with investing and managing your finances. - Explore our guides to help you get started with investing and managing your finances. + Explora nuestras guías para ayudarte a empezar a invertir y gestionar tus finanzas. apps/client/src/app/pages/resources/overview/resources-overview.component.ts 21 @@ -892,7 +892,7 @@ Last Used - Last Used + Último uso apps/client/src/app/components/access-table/access-table.component.html 31 @@ -900,7 +900,7 @@ An error occurred while merging this asset profile into (). - An error occurred while merging this asset profile into (). + Se produjo un error al fusionar este perfil de activo en (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 946 @@ -944,7 +944,7 @@ Find quick answers to commonly asked questions about Ghostfolio in our Frequently Asked Questions (FAQ) section. - Find quick answers to commonly asked questions about Ghostfolio in our Frequently Asked Questions (FAQ) section. + Encuentra respuestas rápidas a las preguntas más frecuentes sobre Ghostfolio en nuestra sección de preguntas frecuentes (FAQ). apps/client/src/app/pages/resources/overview/resources-overview.component.ts 16 @@ -2188,7 +2188,7 @@ Restricted view and manage - Restricted view and manage + Vista restringida y administración libs/ui/src/lib/access-level-icon/access-level-icon.component.html 5 @@ -2744,7 +2744,7 @@ By , this is projected to increase to per year or per month, assuming a annual interest rate. - Para , se prevé que esto aumente a por año o por mes, asumiendo una tasa de interés anual del . + Para , se prevé que esto aumente a por año o por mes, asumiendo una tasa de interés anual del . apps/client/src/app/pages/portfolio/fire/fire-page.html 144 @@ -3032,7 +3032,7 @@ Next - Next + Siguiente apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 406 @@ -3160,7 +3160,7 @@ Export - Exportar + Exportar libs/ui/src/lib/activities-table/activities-table.component.html 72 @@ -3304,7 +3304,7 @@ Find quick answers to commonly asked questions about self-hosting Ghostfolio in our Frequently Asked Questions (FAQ) section. - Find quick answers to commonly asked questions about self-hosting Ghostfolio in our Frequently Asked Questions (FAQ) section. + Encuentra respuestas rápidas a las preguntas más frecuentes sobre el autoalojamiento de Ghostfolio en nuestra sección de preguntas frecuentes (FAQ). apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html 8 @@ -3328,7 +3328,7 @@ If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a safe withdrawal rate (SWR) of - Si te jubilas hoy, podrías retirar por año o por mes, basado en tus activos totales de y una tasa de retiro segura (SWR) de + Si te jubilas hoy, podrías retirar por año o por mes, basado en tus activos totales de y una tasa de retiro segura (SWR) de apps/client/src/app/pages/portfolio/fire/fire-page.html 69 @@ -3404,7 +3404,7 @@ Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section. - Find quick answers to commonly asked questions about the fully managed Ghostfolio cloud offering in our Frequently Asked Questions (FAQ) section. + Encuentra respuestas rápidas a las preguntas más frecuentes sobre la oferta de Ghostfolio en la nube totalmente gestionada en nuestra sección de preguntas frecuentes (FAQ). apps/client/src/app/pages/faq/saas/saas-page.html 8 @@ -3484,7 +3484,7 @@ Add your first activity - Add your first activity + Añade tu primera operación libs/ui/src/lib/no-activities-info/no-activities-info.component.html 12 @@ -3584,7 +3584,7 @@ This action cannot be undone. - This action cannot be undone. + Esta acción no se puede deshacer. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 965 @@ -4108,7 +4108,7 @@ Add to Watchlist - Add to Watchlist + Añadir a la lista de seguimiento libs/common/src/lib/routes/routes.ts 163 @@ -4132,7 +4132,7 @@ This asset profile cannot be merged into (). - This asset profile cannot be merged into (). + Este perfil de activo no se puede fusionar en (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 924 @@ -4184,7 +4184,7 @@ Do you really want to remove this received access? - Do you really want to remove this received access? + ¿Seguro que quieres eliminar este acceso recibido? apps/client/src/app/components/access-table/access-table.component.ts 152 @@ -4216,7 +4216,7 @@ The data of this asset profile is moved to () and this asset profile is deleted. - The data of this asset profile is moved to () and this asset profile is deleted. + Los datos de este perfil de activo se trasladan a () y este perfil de activo se elimina. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 963 @@ -4308,7 +4308,7 @@ thereof Dividend Performance - thereof Dividend Performance + del cual, rendimiento de dividendos apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 178 @@ -4696,7 +4696,7 @@ Financial Advisor - Financial Advisor + Asesor financiero libs/ui/src/lib/i18n.ts 110 @@ -5384,7 +5384,7 @@ Learn key financial terms and concepts in our comprehensive glossary. - Learn key financial terms and concepts in our comprehensive glossary. + Aprende términos y conceptos financieros clave en nuestro completo glosario. apps/client/src/app/pages/resources/overview/resources-overview.component.ts 31 @@ -5829,7 +5829,7 @@ Expiration Date - Expiration Date + Fecha de caducidad apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 54 @@ -5926,7 +5926,7 @@ Do you really want to merge this asset profile into it? - Do you really want to merge this asset profile into it? + ¿Seguro que quieres fusionar este perfil de activo en él? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 969 @@ -6194,7 +6194,7 @@ Alternative Investment - Alternative Investment + Inversión alternativa libs/ui/src/lib/i18n.ts 52 @@ -6202,7 +6202,7 @@ Commodity - Commodity + Materia prima libs/ui/src/lib/i18n.ts 53 @@ -6210,7 +6210,7 @@ Equity - Equity + Renta variable libs/ui/src/lib/i18n.ts 54 @@ -6218,7 +6218,7 @@ Fixed Income - Fixed Income + Renta fija libs/ui/src/lib/i18n.ts 55 @@ -6226,7 +6226,7 @@ Liquidity - Liquidity + Liquidez libs/ui/src/lib/i18n.ts 56 @@ -6234,7 +6234,7 @@ Real Estate - Real Estate + Inmobiliario libs/ui/src/lib/i18n.ts 57 @@ -6242,7 +6242,7 @@ Bond - Bond + Bono libs/ui/src/lib/i18n.ts 60 @@ -6250,7 +6250,7 @@ Cash - Cash + Efectivo libs/ui/src/lib/i18n.ts 61 @@ -6258,7 +6258,7 @@ Collectible - Collectible + Objeto de colección libs/ui/src/lib/i18n.ts 62 @@ -6266,7 +6266,7 @@ Commodity - Commodity + Materia prima apps/client/src/app/pages/i18n/i18n-page.html 5 @@ -6274,7 +6274,7 @@ Cryptocurrency - Cryptocurrency + Criptomoneda libs/ui/src/lib/i18n.ts 63 @@ -6282,7 +6282,7 @@ ETF - ETF + ETF libs/ui/src/lib/i18n.ts 64 @@ -6290,7 +6290,7 @@ Loan - Loan + Préstamo libs/ui/src/lib/i18n.ts 65 @@ -6298,7 +6298,7 @@ Mutual Fund - Mutual Fund + Fondo de inversión libs/ui/src/lib/i18n.ts 66 @@ -6306,7 +6306,7 @@ Precious Metal - Precious Metal + Metal precioso libs/ui/src/lib/i18n.ts 67 @@ -6314,7 +6314,7 @@ Private Equity - Private Equity + Capital privado libs/ui/src/lib/i18n.ts 68 @@ -6322,7 +6322,7 @@ Stock - Stock + Acción libs/ui/src/lib/i18n.ts 69 @@ -6666,7 +6666,7 @@ Expires () - Caduca () + Caduca () apps/client/src/app/components/admin-users/admin-users.html 34 @@ -6690,7 +6690,7 @@ Date must be in the future. - Date must be in the future. + La fecha debe estar en el futuro. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 70 @@ -7071,7 +7071,7 @@ Previous - Previous + Anterior apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 396 @@ -7243,7 +7243,7 @@ Find quick answers to commonly asked questions about Ghostfolio in our Frequently Asked Questions (FAQ) section. Discover what Ghostfolio is, explore its features, and learn about our privacy practices. Get all the information you need in one place. - Find quick answers to commonly asked questions about Ghostfolio in our Frequently Asked Questions (FAQ) section. Discover what Ghostfolio is, explore its features, and learn about our privacy practices. Get all the information you need in one place. + Encuentra respuestas rápidas a las preguntas más frecuentes sobre Ghostfolio en nuestra sección de preguntas frecuentes (FAQ). Descubre qué es Ghostfolio, explora sus funciones y conoce nuestras prácticas de privacidad. Obtén toda la información que necesitas en un solo lugar. apps/client/src/app/pages/faq/overview/faq-overview-page.html 8 @@ -7395,7 +7395,7 @@ thereof Dividend - thereof Dividend + de los cuales, dividendos apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 102 @@ -7937,7 +7937,7 @@ Access various market resources and tools to stay informed about financial markets. - Access various market resources and tools to stay informed about financial markets. + Accede a diversos recursos y herramientas del mercado para mantenerte informado sobre los mercados financieros. apps/client/src/app/pages/resources/overview/resources-overview.component.ts 26 @@ -8217,7 +8217,7 @@ Oops! Could not remove the received access. - Oops! Could not remove the received access. + ¡Vaya! No se pudo eliminar el acceso recibido. apps/client/src/app/components/user-account-access/user-account-access.component.ts 156 @@ -8301,7 +8301,7 @@ Additional requests are granted while you are setting up your instance - Additional requests are granted while you are setting up your instance + Se conceden solicitudes adicionales mientras configuras tu instancia apps/client/src/app/components/admin-settings/admin-settings.component.ts 88 @@ -8402,7 +8402,7 @@ () is already in use. - () ya está en uso. + () ya está en uso. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 967 @@ -8833,7 +8833,7 @@ new - new + nuevo apps/client/src/app/pages/features/features-page.html 223 @@ -9154,7 +9154,7 @@ Return on Average Investment (total return with dividends) - Return on Average Investment (total return with dividends) + Rentabilidad sobre la inversión media (rentabilidad total con dividendos) apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 159 @@ -9466,7 +9466,7 @@ Oops! Could not revoke the granted access. - Oops! Could not revoke the granted access. + ¡Vaya! No se pudo revocar el acceso concedido. apps/client/src/app/components/user-account-access/user-account-access.component.ts 135 diff --git a/libs/common/src/lib/personal-finance-tools.ts b/libs/common/src/lib/personal-finance-tools.ts index 9f891d3818..e610730472 100644 --- a/libs/common/src/lib/personal-finance-tools.ts +++ b/libs/common/src/lib/personal-finance-tools.ts @@ -794,6 +794,28 @@ export const personalFinanceTools: Product[] = ( updatedAt: '2026-09-23', url: 'https://www.comarch.com/finance/banking/comarch-wealth-management' }, + { + categories: [ + 'BUDGETING', + 'CRYPTOCURRENCY', + 'DIVIDEND_TRACKING', + 'ETF_TRACKING', + 'NET_WORTH_TRACKING', + 'STOCK_TRACKING' + ], + founded: 2019, + hasFreePlan: true, + key: 'compiledsanity-personal-finance', + languages: ['English'], + name: 'CompiledSanity Personal Finance', + note: 'License is a perpetual license', + origin: 'AU', + platforms: ['WEB'], + pricingPerYear: 'AUD 12', + slogan: 'Understand Your Money. Grow Your Wealth.', + updatedAt: '2026-10-08', + url: 'https://cspersonalfinance.io' + }, { categories: ['WEALTH_MANAGEMENT'], founded: 2019, @@ -1458,6 +1480,26 @@ export const personalFinanceTools: Product[] = ( updatedAt: '2026-07-05', url: 'https://finateka.com' }, + { + categories: [ + 'BUDGETING', + 'CRYPTOCURRENCY', + 'DIVIDEND_TRACKING', + 'NET_WORTH_TRACKING', + 'STOCK_TRACKING' + ], + hasFreePlan: true, + hasSelfHostingAbility: false, + key: 'finboard', + languages: ['Deutsch', 'English', 'Español'], + name: 'FinBoard', + origin: 'ES', + platforms: ['WEB'], + pricingPerYear: '€49.90', + slogan: 'Your Personal Finance Dashboard', + updatedAt: '2026-10-08', + url: 'https://finboard.me' + }, { categories: ['NET_WORTH_TRACKING', 'STOCK_TRACKING'], founded: 2022, @@ -2576,6 +2618,33 @@ export const personalFinanceTools: Product[] = ( updatedAt: '2026-09-02', url: 'https://neontra.com' }, + { + categories: [ + 'BUDGETING', + 'CRYPTOCURRENCY', + 'ETF_TRACKING', + 'NET_WORTH_TRACKING', + 'STOCK_TRACKING' + ], + hasFreePlan: true, + hasSelfHostingAbility: false, + key: 'neto', + languages: [ + 'Deutsch', + 'English', + 'Español', + 'Français', + 'Italiano', + 'Português' + ], + name: 'Neto', + origin: 'ES', + platforms: ['ANDROID', 'IOS'], + pricingPerYear: '€49.99', + slogan: 'Tus gastos, tus ahorros y tu patrimonio en una sola app', + updatedAt: '2026-10-08', + url: 'https://netoapp.es' + }, { categories: ['INVESTMENT_RESEARCH', 'STOCK_TRACKING'], hasFreePlan: true, @@ -2672,6 +2741,27 @@ export const personalFinanceTools: Product[] = ( updatedAt: '2026-09-23', url: 'https://orion.com/advisor-tech/risk-intelligence' }, + { + categories: [ + 'CRYPTOCURRENCY', + 'ETF_TRACKING', + 'FAMILY_OFFICE', + 'NET_WORTH_TRACKING', + 'STOCK_TRACKING', + 'WEALTH_MANAGEMENT' + ], + hasFreePlan: false, + hasSelfHostingAbility: false, + key: 'ormax', + languages: ['English'], + name: 'Ormax', + origin: 'CY', + platforms: ['WEB'], + pricingPerYear: '$240', + slogan: 'AI Wealth Management', + updatedAt: '2026-10-08', + url: 'https://ormax.ai' + }, { categories: [ 'CRYPTOCURRENCY', diff --git a/libs/ui/src/lib/account-selector/account-selector.component.stories.ts b/libs/ui/src/lib/account-selector/account-selector.component.stories.ts index d974145aae..619754b830 100644 --- a/libs/ui/src/lib/account-selector/account-selector.component.stories.ts +++ b/libs/ui/src/lib/account-selector/account-selector.component.stories.ts @@ -24,7 +24,7 @@ const ACCOUNTS: AccountWithPlatform[] = [ platform: { id: '9da3a8a7-4795-43e3-a6db-ccb914189737', name: 'Coinbase', - url: 'https://coinbase.com' + url: 'https://www.coinbase.com' }, platformId: '9da3a8a7-4795-43e3-a6db-ccb914189737', updatedAt: new Date('2024-01-01'), @@ -33,13 +33,28 @@ const ACCOUNTS: AccountWithPlatform[] = [ { comment: null, createdAt: new Date('2024-01-01'), - currency: 'CHF', + currency: 'USD', + id: 'd191b2d5-9d5a-4c5f-9d55-6f0e5f6a7b8c', + name: 'Private Banking Account', + platform: { + id: '43e8fcd1-5b79-4100-b678-d2229bd1660d', + name: 'J.P. Morgan', + url: 'https://www.jpmorgan.com' + }, + platformId: '43e8fcd1-5b79-4100-b678-d2229bd1660d', + updatedAt: new Date('2024-01-01'), + userId: '081aa387-487d-4438-83a4-3060eb2a016e' + }, + { + comment: null, + createdAt: new Date('2024-01-01'), + currency: 'USD', id: '9da3a8a7-4795-43e3-a6db-ccb914189737', - name: 'Ghostfolio Account', + name: 'Trading Account', platform: { id: 'f3e9d0e5-1e0f-4a3c-8b12-1f2a3b4c5d6e', - name: 'Ghostfolio', - url: 'https://ghostfol.io' + name: 'Interactive Brokers', + url: 'https://interactivebrokers.com' }, platformId: 'f3e9d0e5-1e0f-4a3c-8b12-1f2a3b4c5d6e', updatedAt: new Date('2024-01-01'), @@ -49,7 +64,7 @@ const ACCOUNTS: AccountWithPlatform[] = [ comment: null, createdAt: new Date('2024-01-01'), currency: 'EUR', - id: 'd191b2d5-9d5a-4c5f-9d55-6f0e5f6a7b8c', + id: '267ec888-cb57-45d0-8085-938017417a2e', name: 'Savings Account', platformId: null, updatedAt: new Date('2024-01-01'), diff --git a/libs/ui/src/lib/accounts-table/accounts-table.component.stories.ts b/libs/ui/src/lib/accounts-table/accounts-table.component.stories.ts index 8eed29b576..eab3d14a14 100644 --- a/libs/ui/src/lib/accounts-table/accounts-table.component.stories.ts +++ b/libs/ui/src/lib/accounts-table/accounts-table.component.stories.ts @@ -12,6 +12,8 @@ import type { Meta, StoryObj } from '@storybook/angular'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { GfEntityLogoComponent } from '../entity-logo'; +import { EntityLogoImageSourceService } from '../entity-logo/entity-logo-image-source.service'; +import { EntityLogoImageSourceServiceMock } from '../mocks/entity-logo-image-source.service.mock'; import { NotificationService } from '../notifications'; import { GfValueComponent } from '../value'; import { GfAccountsTableComponent } from './accounts-table.component'; @@ -108,7 +110,13 @@ export default { NgxSkeletonLoaderModule, RouterModule.forChild([]) ], - providers: [NotificationService] + providers: [ + NotificationService, + { + provide: EntityLogoImageSourceService, + useValue: new EntityLogoImageSourceServiceMock() + } + ] }) ] } as Meta; diff --git a/libs/ui/src/lib/activities-table/activities-table.component.stories.ts b/libs/ui/src/lib/activities-table/activities-table.component.stories.ts index b83555be18..b78b23357f 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.stories.ts +++ b/libs/ui/src/lib/activities-table/activities-table.component.stories.ts @@ -16,6 +16,8 @@ import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { GfActivityTypeComponent } from '../activity-type/activity-type.component'; import { GfEntityLogoComponent } from '../entity-logo'; +import { EntityLogoImageSourceService } from '../entity-logo/entity-logo-image-source.service'; +import { EntityLogoImageSourceServiceMock } from '../mocks/entity-logo-image-source.service.mock'; import { GfNoActivitiesInfoComponent } from '../no-activities-info/no-activities-info.component'; import { NotificationService } from '../notifications'; import { GfValueComponent } from '../value'; @@ -371,7 +373,13 @@ export default { NgxSkeletonLoaderModule, RouterModule.forChild([]) ], - providers: [NotificationService] + providers: [ + NotificationService, + { + provide: EntityLogoImageSourceService, + useValue: new EntityLogoImageSourceServiceMock() + } + ] }) ] } as Meta; diff --git a/libs/ui/src/lib/entity-logo/entity-logo-image-source.service.ts b/libs/ui/src/lib/entity-logo/entity-logo-image-source.service.ts index dc937e6b9b..32a3a18af7 100644 --- a/libs/ui/src/lib/entity-logo/entity-logo-image-source.service.ts +++ b/libs/ui/src/lib/entity-logo/entity-logo-image-source.service.ts @@ -2,8 +2,9 @@ import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { Service } from '@angular/core'; -// Must stay auto-provided: several table stories render gf-entity-logo -// without providing an override and resolve this from the root injector +// Must stay auto-provided: the currency selector and portfolio filter form +// stories render gf-entity-logo without providing an override and resolve +// this from the root injector @Service() export class EntityLogoImageSourceService { public getLogoUrlByAssetProfileIdentifier({ diff --git a/libs/ui/src/lib/mocks/entity-logo-image-source.service.mock.ts b/libs/ui/src/lib/mocks/entity-logo-image-source.service.mock.ts index 4160485bce..45e7fda0dd 100644 --- a/libs/ui/src/lib/mocks/entity-logo-image-source.service.mock.ts +++ b/libs/ui/src/lib/mocks/entity-logo-image-source.service.mock.ts @@ -1,3 +1,4 @@ +import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { DataSource } from '@ghostfolio/prisma/enums'; @@ -9,18 +10,47 @@ export class EntityLogoImageSourceServiceMock { dataSource, symbol }: AssetProfileIdentifier) { - if (dataSource === DataSource.YAHOO && symbol === 'AAPL') { - return 'data:image/png;base64,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'; + switch (getAssetProfileIdentifier({ dataSource, symbol })) { + case getAssetProfileIdentifier({ + dataSource: DataSource.YAHOO, + symbol: 'AAPL' + }): + return 'data:image/png;base64,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'; + case getAssetProfileIdentifier({ + dataSource: DataSource.YAHOO, + symbol: 'BNDW' + }): + case getAssetProfileIdentifier({ + dataSource: DataSource.YAHOO, + symbol: 'VT' + }): + case getAssetProfileIdentifier({ + dataSource: DataSource.YAHOO, + symbol: 'VTI' + }): + return 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBwgHBgkIBwgKCgkLDRYPDQwMDRsUFRAWIB0iIiAdHx8kKDQsJCYxJx8fLT0tMTU3Ojo6Iys/RD84QzQ5OjcBCgoKDQwNGg8PGjclHyU3Nzc3Nzc3Nzc3Nzc3Nzc3Njc3Nzc3Nzc4NzU3Nzc3MDU1NTc1NTE3Ny0rMC0tLTctLf/AABEIACAAIAMBEQACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAEBwMFBgD/xAArEAACAQQAAggHAAAAAAAAAAABAgMABAURElEGBxMhQWFxgSIxMoKRkqH/xAAaAQACAwEBAAAAAAAAAAAAAAABAwIEBgAF/8QAKBEAAgICAAQEBwAAAAAAAAAAAQIAEQMEBTFBwRIhQnEGEyOhsdHh/9oADAMBAAIRAxEAPwB1XdzHaW8lxOWEcalmKoWIA8gCTQupJELsFXmZT4jpjgMxerZY7ICa4YEqnZOuwBs97KBURkVjQMt5+G7WunjyLQ9x2MNzWax+Dt1uMpM0MLNwhxE7jfnwg6oswXnE6+rl2W8OIWfcD8wmwvbfI2cV5ZuXgmXijYqV2Oej30QbFiLy4mxOUfyIhFGQiAyCN0N6wC0YKxW1yJEA8Ym79fqSKon6bzd4iN/Qo8yPuP7Nz1qXDZOXCdH7NwWvpxIxHgv0qfT4mP207MbpR1nicFQYRl2X9Ir9xg2tvHa20NvAvDFCgRF5KBoD8U8Cp4LuXYs3MyajIxWddOFZ47TNQxk9mOwnIHyG9qT7kj3FVthes03w9sgFsBPPzHeBdVqXOd6SLkb08aYqzWCI8joqv846GG2az0juMlNbW+UnrN9z2jgq1MnOrp0imijnieKaNZI3GmR1BDDkRXQqxU2poiB4rDY7ELMuMtI7ZZn43Cb0TrXt6DuoKoXlHZ9nLno5WupY0Yif/9k='; + case getAssetProfileIdentifier({ + dataSource: DataSource.YAHOO, + symbol: 'IBIT' + }): + return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAbklEQVRYhe3UsQ2AMAwEwA8iksdhgzASozASbMA4llKEhtbFS0Ru/lsr9ilRXMYYYFLNLgAtKN/dfWf6LdT0CRFAgML+gr+TfgMre6CanQC2oPx092Mq4BseLSI66U8ggAACCCCAAAIIIIAA6YAXmvMQrFvWq40AAAAASUVORK5CYII='; + default: + return UNAVAILABLE_LOGO_URL; } - - return UNAVAILABLE_LOGO_URL; } public getLogoUrlByUrl(url: string) { - if (url === 'https://ghostfol.io') { - return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAP1BMVEU2z8v////x/Pspzcn0/Px73drR8/KC3tz6/v6e5eOl5+WM4d7n+PhI08/i9/eu6edV1dJk2NVx2teV4+G87evvttLSAAABDElEQVRYhe2V3Y6EIAyFrQXlTwHd93/WpeBsdiKbtF7tJJwbCKFfDlKO0zQ0NPQJwqrn1ZO2zlk9PWPgusClRcsJmHb4pWUTItDDu4zMBJ5w0yog4HGvB0gCgOoBZrYFdL16AMsmmD5AcQ3ofj3AwbOAX38BIhMw02ZjtQ+tLnht66mCAGA2eka1G3eabUZwD/PLbeuHenKMBODVV0Dru/TTQLgKAc1BvQ/9yAEkOnlon66oehEBIHp7dbSyPoIc0NEADMDnAa4wAvVK+CADRGx/VpNSi+iF3jMTUH4rJQ0aISPmVk+JoJiZeJw1QnaqL2OmWKSFkxnrZWsbXK4TzO5tmS+8TYaGhv6xvgEEfAgHGc7HRgAAAABJRU5ErkJggg=='; + switch (url) { + case 'https://ghostfol.io': + return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAP1BMVEU2z8v////x/Pspzcn0/Px73drR8/KC3tz6/v6e5eOl5+WM4d7n+PhI08/i9/eu6edV1dJk2NVx2teV4+G87evvttLSAAABDElEQVRYhe2V3Y6EIAyFrQXlTwHd93/WpeBsdiKbtF7tJJwbCKFfDlKO0zQ0NPQJwqrn1ZO2zlk9PWPgusClRcsJmHb4pWUTItDDu4zMBJ5w0yog4HGvB0gCgOoBZrYFdL16AMsmmD5AcQ3ofj3AwbOAX38BIhMw02ZjtQ+tLnht66mCAGA2eka1G3eabUZwD/PLbeuHenKMBODVV0Dru/TTQLgKAc1BvQ/9yAEkOnlon66oehEBIHp7dbSyPoIc0NEADMDnAa4wAvVK+CADRGx/VpNSi+iF3jMTUH4rJQ0aISPmVk+JoJiZeJw1QnaqL2OmWKSFkxnrZWsbXK4TzO5tmS+8TYaGhv6xvgEEfAgHGc7HRgAAAABJRU5ErkJggg=='; + case 'https://interactivebrokers.com': + return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAkFBMVEXZICceHh4dHR0fHx8gICAUFBQTExMZGRkhISEaGhoVFRUYGBgSEhIXFxcWFhYcHBwbGxsiIiIRERG5HyTiICiyHyPEHyWtHiO/HyUvGxzOICYAFBMVGRkKFhYAGRgQFRVdGRtxHR+JHiGDHiI/HB2UHyJYGhxmGBolGxtIGxw2GxulHyN4HSCcHSIPHBxRHB764qjxAAADtUlEQVRYhYWXbZeiOBCFa5zpYW1X6W0gvBhAFBQV8f//u00RSFIh0HX6S3vOfby3kpQJ/Kfrn7H+DPUb6xfWBsvH+sLaivKwdqL28LNeA+Z6E+DQuwxsJ4DUrwOIvk2JgVGvAUsGNiNgU7UuAwrwU4DiXPUu/QSg+nmAosp8p34ErOs3fn+HSzFfAVEHAvizEKC/Z2HhNHCQgB8C8DoIm8IZgAIWAvDHE6DmzgASsL4CPG0gfPoLBhCwrv/aXDKAE1/QG4CFBvKb0McPvnUGQMCqAVwAAOgsA3tl4BN+aECP+uDOFwJ8KoCp12eA+0zo4Sz11MCBANxbiLcx6pNrv2iAAmb6BvXwWlqBTwVwbiG/xQUEyKp+McAImOmlgWrQQ9RyMgWJ3gTY+uvQQMi6YrYDNOADFhtQJ4MeWDozcNAGbIAy4PuR1MO5mAXYaz0CnPo+DqU+ww54Cx34QIA7wHnUh6+5ASOABVAGeAdTPfhaAAFwjfF+XEBRcWFvIf39BoAG6E9s0oe4i1cCEIDSvwMVIBAtdAwBrZcAEqCvY6UPK74e4OMv2Ab88QQNldRogPO8KHLuCvB3ANAVnBYQDVzE93Pe3qtLd033pUOPAKL3U60H9u493p6iECvrHuUsAAJ+LwOalvPdWf0b1+VMPwH0EDAA2a33Cr2lxGRBD8YKDAD7EBuAOOV8mxkAuJW23gTInwENyLre629GInEw0pIGGAHm74gGBCn3itg0AOxeWgY0YLxJGICm8LyCEQC8c8vAv0ACmAD24AJAWgDhADD1CCB3MQ14CQNeERFAhhE+XAB1F9QA0ULPO3ZmE+H5KC0DAvBrAfB8596Ot8RBZ3+/AFiXUQVIotc73+2KS0gNOAHGZVYBoih43fMdNw5n8J7rNWC8DE+ARACCV53vedqxUHwWQlNTvQZsHIAIAUHTlnu+T0/N81XVh0lvGlCA6TY+ApgEJOdWzJEyP4oqP+cdlABymx8BgQQE7CImkTUFiV4A6HNCAlg8AhJWcXuMEsA3WO8ZCQgUIGG3fM2AAZDPiQHAIgMQ3I4regkw3kMDIIkNAItOR3sIqAASYL6HEJBFBMDi69GtNwFfBoDFFJDFde5s4LcEkAedAKABCsBD4GzAAPBtABogAEEQw9DVAAXQDzoBCOaADJqydAUQAOtFytPs6QBkcN7PG0gA2wkw7MJRnQxiORfPucvAACAPyu3pKusk63YTf1in0qVHwBcB7PJ54WE85q4ACrBym7anKNV//w9w4apH/GbnrAAAAABJRU5ErkJggg=='; + case 'https://www.coinbase.com': + return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAclBMVEVHcEz////////////////////////9/v////////////////////////////////////////////////8AUv8AUP8ATP/4+/8ARv9sjv8laP/F1f8KWv+rwf9Mgf/u9f/R3v/h6f80c/91nv+8zf+Pq/9HDuvmAAAAE3RSTlMAxpwd5o4v/gZyD0axz8tb2NVC3+ryxwAAA01JREFUWIWlV2uXgiAQ1cxIa2tLQFTEZ///L64C0qBonvZ+6RybGWCedzzPiXMcXKKrf0RJgo63Q3QJ4rNb0ongEv4kI1Bi8BM+g53qp+iauID86LRHPfx1qks8wviT/v24rj7iGG0f71t3TjUQ/Oivv+McvY9Pm6bsRMsx5rnoyqZJwSVWAnIOzSlV/2oJo5SSEZQyLF59Zf4OnRbOh0mgKjM86GIAQhnPSmPi4LDw1i8Et7UnGzwrpjssLRj9tHOqSxMEZ+nKHcz7G85W1CVYXmvBmR8ifbUipxvqA2he6KBaCXFS8UP9J/3hHXkvLaAjzAedPx/P13dQ0v7iAXW+9Xxwh0bJ3yf9WD0g3XO+vANXsTCP0BHI2PIwicVn1ulIaA8+lAPwTHLIPpIPwGyeGIQrN/yegAeqbCZFqSiLekBRCjx7HBXVO5SBCkHJ7eRnoq7QVFuFsNOL8FL+cx273BNJmYy6JEwBzuzTTF3hYpK4twRIWyQzFFaMiU6GIaFj2X/TFwwB4fVcf34EfclQ/sReoGpIwBewcqk/eAmeQYXKpsC7KAMw2lS49FHagkMIbrQTooV1ghcOUKhhPrBefos82UhQR+EFKreBSoxtUoN1MshX7yZ9CF3ASuQ2gPoM4CWlfE8WUmrFaOUFYFC8h8XRk78pCBHJHTFcBfLkT4q/NZD838C/n6CcCHJkNQ1GOQj55aj66b4wpo4w3jzJRr5PpIMrlemKE3pYTbrgov3FlCS5s5gCeZOm/bqcY1UML2hg6roWCquhMNNQppaG7Za2cEPfWk2Rm5amnfChqc6btm6q6Dm29atTgoni3dbrlbbuB2CwiPnwwO/BQmf/kQwMFu+kqKlrtOHt0fY4WcO1+3a4Tvwk5XvHe6sLyRDnuzLY7CMIpt4BS/qG4iBAcQDJ+khyJpKVWCTrC5qHbN5viGadbxFNwrgmWHOiCahuhh2BU+qUd2tU1yLb2RrZFqZIXXTdg3Sfszndp/gD3YcLRzIsHGLI4GnfGHK6BQvH4v3GwmLlyceVp9Urz9SrV1ceb9fSlWwsXSOiT2vffVN9QBw+1tV/w127a+S7R9N11+o7Injq5Rv4ww8ve5fvEXL9P9zU+u9fN9b/P6gEACs+iQ7UAAAAAElFTkSuQmCC'; + case 'https://www.jpmorgan.com': + return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAY1BMVEUkJSb///8hIiMvMDHd3d0AAACoqaknKCmzs7SioqIODxGlpaYZGxxub2+XmJiNjY0TFRY4ODk/QEDn5+fu7u7V1tb29vbBwcGCg4NTU1TP0NB4eXpdXV5kZGQDBwlqamtGR0icW6P1AAACGElEQVRYhe2Ua5qrIAyGDYpYGhFBxVqr7n+VJ/HWqT3zjAvw+yOE8BJDSBRdunTp0qX/SKx6j5bZNv/2PQCcK0nOxWoeOVYZC+QVNvzwF/Hs+Ml0iW8AGp88+9oDQOV91UBiHlh2vAJOvPcn7Hmzn38gpQG4SYkoLTm85BD3GUAyopT0BaM3V3zRNBt0dNQN4K63E3KMBNoCIMRCZRRCNWx+MjBAfafxCOCwGvAvVPfgV8u8DN1ZQCRrgNaq1NCh9RqzNlVxGqDJVjAgr6AaZ5MQjWlPA4awRmAplDCbbNvE5yNYc5AaSXuSfs5LF+xpwPBcbiE1WtFFGLJh75+nAKO2Wj4bqHpkgNUpQDeJSN+TCc8ATG5SD00a06kMoMujdKCY6sKKM4CQpmkxqoELmAERZvw72FImTgFGqbXFpf4XwEgh9CoEJU4BtrrbAcJR/aVT1dLwALBSir8BEacObp5e8QFgW6jnt00AdvwV8KiZQEccAUuVipiyNFfrNyAL/BQt3WTFbeETIBQBckrSlICfl5Es0Oq9gSB2gWf48hAkO6Rc1/sJXO9ZJF0GzZP3lz2/d99O2xkP01SG0dgBlVI0tXRAYx57CI42UAODkCtatiYkrC57LC21zOokqQvCYR40zzter7O9TQrlXmPel2putNQx41nlFsEyXbIh9vlqWQgCSVuf/mjpb8My/OkQXbp06dKlD/0Do0chlGcV4zUAAAAASUVORK5CYII='; + default: + return UNAVAILABLE_LOGO_URL; } - - return UNAVAILABLE_LOGO_URL; } }