From 98a9523eeeaa71fdf9e815b71d2b8063f65e8364 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sun, 2 Jun 2024 10:20:09 +0200
Subject: [PATCH] Feature/extend personal finance tools (#3448)
---
apps/api/src/assets/sitemap.xml | 48 +++++++++++++++++++
.../personal-finance-tools/products.ts | 35 +++++++++++++-
.../portfolio-visualizer-page.component.ts | 32 +++++++++++++
.../products/stock-events-page.component.ts | 32 +++++++++++++
.../products/wallmine-page.component.ts | 32 +++++++++++++
5 files changed, 178 insertions(+), 1 deletion(-)
create mode 100644 apps/client/src/app/pages/resources/personal-finance-tools/products/portfolio-visualizer-page.component.ts
create mode 100644 apps/client/src/app/pages/resources/personal-finance-tools/products/stock-events-page.component.ts
create mode 100644 apps/client/src/app/pages/resources/personal-finance-tools/products/wallmine-page.component.ts
diff --git a/apps/api/src/assets/sitemap.xml b/apps/api/src/assets/sitemap.xml
index e527df8d0..f02c80fc7 100644
--- a/apps/api/src/assets/sitemap.xml
+++ b/apps/api/src/assets/sitemap.xml
@@ -182,6 +182,10 @@
https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-portfolio-dividend-tracker
${currentDate}T00:00:00+00:00
+
+ https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-portfolio-visualizer
+ ${currentDate}T00:00:00+00:00
+
https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-portseido
${currentDate}T00:00:00+00:00
@@ -210,6 +214,10 @@
https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-snowball-analytics
${currentDate}T00:00:00+00:00
+
+ https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-stock-events
+ ${currentDate}T00:00:00+00:00
+
https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-stockle
${currentDate}T00:00:00+00:00
@@ -234,6 +242,10 @@
https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-vyzer
${currentDate}T00:00:00+00:00
+
+ https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-wallmine
+ ${currentDate}T00:00:00+00:00
+
https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-wealthfolio
${currentDate}T00:00:00+00:00
@@ -536,6 +548,10 @@
https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-portfolio-dividend-tracker
${currentDate}T00:00:00+00:00
+
+ https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-portfolio-visualizer
+ ${currentDate}T00:00:00+00:00
+
https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-portseido
${currentDate}T00:00:00+00:00
@@ -564,6 +580,10 @@
https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-snowball-analytics
${currentDate}T00:00:00+00:00
+
+ https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-stock-events
+ ${currentDate}T00:00:00+00:00
+
https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-stockle
${currentDate}T00:00:00+00:00
@@ -588,6 +608,10 @@
https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-vyzer
${currentDate}T00:00:00+00:00
+
+ https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-wallmine
+ ${currentDate}T00:00:00+00:00
+
https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-wealthfolio
${currentDate}T00:00:00+00:00
@@ -902,6 +926,10 @@
https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-portfolio-dividend-tracker
${currentDate}T00:00:00+00:00
+
+ https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-portfolio-visualizer
+ ${currentDate}T00:00:00+00:00
+
https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-portseido
${currentDate}T00:00:00+00:00
@@ -930,6 +958,10 @@
https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-snowball-analytics
${currentDate}T00:00:00+00:00
+
+ https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-stock-events
+ ${currentDate}T00:00:00+00:00
+
https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-stockle
${currentDate}T00:00:00+00:00
@@ -954,6 +986,10 @@
https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-vyzer
${currentDate}T00:00:00+00:00
+
+ https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-wallmine
+ ${currentDate}T00:00:00+00:00
+
https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-wealthfolio
${currentDate}T00:00:00+00:00
@@ -1114,6 +1150,10 @@
https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-portfolio-dividend-tracker
${currentDate}T00:00:00+00:00
+
+ https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-portfolio-visualizer
+ ${currentDate}T00:00:00+00:00
+
https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-portseido
${currentDate}T00:00:00+00:00
@@ -1142,6 +1182,10 @@
https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-snowball-analytics
${currentDate}T00:00:00+00:00
+
+ https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-stock-events
+ ${currentDate}T00:00:00+00:00
+
https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-stockle
${currentDate}T00:00:00+00:00
@@ -1166,6 +1210,10 @@
https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-vyzer
${currentDate}T00:00:00+00:00
+
+ https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-wallmine
+ ${currentDate}T00:00:00+00:00
+
https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-wealthfolio
${currentDate}T00:00:00+00:00
diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products.ts
index d089193f0..c681ac93c 100644
--- a/apps/client/src/app/pages/resources/personal-finance-tools/products.ts
+++ b/apps/client/src/app/pages/resources/personal-finance-tools/products.ts
@@ -32,6 +32,7 @@ import { MonsePageComponent } from './products/monse-page.component';
import { ParqetPageComponent } from './products/parqet-page.component';
import { PlannixPageComponent } from './products/plannix-page.component';
import { PortfolioDividendTrackerPageComponent } from './products/portfolio-dividend-tracker-page.component';
+import { PortfolioVisualizerPageComponent } from './products/portfolio-visualizer-page.component';
import { PortseidoPageComponent } from './products/portseido-page.component';
import { ProjectionLabPageComponent } from './products/projectionlab-page.component';
import { RocketMoneyPageComponent } from './products/rocket-money-page.component';
@@ -39,12 +40,14 @@ import { SeekingAlphaPageComponent } from './products/seeking-alpha-page.compone
import { SharesightPageComponent } from './products/sharesight-page.component';
import { SimplePortfolioPageComponent } from './products/simple-portfolio-page.component';
import { SnowballAnalyticsPageComponent } from './products/snowball-analytics-page.component';
+import { StockEventsPageComponent } from './products/stock-events-page.component';
import { StocklePageComponent } from './products/stockle-page.component';
import { StockMarketEyePageComponent } from './products/stockmarketeye-page.component';
import { SumioPageComponent } from './products/sumio-page.component';
import { TillerPageComponent } from './products/tiller-page.component';
import { UtlunaPageComponent } from './products/utluna-page.component';
import { VyzerPageComponent } from './products/vyzer-page.component';
+import { WallminePageComponent } from './products/wallmine-page.component';
import { WealthfolioPageComponent } from './products/wealthfolio-page.component';
import { WealthicaPageComponent } from './products/wealthica-page.component';
import { WhalPageComponent } from './products/whal-page.component';
@@ -67,7 +70,8 @@ export const products: Product[] = [
'Italiano',
'Nederlands',
'Português',
- 'Türkçe'
+ 'Türkçe',
+ '简体中文'
],
name: 'Ghostfolio',
origin: $localize`Switzerland`,
@@ -408,6 +412,16 @@ export const products: Product[] = [
pricingPerYear: '€60',
slogan: 'Manage all your portfolios'
},
+ {
+ component: PortfolioVisualizerPageComponent,
+ hasFreePlan: true,
+ hasSelfHostingAbility: false,
+ key: 'portfolio-visualizer',
+ languages: ['English'],
+ name: 'Portfolio Visualizer',
+ pricingPerYear: '$360',
+ slogan: 'Tools for Better Investors'
+ },
{
component: PortseidoPageComponent,
founded: 2021,
@@ -484,6 +498,15 @@ export const products: Product[] = [
pricingPerYear: '$80',
slogan: 'Simple and powerful portfolio tracker'
},
+ {
+ component: StockEventsPageComponent,
+ founded: 2019,
+ hasSelfHostingAbility: false,
+ key: 'stock-events',
+ name: 'Stock Events',
+ origin: $localize`Germany`,
+ slogan: 'Track all your Investments'
+ },
{
component: StocklePageComponent,
key: 'stockle',
@@ -543,6 +566,16 @@ export const products: Product[] = [
pricingPerYear: '$348',
slogan: 'Virtual Family Office for Smart Wealth Management'
},
+ {
+ component: WallminePageComponent,
+ hasSelfHostingAbility: false,
+ key: 'wallmine',
+ languages: ['English'],
+ name: 'wallmine',
+ origin: $localize`Czech Republic`,
+ pricingPerYear: '$600',
+ slogan: 'Make Smarter Investments'
+ },
{
component: WealthfolioPageComponent,
hasSelfHostingAbility: true,
diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/portfolio-visualizer-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/portfolio-visualizer-page.component.ts
new file mode 100644
index 000000000..4baeb4de9
--- /dev/null
+++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/portfolio-visualizer-page.component.ts
@@ -0,0 +1,32 @@
+import { CommonModule } from '@angular/common';
+import { Component } from '@angular/core';
+import { MatButtonModule } from '@angular/material/button';
+import { RouterModule } from '@angular/router';
+
+import { products } from '../products';
+import { BaseProductPageComponent } from './base-page.component';
+
+@Component({
+ host: { class: 'page' },
+ imports: [CommonModule, MatButtonModule, RouterModule],
+ selector: 'gf-portfolio-visualizer-page',
+ standalone: true,
+ styleUrls: ['../product-page-template.scss'],
+ templateUrl: '../product-page-template.html'
+})
+export class PortfolioVisualizerPageComponent extends BaseProductPageComponent {
+ public product1 = products.find(({ key }) => {
+ return key === 'ghostfolio';
+ });
+
+ public product2 = products.find(({ key }) => {
+ return key === 'portfolio-visualizer';
+ });
+
+ public routerLinkAbout = ['/' + $localize`about`];
+ public routerLinkFeatures = ['/' + $localize`features`];
+ public routerLinkResourcesPersonalFinanceTools = [
+ '/' + $localize`resources`,
+ 'personal-finance-tools'
+ ];
+}
diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/stock-events-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/stock-events-page.component.ts
new file mode 100644
index 000000000..ea8aa753b
--- /dev/null
+++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/stock-events-page.component.ts
@@ -0,0 +1,32 @@
+import { CommonModule } from '@angular/common';
+import { Component } from '@angular/core';
+import { MatButtonModule } from '@angular/material/button';
+import { RouterModule } from '@angular/router';
+
+import { products } from '../products';
+import { BaseProductPageComponent } from './base-page.component';
+
+@Component({
+ host: { class: 'page' },
+ imports: [CommonModule, MatButtonModule, RouterModule],
+ selector: 'gf-stock-events-page',
+ standalone: true,
+ styleUrls: ['../product-page-template.scss'],
+ templateUrl: '../product-page-template.html'
+})
+export class StockEventsPageComponent extends BaseProductPageComponent {
+ public product1 = products.find(({ key }) => {
+ return key === 'ghostfolio';
+ });
+
+ public product2 = products.find(({ key }) => {
+ return key === 'stock-events';
+ });
+
+ public routerLinkAbout = ['/' + $localize`about`];
+ public routerLinkFeatures = ['/' + $localize`features`];
+ public routerLinkResourcesPersonalFinanceTools = [
+ '/' + $localize`resources`,
+ 'personal-finance-tools'
+ ];
+}
diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/products/wallmine-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/products/wallmine-page.component.ts
new file mode 100644
index 000000000..5c75c80fb
--- /dev/null
+++ b/apps/client/src/app/pages/resources/personal-finance-tools/products/wallmine-page.component.ts
@@ -0,0 +1,32 @@
+import { CommonModule } from '@angular/common';
+import { Component } from '@angular/core';
+import { MatButtonModule } from '@angular/material/button';
+import { RouterModule } from '@angular/router';
+
+import { products } from '../products';
+import { BaseProductPageComponent } from './base-page.component';
+
+@Component({
+ host: { class: 'page' },
+ imports: [CommonModule, MatButtonModule, RouterModule],
+ selector: 'gf-wallmine-page',
+ standalone: true,
+ styleUrls: ['../product-page-template.scss'],
+ templateUrl: '../product-page-template.html'
+})
+export class WallminePageComponent extends BaseProductPageComponent {
+ public product1 = products.find(({ key }) => {
+ return key === 'ghostfolio';
+ });
+
+ public product2 = products.find(({ key }) => {
+ return key === 'wallmine';
+ });
+
+ public routerLinkAbout = ['/' + $localize`about`];
+ public routerLinkFeatures = ['/' + $localize`features`];
+ public routerLinkResourcesPersonalFinanceTools = [
+ '/' + $localize`resources`,
+ 'personal-finance-tools'
+ ];
+}