Browse Source

Merge pull request #24 from dandevaud/main

Main - Latest Upstream Changes
pull/5027/head
dandevaud 2 years ago
committed by GitHub
parent
commit
cc70437d00
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 29
      CHANGELOG.md
  2. 5
      apps/api/src/assets/cryptocurrencies/cryptocurrencies.json
  3. 1
      apps/api/src/assets/cryptocurrencies/custom.json
  4. 104
      apps/api/src/assets/sitemap.xml
  5. 1
      apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts
  6. 27
      apps/client/src/app/components/header/header.component.html
  7. 8
      apps/client/src/app/components/header/header.component.scss
  8. 8
      apps/client/src/app/pages/landing/landing-page.html
  9. 5
      apps/client/src/app/pages/landing/landing-page.scss
  10. 2
      apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts
  11. 1
      apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts
  12. 2
      apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html
  13. 16
      apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html
  14. 82
      apps/client/src/app/pages/resources/personal-finance-tools/products.ts
  15. 5
      apps/client/src/app/services/page-title.strategy.ts
  16. 3
      apps/client/src/assets/images/logo-hacker-news.svg
  17. 14
      apps/client/src/assets/oss-friends.json
  18. 1026
      apps/client/src/locales/messages.de.xlf
  19. 1026
      apps/client/src/locales/messages.es.xlf
  20. 1026
      apps/client/src/locales/messages.fr.xlf
  21. 1026
      apps/client/src/locales/messages.it.xlf
  22. 1026
      apps/client/src/locales/messages.nl.xlf
  23. 1026
      apps/client/src/locales/messages.pt.xlf
  24. 1006
      apps/client/src/locales/messages.xlf
  25. 10
      package.json
  26. 60
      yarn.lock

29
CHANGELOG.md

@ -5,6 +5,35 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## Unreleased
### Added
- Added support for the cryptocurrency _CyberConnect_
### Changed
- Refreshed the cryptocurrencies list
## 1.305.0 - 2023-09-03
### Added
- Added _Hacker News_ to the _As seen in_ section on the landing page
### Changed
- Shortened the page titles
- Improved the language localization for German (`de`)
- Upgraded `prisma` from version `4.16.2` to `5.2.0`
- Upgraded `replace-in-file` from version `6.3.5` to `7.0.1`
- Upgraded `yahoo-finance2` from version `2.4.3` to `2.4.4`
### Fixed
- Fixed the alignment in the header navigation
- Fixed the alignment in the menu of the impersonation mode
## 1.304.0 - 2023-08-27
### Added

5
apps/api/src/assets/cryptocurrencies/cryptocurrencies.json

@ -1293,6 +1293,7 @@
"BZKY": "Bizkey",
"BZL": "BZLCoin",
"BZNT": "Bezant",
"BZR": "Bazaars",
"BZRX": "bZx Protocol",
"BZX": "Bitcoin Zero",
"BZZ": "Swarmv",
@ -2564,7 +2565,7 @@
"ELONGT": "Elon GOAT",
"ELONONE": "AstroElon",
"ELP": "Ellerium",
"ELS": "Elysium",
"ELS": "Ethlas",
"ELT": "Element Black",
"ELTC2": "eLTC",
"ELTCOIN": "ELTCOIN",
@ -2573,6 +2574,7 @@
"ELVN": "11Minutes",
"ELX": "Energy Ledger",
"ELY": "Elysian",
"ELYSIUM": "Elysium",
"EM": "Eminer",
"EMANATE": "EMANATE",
"EMAR": "EmaratCoin",
@ -2890,6 +2892,7 @@
"FDO": "Firdaos",
"FDR": "French Digital Reserve",
"FDT": "Frutti Dino",
"FDUSD": "First Digital USD",
"FDX": "fidentiaX",
"FDZ": "Friendz",
"FEAR": "Fear",

1
apps/api/src/assets/cryptocurrencies/custom.json

@ -1,4 +1,5 @@
{
"CYBER24781": "CyberConnect",
"LUNA1": "Terra",
"LUNA2": "Terra",
"SGB1": "Songbird",

104
apps/api/src/assets/sitemap.xml

@ -50,6 +50,110 @@
<loc>https://ghostfol.io/de/ressourcen</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-altoo</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-copilot-money</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-delta</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-divvydiary</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-exirio</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-folishare</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-getquin</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-gospatz</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-justetf</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-kubera</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-markets.sh</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-maybe-finance</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-monse</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-parqet</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-plannix</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-portfolio-dividend-tracker</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-portseido</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-projectionlab</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-seeking-alpha</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-sharesight</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-simple-portfolio</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-snowball-analytics</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-sumio</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-utluna</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-yeekatee</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/de/ueber-uns</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>

1
apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts

@ -18,7 +18,6 @@ import {
import Big from 'big.js';
import { format, isToday } from 'date-fns';
import got from 'got';
import ms from 'ms';
@Injectable()
export class EodHistoricalDataService implements DataProviderInterface {

27
apps/client/src/app/components/header/header.component.html

@ -26,7 +26,7 @@
</li>
<li class="list-inline-item">
<a
class="d-none d-sm-block mx-1"
class="d-none d-sm-block"
i18n
mat-flat-button
[ngClass]="{
@ -39,7 +39,7 @@
</li>
<li class="list-inline-item">
<a
class="d-none d-sm-block mx-1"
class="d-none d-sm-block"
i18n
mat-flat-button
[ngClass]="{
@ -52,7 +52,7 @@
</li>
<li *ngIf="hasPermissionToAccessAdminControl" class="list-inline-item">
<a
class="d-none d-sm-block mx-1"
class="d-none d-sm-block"
i18n
mat-flat-button
[ngClass]="{
@ -65,7 +65,7 @@
</li>
<li class="list-inline-item">
<a
class="d-none d-sm-block mx-1"
class="d-none d-sm-block"
i18n
mat-flat-button
[ngClass]="{
@ -83,7 +83,7 @@
class="list-inline-item"
>
<a
class="d-none d-sm-block mx-1"
class="d-none d-sm-block"
i18n
mat-flat-button
[ngClass]="{
@ -96,7 +96,7 @@
</li>
<li class="list-inline-item">
<a
class="d-none d-sm-block mx-1"
class="d-none d-sm-block"
i18n
mat-flat-button
[ngClass]="{
@ -129,6 +129,7 @@
<mat-menu #accountMenu="matMenu" xPosition="before">
<ng-container *ngIf="user?.access?.length > 0">
<button mat-menu-item (click)="impersonateAccount(null)">
<span class="align-items-center d-flex">
<ion-icon
*ngIf="user?.access?.length > 0"
class="mr-2"
@ -139,12 +140,14 @@
"
></ion-icon>
<span i18n>Me</span>
</span>
</button>
<button
*ngFor="let accessItem of user?.access"
mat-menu-item
(click)="impersonateAccount(accessItem.id)"
>
<span class="align-items-center d-flex">
<ion-icon
class="mr-2"
name="square-outline"
@ -156,6 +159,7 @@
></ion-icon>
<span *ngIf="accessItem.alias">{{ accessItem.alias }}</span>
<span *ngIf="!accessItem.alias" i18n>User</span>
</span>
</button>
<hr class="m-0" />
</ng-container>
@ -256,7 +260,7 @@
<ul class="alig-items-center d-flex list-inline m-0">
<li class="list-inline-item">
<a
class="d-none d-sm-block mx-1"
class="d-none d-sm-block"
i18n
mat-flat-button
[ngClass]="{
@ -269,7 +273,7 @@
</li>
<li class="list-inline-item">
<a
class="d-none d-sm-block mx-1"
class="d-none d-sm-block"
i18n
mat-flat-button
[ngClass]="{
@ -282,6 +286,7 @@
</li>
<li *ngIf="hasPermissionForSubscription" class="list-inline-item">
<a
class="d-sm-block"
i18n
mat-flat-button
[ngClass]="{
@ -297,7 +302,7 @@
class="list-inline-item"
>
<a
class="d-none d-sm-block mx-1"
class="d-none d-sm-block"
i18n
mat-flat-button
[ngClass]="{
@ -317,13 +322,13 @@
></a>
</li>
<li class="list-inline-item">
<button class="mx-1" mat-flat-button (click)="openLoginDialog()">
<button class="d-sm-block" mat-flat-button (click)="openLoginDialog()">
<ng-container i18n>Sign in</ng-container>
</button>
</li>
<li
*ngIf="currentRoute !== 'register' && hasPermissionToCreateUser"
class="list-inline-item"
class="list-inline-item ml-1"
>
<a
class="d-none d-sm-block"

8
apps/client/src/app/components/header/header.component.scss

@ -7,8 +7,8 @@
.mat-toolbar {
background-color: var(--light-background);
.spacer {
flex: 1 1 auto;
.list-inline-item {
margin: 0;
}
.mdc-button {
@ -24,6 +24,10 @@
font-size: 1.5rem;
}
}
.spacer {
flex: 1 1 auto;
}
}
}

8
apps/client/src/app/pages/landing/landing-page.html

@ -134,6 +134,14 @@
title="DEV Community - A constructive and inclusive social network for software developers"
></a>
</div>
<div class="col-md-3 d-flex justify-content-center my-1">
<a
class="d-block logo logo-hacker-news mask"
href="https://news.ycombinator.com"
target="_blank"
title="Hacker News"
></a>
</div>
<div class="col-md-3 d-flex justify-content-center my-1">
<a
class="d-block logo logo-openstartup"

5
apps/client/src/app/pages/landing/landing-page.scss

@ -53,6 +53,10 @@
mask-image: url('/assets/images/logo-dev-community.svg');
}
&.logo-hacker-news {
mask-image: url('/assets/images/logo-hacker-news.svg');
}
&.logo-openstartup {
background-image: url('/assets/images/logo-openstartup.png');
background-position: center;
@ -128,6 +132,7 @@
&.logo-agplv3,
&.logo-alternative-to,
&.logo-dev-community,
&.logo-hacker-news,
&.logo-privacy-tools,
&.logo-reddit,
&.logo-sackgeld,

2
apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts

@ -19,7 +19,7 @@ const routes: Routes = [
.map(({ component, key, name }) => {
return {
canActivate: [AuthGuard],
path: `open-source-alternative-to-${key}`,
path: $localize`open-source-alternative-to` + `-${key}`,
loadComponent: () =>
import(`./products/${key}-page.component`).then(() => component),
title: $localize`Open Source Alternative to ${name}`

1
apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts

@ -10,6 +10,7 @@ import { products } from './products';
templateUrl: './personal-finance-tools-page.html'
})
export class PersonalFinanceToolsPageComponent implements OnDestroy {
public pathAlternativeTo = $localize`open-source-alternative-to` + '-';
public pathResources = '/' + $localize`resources`;
public products = products.filter(({ key }) => {
return key !== 'ghostfolio';

2
apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html

@ -29,7 +29,7 @@
<a
class="d-flex overflow-hidden w-100"
title="Compare Ghostfolio to {{ product.name }}"
[routerLink]="[pathResources, 'personal-finance-tools', 'open-source-alternative-to-' + product.key]"
[routerLink]="[pathResources, 'personal-finance-tools', pathAlternativeTo + product.key]"
>
<div class="flex-grow-1 overflow-hidden">
<div class="h6 m-0 text-truncate" i18n>

16
apps/client/src/app/pages/resources/personal-finance-tools/product-page-template.html

@ -10,7 +10,7 @@
</h1>
</div>
<section class="mb-4">
<p>
<p i18n>
Are you looking for an open source alternative to {{ product2.name
}}? <a [routerLink]="routerLinkAbout">Ghostfolio</a> is a powerful
portfolio management tool that provides individuals with a
@ -23,7 +23,7 @@
to help you make informed decisions and take control of your
financial future.
</p>
<p>
<p i18n>
Ghostfolio is an open source software (OSS), providing a
cost-effective alternative to {{ product2.name }} making it
particularly suitable for individuals on a tight budget, such as
@ -34,7 +34,7 @@
and personal finance enthusiasts, Ghostfolio continuously enhances
its capabilities, security, and user experience.
</p>
<p>
<p i18n>
Let’s dive deeper into the detailed comparison table below to gain a
thorough understanding of how Ghostfolio positions itself relative
to {{ product2.name }}. We will explore various aspects such as
@ -177,11 +177,11 @@
</tr>
<tr class="mat-mdc-row">
<td class="mat-mdc-cell px-3 py-2 text-right" i18n>Pricing</td>
<td class="mat-mdc-cell px-1 py-2">
<td class="mat-mdc-cell px-1 py-2" i18n>
Starting from {{ product1.pricingPerYear }} / year
</td>
<td class="mat-mdc-cell px-1 py-2">
<ng-container *ngIf="product2.pricingPerYear"
<ng-container *ngIf="product2.pricingPerYear" i18n
>Starting from {{ product2.pricingPerYear }} /
year</ng-container
>
@ -196,7 +196,7 @@
</table>
</section>
<section class="mb-4">
<p>
<p i18n>
Please note that the information provided is based on our
independent research and analysis. This website is not affiliated
with {{ product2.name }} or any other product mentioned in the
@ -208,7 +208,7 @@
</p>
</section>
<section class="call-to-action mb-4 py-3 rounded">
<h2 class="h4 mb-0 text-center">
<h2 class="h4 mb-0 text-center" i18n>
Ready to take your <strong>investments</strong> to the
<strong>next level</strong>?
</h2>
@ -217,7 +217,7 @@
Ghostfolio.
</p>
<div class="text-center">
<a color="primary" href="https://ghostfol.io" mat-flat-button>
<a color="primary" href="https://ghostfol.io" i18n mat-flat-button>
Get Started
</a>
</div>

82
apps/client/src/app/pages/resources/personal-finance-tools/products.ts

@ -35,18 +35,18 @@ export const products: Product[] = [
isOpenSource: true,
key: 'ghostfolio',
languages: [
'Dutch',
'Deutsch',
'English',
'French',
'German',
'Italian',
'Portuguese',
'Spanish'
'Español',
'Français',
'Italiano',
'Nederlands',
'Português'
],
name: 'Ghostfolio',
origin: 'Switzerland',
origin: $localize`Switzerland`,
pricingPerYear: '$19',
region: 'Global',
region: $localize`Global`,
slogan: 'Open Source Wealth Management',
useAnonymously: true
},
@ -57,7 +57,7 @@ export const products: Product[] = [
isOpenSource: false,
key: 'altoo',
name: 'Altoo Wealth Platform',
origin: 'Switzerland',
origin: $localize`Switzerland`,
slogan: 'Simplicity for Complex Wealth'
},
{
@ -68,7 +68,7 @@ export const products: Product[] = [
isOpenSource: false,
key: 'copilot-money',
name: 'Copilot Money',
origin: 'United States',
origin: $localize`United States`,
pricingPerYear: '$70',
slogan: 'Do money better with Copilot'
},
@ -81,7 +81,7 @@ export const products: Product[] = [
key: 'delta',
name: 'Delta Investment Tracker',
note: 'Acquired by eToro',
origin: 'Belgium',
origin: $localize`Belgium`,
slogan: 'The app to track all your investments. Make smart moves only.'
},
{
@ -91,9 +91,9 @@ export const products: Product[] = [
hasSelfHostingAbility: false,
isOpenSource: false,
key: 'divvydiary',
languages: ['English', 'German'],
languages: ['Deutsch', 'English'],
name: 'DivvyDiary',
origin: 'Germany',
origin: $localize`Germany`,
pricingPerYear: '€65',
slogan: 'Your personal Dividend Calendar'
},
@ -105,7 +105,7 @@ export const products: Product[] = [
isOpenSource: false,
key: 'exirio',
name: 'Exirio',
origin: 'United States',
origin: $localize`United States`,
pricingPerYear: '$100',
slogan: 'All your wealth, in one place.'
},
@ -115,9 +115,9 @@ export const products: Product[] = [
hasSelfHostingAbility: false,
isOpenSource: false,
key: 'folishare',
languages: ['English', 'German'],
languages: ['Deutsch', 'English'],
name: 'folishare',
origin: 'Austria',
origin: $localize`Austria`,
pricingPerYear: '$65',
slogan: 'Take control over your investments'
},
@ -128,9 +128,9 @@ export const products: Product[] = [
hasSelfHostingAbility: false,
isOpenSource: false,
key: 'getquin',
languages: ['English', 'German'],
languages: ['Deutsch', 'English'],
name: 'getquin',
origin: 'Germany',
origin: $localize`Germany`,
pricingPerYear: '€48',
slogan: 'Portfolio Tracker, Analysis & Community'
},
@ -141,7 +141,7 @@ export const products: Product[] = [
isOpenSource: false,
key: 'gospatz',
name: 'goSPATZ',
origin: 'Germany',
origin: $localize`Germany`,
slogan: 'Volle Kontrolle über deine Investitionen'
},
{
@ -152,7 +152,7 @@ export const products: Product[] = [
isOpenSource: false,
key: 'justetf',
name: 'justETF',
origin: 'Germany',
origin: $localize`Germany`,
pricingPerYear: '€119',
slogan: 'ETF portfolios made simple'
},
@ -164,7 +164,7 @@ export const products: Product[] = [
isOpenSource: false,
key: 'kubera',
name: 'Kubera®',
origin: 'United States',
origin: $localize`United States`,
pricingPerYear: '$150',
slogan: 'The Time Machine for your Net Worth'
},
@ -177,9 +177,9 @@ export const products: Product[] = [
key: 'markets.sh',
languages: ['English'],
name: 'markets.sh',
origin: 'Germany',
origin: $localize`Germany`,
pricingPerYear: '€168',
region: 'Global',
region: $localize`Global`,
slogan: 'Track your investments'
},
{
@ -191,9 +191,9 @@ export const products: Product[] = [
languages: ['English'],
name: 'Maybe Finance',
note: 'Sunset in 2023',
origin: 'United States',
origin: $localize`United States`,
pricingPerYear: '$145',
region: 'United States',
region: $localize`United States`,
slogan: 'Your financial future, in your control'
},
{
@ -215,7 +215,7 @@ export const products: Product[] = [
key: 'parqet',
name: 'Parqet',
note: 'Originally named as Tresor One',
origin: 'Germany',
origin: $localize`Germany`,
pricingPerYear: '€88',
region: 'Austria, Germany, Switzerland',
slogan: 'Dein Vermögen immer im Blick'
@ -227,7 +227,7 @@ export const products: Product[] = [
isOpenSource: false,
key: 'plannix',
name: 'Plannix',
origin: 'Italy',
origin: $localize`Italy`,
slogan: 'Your Personal Finance Hub'
},
{
@ -236,9 +236,9 @@ export const products: Product[] = [
hasSelfHostingAbility: false,
isOpenSource: false,
key: 'portfolio-dividend-tracker',
languages: ['English', 'Dutch'],
languages: ['English', 'Nederlands'],
name: 'Portfolio Dividend Tracker',
origin: 'Netherlands',
origin: $localize`Netherlands`,
pricingPerYear: '€60',
slogan: 'Manage all your portfolios'
},
@ -249,9 +249,9 @@ export const products: Product[] = [
hasSelfHostingAbility: false,
isOpenSource: false,
key: 'portseido',
languages: ['Dutch', 'English', 'French', 'German'],
languages: ['Deutsch', 'English', 'Français', 'Nederlands'],
name: 'Portseido',
origin: 'Thailand',
origin: $localize`Thailand`,
pricingPerYear: '$96',
slogan: 'Portfolio Performance and Dividend Tracker'
},
@ -263,7 +263,7 @@ export const products: Product[] = [
isOpenSource: false,
key: 'projectionlab',
name: 'ProjectionLab',
origin: 'United States',
origin: $localize`United States`,
pricingPerYear: '$108',
slogan: 'Build Financial Plans You Love.'
},
@ -275,7 +275,7 @@ export const products: Product[] = [
isOpenSource: false,
key: 'seeking-alpha',
name: 'Seeking Alpha',
origin: 'United States',
origin: $localize`United States`,
pricingPerYear: '$239',
slogan: 'Stock Market Analysis & Tools for Investors'
},
@ -287,9 +287,9 @@ export const products: Product[] = [
isOpenSource: false,
key: 'sharesight',
name: 'Sharesight',
origin: 'New Zealand',
origin: $localize`New Zealand`,
pricingPerYear: '$135',
region: 'Global',
region: $localize`Global`,
slogan: 'Stock Portfolio Tracker'
},
{
@ -299,7 +299,7 @@ export const products: Product[] = [
isOpenSource: false,
key: 'simple-portfolio',
name: 'Simple Portfolio',
origin: 'Czech Republic',
origin: $localize`Czech Republic`,
pricingPerYear: '€80',
slogan: 'Stock Portfolio Tracker'
},
@ -322,7 +322,7 @@ export const products: Product[] = [
isOpenSource: false,
key: 'sumio',
name: 'Sumio',
origin: 'Czech Republic',
origin: $localize`Czech Republic`,
pricingPerYear: '$20',
slogan: 'Sum up and build your wealth.'
},
@ -332,9 +332,9 @@ export const products: Product[] = [
hasSelfHostingAbility: false,
isOpenSource: false,
key: 'utluna',
languages: ['English', 'French', 'German'],
languages: ['Deutsch', 'English', 'Français'],
name: 'Utluna',
origin: 'Switzerland',
origin: $localize`Switzerland`,
pricingPerYear: '$300',
slogan: 'Your Portfolio. Revealed.',
useAnonymously: true
@ -346,8 +346,8 @@ export const products: Product[] = [
isOpenSource: false,
key: 'yeekatee',
name: 'yeekatee',
origin: 'Switzerland',
region: 'Switzerland',
origin: $localize`Switzerland`,
region: $localize`Switzerland`,
slogan: 'Connect. Share. Invest.'
}
];

5
apps/client/src/app/services/page-title.strategy.ts

@ -6,6 +6,7 @@ import { RouterStateSnapshot, TitleStrategy } from '@angular/router';
export class PageTitleStrategy extends TitleStrategy {
private static readonly DEFAULT_TITLE =
'Ghostfolio – Open Source Wealth Management Software';
private static readonly DEFAULT_TITLE_SHORT = 'Ghostfolio';
public constructor(private readonly title: Title) {
super();
@ -15,7 +16,9 @@ export class PageTitleStrategy extends TitleStrategy {
const title = this.buildTitle(routerState);
if (title) {
this.title.setTitle(`${title}${PageTitleStrategy.DEFAULT_TITLE}`);
this.title.setTitle(
`${title}${PageTitleStrategy.DEFAULT_TITLE_SHORT}`
);
} else {
this.title.setTitle(`${PageTitleStrategy.DEFAULT_TITLE}`);
}

3
apps/client/src/assets/images/logo-hacker-news.svg

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="256px" height="256px">
<path d="M 1 1 L 1 14 L 14 14 L 14 1 Z M 2 2 L 13 2 L 13 13 L 2 13 Z M 4.644531 4 L 7 8.125 L 7 11 L 8 11 L 8 8.140625 L 10.367188 4 L 9.21875 4 L 7.507813 6.992188 L 5.796875 4 Z"/>
</svg>

After

Width:  |  Height:  |  Size: 282 B

14
apps/client/src/assets/oss-friends.json

@ -1,5 +1,5 @@
{
"createdAt": "2023-08-22T06:39:23.320Z",
"createdAt": "2023-09-02T07:02:24.422Z",
"data": [
{
"name": "Appsmith",
@ -76,6 +76,11 @@
"description": "Democratizing investment research through an open source financial ecosystem. The OpenBB Terminal allows everyone to perform investment research, from everywhere.",
"href": "https://openbb.co"
},
{
"name": "Rivet",
"description": "Open-source solution to deploy, scale, and operate your multiplayer game.",
"href": "https://rivet.gg"
},
{
"name": "Sniffnet",
"description": "Sniffnet is a network monitoring tool to help you easily keep track of your Internet traffic.",
@ -84,7 +89,7 @@
{
"name": "Tolgee",
"description": "Software localization from A to Z made really easy.",
"href": "https://tolgee.io/"
"href": "https://tolgee.io"
},
{
"name": "Trigger.dev",
@ -110,6 +115,11 @@
"name": "Webstudio",
"description": "Webstudio is an open source alternative to Webflow",
"href": "https://webstudio.is"
},
{
"name": "Spark.NET",
"description": "The .NET Web Framework for Makers. Build production ready, full-stack web applications fast without sweating the small stuff.",
"href": "https://spark-framework.net"
}
],
"source": "https://formbricks.com/api/oss-friends"

1026
apps/client/src/locales/messages.de.xlf

File diff suppressed because it is too large

1026
apps/client/src/locales/messages.es.xlf

File diff suppressed because it is too large

1026
apps/client/src/locales/messages.fr.xlf

File diff suppressed because it is too large

1026
apps/client/src/locales/messages.it.xlf

File diff suppressed because it is too large

1026
apps/client/src/locales/messages.nl.xlf

File diff suppressed because it is too large

1026
apps/client/src/locales/messages.pt.xlf

File diff suppressed because it is too large

1006
apps/client/src/locales/messages.xlf

File diff suppressed because it is too large

10
package.json

@ -1,6 +1,6 @@
{
"name": "ghostfolio",
"version": "1.304.0",
"version": "1.305.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",
@ -81,7 +81,7 @@
"@nestjs/platform-express": "10.1.3",
"@nestjs/schedule": "3.0.2",
"@nestjs/serve-static": "4.0.0",
"@prisma/client": "4.16.2",
"@prisma/client": "5.2.0",
"@simplewebauthn/browser": "5.2.1",
"@simplewebauthn/server": "5.2.1",
"@stripe/stripe-js": "1.47.0",
@ -122,14 +122,14 @@
"passport": "0.6.0",
"passport-google-oauth20": "2.0.0",
"passport-jwt": "4.0.0",
"prisma": "4.16.2",
"prisma": "5.2.0",
"reflect-metadata": "0.1.13",
"rxjs": "7.5.6",
"stripe": "11.12.0",
"svgmap": "2.6.0",
"twitter-api-v2": "1.14.2",
"uuid": "9.0.0",
"yahoo-finance2": "2.4.3",
"yahoo-finance2": "2.4.4",
"zone.js": "0.13.1"
},
"devDependencies": {
@ -193,7 +193,7 @@
"prettier-plugin-organize-attributes": "1.0.0",
"react": "18.2.0",
"react-dom": "18.2.0",
"replace-in-file": "6.3.5",
"replace-in-file": "7.0.1",
"storybook": "7.0.9",
"ts-jest": "29.1.0",
"ts-node": "10.9.1",

60
yarn.lock

@ -4293,22 +4293,22 @@
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
"@prisma/client@4.16.2":
version "4.16.2"
resolved "https://registry.yarnpkg.com/@prisma/client/-/client-4.16.2.tgz#3bb9ebd49b35c8236b3d468d0215192267016e2b"
integrity sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==
"@prisma/client@5.2.0":
version "5.2.0"
resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.2.0.tgz#cbfdd440614b38736563a7999f39922fcde0ed50"
integrity sha512-AiTjJwR4J5Rh6Z/9ZKrBBLel3/5DzUNntMohOy7yObVnVoTNVFi2kvpLZlFuKO50d7yDspOtW6XBpiAd0BVXbQ==
dependencies:
"@prisma/engines-version" "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81"
"@prisma/engines-version" "5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f"
"@prisma/engines-version@4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81":
version "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81"
resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz#d3b5dcf95b6d220e258cbf6ae19b06d30a7e9f14"
integrity sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==
"@prisma/engines-version@5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f":
version "5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f"
resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f.tgz#11366e7ff031c908debf4983248d40046016de37"
integrity sha512-jsnKT5JIDIE01lAeCj2ghY9IwxkedhKNvxQeoyLs6dr4ZXynetD0vTy7u6wMJt8vVPv8I5DPy/I4CFaoXAgbtg==
"@prisma/engines@4.16.2":
version "4.16.2"
resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-4.16.2.tgz#5ec8dd672c2173d597e469194916ad4826ce2e5f"
integrity sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==
"@prisma/engines@5.2.0":
version "5.2.0"
resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.2.0.tgz#e5dff48eb324c8137393933292d44ea5c3bc2ce7"
integrity sha512-dT7FOLUCdZmq+AunLqB1Iz+ZH/IIS1Fz2THmKZQ6aFONrQD/BQ5ecJ7g2wGS2OgyUFf4OaLam6/bxmgdOBDqig==
"@radix-ui/number@1.0.1":
version "1.0.1"
@ -11352,7 +11352,7 @@ glob@^10.0.0, glob@^10.2.2:
minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
path-scurry "^1.10.1"
glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0:
glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
version "7.2.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
@ -15918,12 +15918,12 @@ pretty-hrtime@^1.0.3:
resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==
prisma@4.16.2:
version "4.16.2"
resolved "https://registry.yarnpkg.com/prisma/-/prisma-4.16.2.tgz#469e0a0991c6ae5bcde289401726bb012253339e"
integrity sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==
prisma@5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.2.0.tgz#a302dc2635cdec1d22d552ece837fb29a03563b9"
integrity sha512-FfFlpjVCkZwrqxDnP4smlNYSH1so+CbfjgdpioFzGGqlQAEm6VHAYSzV7jJgC3ebtY9dNOhDMS2+4/1DDSM7bQ==
dependencies:
"@prisma/engines" "4.16.2"
"@prisma/engines" "5.2.0"
prismjs@^1.28.0:
version "1.29.0"
@ -16466,14 +16466,14 @@ repeat-string@^1.6.1:
resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==
replace-in-file@6.3.5:
version "6.3.5"
resolved "https://registry.yarnpkg.com/replace-in-file/-/replace-in-file-6.3.5.tgz#ff956b0ab5bc96613207d603d197cd209400a654"
integrity sha512-arB9d3ENdKva2fxRnSjwBEXfK1npgyci7ZZuwysgAp7ORjHSyxz6oqIjTEv8R0Ydl4Ll7uOAZXL4vbkhGIizCg==
replace-in-file@7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/replace-in-file/-/replace-in-file-7.0.1.tgz#1bb69a2e5596341cc6f0f581309add6c1d364b71"
integrity sha512-KbhgPq04eA+TxXuUxpgWIH9k/TjF+28ofon2PXP7vq6izAILhxOtksCVcLuuQLtyjouBaPdlH6RJYYcSPVxCOA==
dependencies:
chalk "^4.1.2"
glob "^7.2.0"
yargs "^17.2.1"
glob "^8.1.0"
yargs "^17.7.2"
request-progress@^3.0.0:
version "3.0.0"
@ -19035,10 +19035,10 @@ y18n@^5.0.5:
resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
yahoo-finance2@2.4.3:
version "2.4.3"
resolved "https://registry.yarnpkg.com/yahoo-finance2/-/yahoo-finance2-2.4.3.tgz#be4099182dc0a2e2908779e04d7b802688c15f0e"
integrity sha512-LVcl+h4XBMe3N/l8BOZdDFoK7AGMiblSBE00dU9t2zB0Zfxa6QQMESnUkJ1m35RWBr8QXFJyJnToPt+qKiEQXQ==
yahoo-finance2@2.4.4:
version "2.4.4"
resolved "https://registry.yarnpkg.com/yahoo-finance2/-/yahoo-finance2-2.4.4.tgz#3149a4f2e6fab04430aabe7758bfbc70f240503e"
integrity sha512-dL8bz3ubmPYRHd2M85hyL8kcVVlvpTGdzqeuewMH6X1Ej/lo4/2qlbAqZVT4qlcFeuEdlEIZ1N/mFp6SFnW8Uw==
dependencies:
"@types/tough-cookie" "^4.0.2"
ajv "8.10.0"
@ -19074,7 +19074,7 @@ yargs-parser@^11.1.1:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs@17.7.2, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.6.2:
yargs@17.7.2, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.2:
version "17.7.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==

Loading…
Cancel
Save