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' + ]; +}