diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c5a2771d..d7623113a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,10 +13,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Improved the style of the card components - Improved the style of the system message - Improved the language localization for German (`de`) +- Improved the language localization for Spanish (`es`) - Improved the language localization for Turkish (`tr`) - Improved the language localization for Ukrainian (`uk`) +- Upgraded the _Stripe_ dependencies +- Upgraded `ngx-stripe` from version `19.0.0` to `19.7.0` + +### Fixed + +- Fixed an exception with currencies in the historical market data editor of the admin control panel ## 2.165.0 - 2025-05-31 diff --git a/Dockerfile b/Dockerfile index 922b880e3..89121eee5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -38,14 +38,14 @@ RUN npm run build:production # Prepare the dist image with additional node_modules WORKDIR /ghostfolio/dist/apps/api # package.json was generated by the build process, however the original -# package-lock.json needs to be used to ensure the same versions +# package-lock.json needs to be used to ensure the same versions COPY ./package-lock.json /ghostfolio/dist/apps/api/package-lock.json RUN npm install COPY prisma /ghostfolio/dist/apps/api/prisma # Overwrite the generated package.json with the original one to ensure having -# all the scripts +# all the scripts COPY package.json /ghostfolio/dist/apps/api RUN npm run database:generate-typings diff --git a/apps/api/src/app/endpoints/market-data/market-data.controller.ts b/apps/api/src/app/endpoints/market-data/market-data.controller.ts index 933e70e9d..96fca1b3c 100644 --- a/apps/api/src/app/endpoints/market-data/market-data.controller.ts +++ b/apps/api/src/app/endpoints/market-data/market-data.controller.ts @@ -85,7 +85,7 @@ export class MarketDataController { { dataSource, symbol } ]); - if (!assetProfile) { + if (!assetProfile && !isCurrency(getCurrencyFromSymbol(symbol))) { throw new HttpException( getReasonPhrase(StatusCodes.NOT_FOUND), StatusCodes.NOT_FOUND @@ -103,7 +103,7 @@ export class MarketDataController { ); const canUpsertOwnAssetProfile = - assetProfile.userId === this.request.user.id && + assetProfile?.userId === this.request.user.id && hasPermission( this.request.user.permissions, permissions.createMarketDataOfOwnAssetProfile diff --git a/apps/api/src/app/info/info.service.ts b/apps/api/src/app/info/info.service.ts index 1f7b39d9b..9581807b9 100644 --- a/apps/api/src/app/info/info.service.ts +++ b/apps/api/src/app/info/info.service.ts @@ -11,7 +11,7 @@ import { HEADER_KEY_TOKEN, PROPERTY_BETTER_UPTIME_MONITOR_ID, PROPERTY_COUNTRIES_OF_SUBSCRIBERS, - PROPERTY_DEMO_USER_ID_LEGACY, + PROPERTY_DEMO_USER_ID, PROPERTY_IS_READ_ONLY_MODE, PROPERTY_SLACK_COMMUNITY_USERS, ghostfolioFearAndGreedIndexDataSource @@ -237,7 +237,7 @@ export class InfoService { private async getDemoAuthToken() { const demoUserId = (await this.propertyService.getByKey( - PROPERTY_DEMO_USER_ID_LEGACY + PROPERTY_DEMO_USER_ID )) as string; if (demoUserId) { diff --git a/apps/api/src/app/subscription/subscription.service.ts b/apps/api/src/app/subscription/subscription.service.ts index ee34ef52d..d233e475c 100644 --- a/apps/api/src/app/subscription/subscription.service.ts +++ b/apps/api/src/app/subscription/subscription.service.ts @@ -32,7 +32,7 @@ export class SubscriptionService { this.stripe = new Stripe( this.configurationService.get('STRIPE_SECRET_KEY'), { - apiVersion: '2024-09-30.acacia' + apiVersion: '2025-04-30.basil' } ); } diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 85a13ca73..21457ce5a 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -5269,7 +5269,7 @@ Are you looking for an open source alternative to ? Ghostfolio is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a wide range of functionalities to help you make informed decisions and take control of your financial future. - Are you looking for an open source alternative to ? Ghostfolio is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a wide range of functionalities to help you make informed decisions and take control of your financial future. + ¿Estás buscando una alternativa de código abierto a ? Ghostfolio es una potente herramienta de gestión de carteras que ofrece a los usuarios una plataforma integral para rastrear, analizar y optimizar sus inversiones. Ya seas un inversor con experiencia o estés comenzando, Ghostfolio ofrece una interfaz intuitiva y una amplia gama de funcionalidades para ayudarte a tomar decisiones informadas y tener el control de tu futuro financiero. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 18 @@ -5277,7 +5277,7 @@ Ghostfolio is an open source software (OSS), providing a cost-effective alternative to making it particularly suitable for individuals on a tight budget, such as those pursuing Financial Independence, Retire Early (FIRE). By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience. - Ghostfolio is an open source software (OSS), providing a cost-effective alternative to making it particularly suitable for individuals on a tight budget, such as those pursuing Financial Independence, Retire Early (FIRE). By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience. + Ghostfolio es un software de código abierto (OSS), que ofrece una alternativa rentable a lo que lo hace especialmente adecuado para personas con un presupuesto ajustado, como aquellas que buscan la Independencia Financiera y Jubilación Anticipada (FIRE). Al aprovechar los esfuerzos colectivos de una comunidad de desarrolladores y entusiastas de las finanzas personales, Ghostfolio mejora continuamente sus capacidades, seguridad y experiencia de usuario. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 32 @@ -5285,7 +5285,7 @@ Let’s dive deeper into the detailed Ghostfolio vs comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to . We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements. - Let’s dive deeper into the detailed Ghostfolio vs comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to . We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements. + Analicemos en detalle la tabla comparativa entre Ghostfolio y que encontrarás a continuación, para obtener una comprensión completa de cómo se posiciona Ghostfolio en relación con . Exploraremos diversos aspectos como funcionalidades, privacidad de los datos, precios y más, lo que te permitirá tomar una decisión bien fundamentada según tus necesidades personales. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 43 @@ -5302,7 +5302,7 @@ Please note that the information provided in the Ghostfolio vs comparison table is based on our independent research and analysis. This website is not affiliated with or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on GitHub. - Please note that the information provided in the Ghostfolio vs comparison table is based on our independent research and analysis. This website is not affiliated with or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on GitHub. + Ten en cuenta que la información proporcionada en la tabla comparativa entre Ghostfolio y se basa en nuestra investigación y análisis independientes. Este sitio web no está afiliado con ni con ningún otro producto mencionado en la comparación. Dado que el panorama de las herramientas de finanzas personales evoluciona constantemente, es fundamental verificar cualquier detalle específico o cambio directamente en la página oficial del producto correspondiente. ¿Los datos necesitan una actualización? Ayúdanos a mantener la información precisa en GitHub. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 311 @@ -5318,7 +5318,7 @@ Get Started - Get Started + Comenzar apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 333 @@ -5326,7 +5326,7 @@ Switzerland - Switzerland + Suiza apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 59 @@ -5338,7 +5338,7 @@ Global - Global + Global apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 60 @@ -5350,7 +5350,7 @@ (Last 24 hours) - (Last 24 hours) + (Últimas 24 horas) apps/client/src/app/pages/open/open-page.html 37 @@ -5358,7 +5358,7 @@ (Last 30 days) - (Last 30 days) + (Últimos 30 días) apps/client/src/app/pages/open/open-page.html 48 @@ -5370,7 +5370,7 @@ (Last 90 days) - (Last 90 days) + (Últimos 90 días) apps/client/src/app/pages/open/open-page.html 127 @@ -5378,7 +5378,7 @@ Choose or drop a file here - Choose or drop a file here + Elige o suelta un archivo aquí apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 84 @@ -5386,7 +5386,7 @@ You are using the Live Demo. - You are using the Live Demo. + Estás usando la demostración en vivo. apps/client/src/app/app.component.html 12 @@ -5394,7 +5394,7 @@ One-time fee, annual account fees - One-time fee, annual account fees + Tarifa única, tarifas anuales de la cuenta apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 33 @@ -5402,7 +5402,7 @@ Distribution of corporate earnings - Distribution of corporate earnings + Distribución de ganancias corporativas apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 41 @@ -5410,7 +5410,7 @@ Fee - Fee + Tarifa libs/ui/src/lib/i18n.ts 37 @@ -5418,7 +5418,7 @@ Interest - Interest + Interés apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 307 @@ -5426,7 +5426,7 @@ Revenue for lending out money - Revenue for lending out money + Ingresos por prestar dinero apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 49 @@ -5434,7 +5434,7 @@ Add Tag - Add Tag + Agregar etiqueta apps/client/src/app/components/admin-tag/admin-tag.component.html 8 @@ -5442,7 +5442,7 @@ Do you really want to delete this tag? - Do you really want to delete this tag? + ¿Realmente deseas eliminar esta etiqueta? apps/client/src/app/components/admin-tag/admin-tag.component.ts 85 @@ -5450,7 +5450,7 @@ Update tag - Update tag + Actualizar etiqueta apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 8 diff --git a/apps/client/src/styles.scss b/apps/client/src/styles.scss index b4723d377..1975b02b3 100644 --- a/apps/client/src/styles.scss +++ b/apps/client/src/styles.scss @@ -414,6 +414,14 @@ ngx-skeleton-loader { } } +.mat-mdc-card { + .mat-mdc-card-title { + --mat-card-title-text-line-height: 1.2; + + margin-bottom: 0.5rem; + } +} + .mat-mdc-checkbox { label { margin-bottom: 0; diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index a3b129b55..e124360a1 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -122,7 +122,6 @@ export const PROPERTY_DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER_MAX_REQUESTS = 'DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER_MAX_REQUESTS'; export const PROPERTY_DEMO_ACCOUNT_ID = 'DEMO_ACCOUNT_ID'; export const PROPERTY_DEMO_USER_ID = 'DEMO_USER_ID'; -export const PROPERTY_DEMO_USER_ID_LEGACY = 'DEMO_USER_ID_LEGACY'; export const PROPERTY_IS_DATA_GATHERING_ENABLED = 'IS_DATA_GATHERING_ENABLED'; export const PROPERTY_IS_READ_ONLY_MODE = 'IS_READ_ONLY_MODE'; export const PROPERTY_IS_USER_SIGNUP_ENABLED = 'IS_USER_SIGNUP_ENABLED'; diff --git a/package-lock.json b/package-lock.json index 47c6bcd04..6fc2a8887 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,7 @@ "@prisma/client": "6.8.2", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", - "@stripe/stripe-js": "5.4.0", + "@stripe/stripe-js": "7.3.0", "alphavantage": "2.2.0", "big.js": "7.0.1", "bootstrap": "4.6.2", @@ -76,7 +76,7 @@ "ngx-device-detector": "9.0.0", "ngx-markdown": "19.0.0", "ngx-skeleton-loader": "11.0.0", - "ngx-stripe": "19.0.0", + "ngx-stripe": "19.7.0", "open-color": "1.9.1", "papaparse": "5.3.1", "passport": "0.7.0", @@ -85,7 +85,7 @@ "passport-jwt": "4.0.1", "reflect-metadata": "0.2.2", "rxjs": "7.8.1", - "stripe": "17.3.0", + "stripe": "18.1.0", "svgmap": "2.12.2", "twitter-api-v2": "1.23.0", "uuid": "11.1.0", @@ -12113,9 +12113,9 @@ } }, "node_modules/@stripe/stripe-js": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-5.4.0.tgz", - "integrity": "sha512-3tfMbSvLGB+OsJ2MsjWjWo+7sp29dwx+3+9kG/TEnZQJt+EwbF/Nomm43cSK+6oXZA9uhspgyrB+BbrPRumx4g==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-7.3.0.tgz", + "integrity": "sha512-xnCyFIEI5SQnQrKkCxVj7nS5fWTZap+zuIGzmmxLMdlmgahFJaihK4zogqE8YyKKTLtrp/EldkEijSgtXsRVDg==", "license": "MIT", "engines": { "node": ">=12.16" @@ -27148,9 +27148,9 @@ } }, "node_modules/ngx-stripe": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/ngx-stripe/-/ngx-stripe-19.0.0.tgz", - "integrity": "sha512-Q95EnHcEjZrHg4f4XMwMhRlJNg/jenBfypk9JISC3T4R2hc+J6HS2NMHBuft9hfRepKrcQY+FiSLzH2yS+5cAg==", + "version": "19.7.0", + "resolved": "https://registry.npmjs.org/ngx-stripe/-/ngx-stripe-19.7.0.tgz", + "integrity": "sha512-WQ7IMJT1LmQEa/3y0blAEvbPbtASrIdSGPGC69bodcEEXpKVkEUVEklYKEsJHFMFPqIU36lMA8iue0bfyxuMpA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -27158,7 +27158,7 @@ "peerDependencies": { "@angular/common": ">=19.0.0 <20.0.0", "@angular/core": ">=19.0.0 <20.0.0", - "@stripe/stripe-js": ">=5.0.0 <6.0.0" + "@stripe/stripe-js": ">=7.0.0 <8.0.0" } }, "node_modules/no-case": { @@ -32716,16 +32716,23 @@ } }, "node_modules/stripe": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/stripe/-/stripe-17.3.0.tgz", - "integrity": "sha512-WACmytj1MssbIwGwPfAomo61jgldb2B/cB6A3W/Bqs9zId1olVcAa8X7HERkqpw4190GSsbvrD7KnkZogatyvw==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-18.1.0.tgz", + "integrity": "sha512-MLDiniPTHqcfIT3anyBPmOEcaiDhYa7/jRaNypQ3Rt2SJnayQZBvVbFghIziUCZdltGAndm/ZxVOSw6uuSCDig==", "license": "MIT", "dependencies": { - "@types/node": ">=8.1.0", "qs": "^6.11.0" }, "engines": { "node": ">=12.*" + }, + "peerDependencies": { + "@types/node": ">=12.x.x" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/strtok3": { diff --git a/package.json b/package.json index 6624fa7b7..f9c862cf3 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "@prisma/client": "6.8.2", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", - "@stripe/stripe-js": "5.4.0", + "@stripe/stripe-js": "7.3.0", "alphavantage": "2.2.0", "big.js": "7.0.1", "bootstrap": "4.6.2", @@ -122,7 +122,7 @@ "ngx-device-detector": "9.0.0", "ngx-markdown": "19.0.0", "ngx-skeleton-loader": "11.0.0", - "ngx-stripe": "19.0.0", + "ngx-stripe": "19.7.0", "open-color": "1.9.1", "papaparse": "5.3.1", "passport": "0.7.0", @@ -131,7 +131,7 @@ "passport-jwt": "4.0.1", "reflect-metadata": "0.2.2", "rxjs": "7.8.1", - "stripe": "17.3.0", + "stripe": "18.1.0", "svgmap": "2.12.2", "twitter-api-v2": "1.23.0", "uuid": "11.1.0",