Browse Source

Merge branch 'main' into patch-1

pull/2586/head
Thomas Kaul 2 years ago
committed by GitHub
parent
commit
67d4595b92
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      CHANGELOG.md
  2. 5
      apps/api/src/app/order/create-order.dto.ts
  3. 6
      apps/api/src/app/order/update-order.dto.ts
  4. 32
      apps/api/src/assets/sitemap.xml
  5. 7
      apps/client/src/app/components/user-account-membership/user-account-membership.html
  6. 1
      apps/client/src/app/components/user-account-membership/user-account-membership.scss
  7. 4
      apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts
  8. 10
      apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts
  9. 4
      apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html
  10. 20
      apps/client/src/app/pages/resources/personal-finance-tools/products.ts
  11. 31
      apps/client/src/app/pages/resources/personal-finance-tools/products/eightfigures-page.component.ts
  12. 31
      apps/client/src/app/pages/resources/personal-finance-tools/products/rocket-money-page.component.ts
  13. 1
      libs/common/src/lib/interfaces/product.ts
  14. 6
      test/import/ok.csv

4
CHANGELOG.md

@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Added a new tag with the major version to the docker image on _Docker Hub_ - Added a new tag with the major version to the docker image on _Docker Hub_
### Fixed
- Loosened the validation in the activities import (expects values greater than or equal to 0 for `fee`, `quantity` and `unitPrice`)
## 2.17.0 - 2023-11-02 ## 2.17.0 - 2023-11-02
### Added ### Added

5
apps/api/src/app/order/create-order.dto.ts

@ -13,7 +13,6 @@ import {
IsISO8601, IsISO8601,
IsNumber, IsNumber,
IsOptional, IsOptional,
IsPositive,
IsString, IsString,
Min Min
} from 'class-validator'; } from 'class-validator';
@ -54,7 +53,7 @@ export class CreateOrderDto {
fee: number; fee: number;
@IsNumber() @IsNumber()
@IsPositive() @Min(0)
quantity: number; quantity: number;
@IsString() @IsString()
@ -68,7 +67,7 @@ export class CreateOrderDto {
type: Type; type: Type;
@IsNumber() @IsNumber()
@IsPositive() @Min(0)
unitPrice: number; unitPrice: number;
@IsBoolean() @IsBoolean()

6
apps/api/src/app/order/update-order.dto.ts

@ -8,12 +8,10 @@ import {
import { Transform, TransformFnParams } from 'class-transformer'; import { Transform, TransformFnParams } from 'class-transformer';
import { import {
IsArray, IsArray,
IsBoolean,
IsEnum, IsEnum,
IsISO8601, IsISO8601,
IsNumber, IsNumber,
IsOptional, IsOptional,
IsPositive,
IsString, IsString,
Min Min
} from 'class-validator'; } from 'class-validator';
@ -56,7 +54,7 @@ export class UpdateOrderDto {
id: string; id: string;
@IsNumber() @IsNumber()
@IsPositive() @Min(0)
quantity: number; quantity: number;
@IsString() @IsString()
@ -70,6 +68,6 @@ export class UpdateOrderDto {
type: Type; type: Type;
@IsNumber() @IsNumber()
@IsPositive() @Min(0)
unitPrice: number; unitPrice: number;
} }

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

@ -54,6 +54,10 @@
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools</loc> <loc>https://ghostfol.io/de/ressourcen/personal-finance-tools</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url> </url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-8figures</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url> <url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-altoo</loc> <loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-altoo</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
@ -146,6 +150,10 @@
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-projectionlab</loc> <loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-projectionlab</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url> </url>
<url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-rocket-money</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url> <url>
<loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-seeking-alpha</loc> <loc>https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-seeking-alpha</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
@ -324,6 +332,10 @@
<loc>https://ghostfol.io/en/resources/personal-finance-tools</loc> <loc>https://ghostfol.io/en/resources/personal-finance-tools</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url> </url>
<url>
<loc>https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-8figures</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url> <url>
<loc>https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-altoo</loc> <loc>https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-altoo</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
@ -416,6 +428,10 @@
<loc>https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-projectionlab</loc> <loc>https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-projectionlab</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url> </url>
<url>
<loc>https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-rocket-money</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url> <url>
<loc>https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-seeking-alpha</loc> <loc>https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-seeking-alpha</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
@ -622,6 +638,10 @@
<loc>https://ghostfol.io/it/risorse/personal-finance-tools</loc> <loc>https://ghostfol.io/it/risorse/personal-finance-tools</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url> </url>
<url>
<loc>https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-8figures</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url> <url>
<loc>https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-altoo</loc> <loc>https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-altoo</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
@ -714,6 +734,10 @@
<loc>https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-projectionlab</loc> <loc>https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-projectionlab</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url> </url>
<url>
<loc>https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-rocket-money</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url> <url>
<loc>https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-seeking-alpha</loc> <loc>https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-seeking-alpha</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
@ -766,6 +790,10 @@
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools</loc> <loc>https://ghostfol.io/nl/bronnen/personal-finance-tools</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url> </url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-8figures</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url> <url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-altoo</loc> <loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-altoo</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
@ -858,6 +886,10 @@
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-projectionlab</loc> <loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-projectionlab</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url> </url>
<url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-rocket-money</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url> <url>
<loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-seeking-alpha</loc> <loc>https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-seeking-alpha</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod> <lastmod>${currentDate}T00:00:00+00:00</lastmod>

7
apps/client/src/app/components/user-account-membership/user-account-membership.html

@ -1,6 +1,5 @@
<div class="container"> <div class="align-items-center container d-flex h-100 justify-content-center">
<h1 class="d-none d-sm-block h3 mb-3 text-center" i18n>Membership</h1> <div class="row w-100">
<div class="row">
<div class="col"> <div class="col">
<div class="align-items-center d-flex flex-column"> <div class="align-items-center d-flex flex-column">
<gf-membership-card <gf-membership-card
@ -34,7 +33,7 @@
>&nbsp;<span i18n>per year</span> >&nbsp;<span i18n>per year</span>
</div> </div>
</ng-container> </ng-container>
<div class="align-items-center d-flex justfiy-content-center mt-4"> <div class="align-items-center d-flex justify-content-center mt-4">
<a <a
*ngIf="!user?.subscription?.expiresAt" *ngIf="!user?.subscription?.expiresAt"
class="mx-1" class="mx-1"

1
apps/client/src/app/components/user-account-membership/user-account-membership.scss

@ -1,6 +1,7 @@
:host { :host {
color: rgb(var(--dark-primary-text)); color: rgb(var(--dark-primary-text));
display: block; display: block;
height: 100%;
} }
:host-context(.is-dark-theme) { :host-context(.is-dark-theme) {

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

@ -16,10 +16,10 @@ const routes: Routes = [
.filter(({ key }) => { .filter(({ key }) => {
return key !== 'ghostfolio'; return key !== 'ghostfolio';
}) })
.map(({ component, key, name }) => { .map(({ alias, component, key, name }) => {
return { return {
canActivate: [AuthGuard], canActivate: [AuthGuard],
path: $localize`open-source-alternative-to` + `-${key}`, path: $localize`open-source-alternative-to` + `-${alias ?? key}`,
loadComponent: () => loadComponent: () =>
import(`./products/${key}-page.component`).then(() => component), import(`./products/${key}-page.component`).then(() => component),
title: $localize`Open Source Alternative to ${name}` title: $localize`Open Source Alternative to ${name}`

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

@ -12,9 +12,13 @@ import { products } from './products';
export class PersonalFinanceToolsPageComponent implements OnDestroy { export class PersonalFinanceToolsPageComponent implements OnDestroy {
public pathAlternativeTo = $localize`open-source-alternative-to` + '-'; public pathAlternativeTo = $localize`open-source-alternative-to` + '-';
public pathResources = '/' + $localize`resources`; public pathResources = '/' + $localize`resources`;
public products = products.filter(({ key }) => { public products = products
return key !== 'ghostfolio'; .filter(({ key }) => {
}); return key !== 'ghostfolio';
})
.sort((a, b) => {
return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' });
});
public routerLinkAbout = ['/' + $localize`about`]; public routerLinkAbout = ['/' + $localize`about`];
private unsubscribeSubject = new Subject<void>(); private unsubscribeSubject = new Subject<void>();

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

@ -28,8 +28,8 @@
<div class="flex-nowrap no-gutters row"> <div class="flex-nowrap no-gutters row">
<a <a
class="d-flex overflow-hidden w-100" class="d-flex overflow-hidden w-100"
title="Compare Ghostfolio to {{ product.name }}" title="Compare Ghostfolio to {{ product.name }} - {{ product.slogan }}"
[routerLink]="[pathResources, 'personal-finance-tools', pathAlternativeTo + product.key]" [routerLink]="[pathResources, 'personal-finance-tools', pathAlternativeTo + (product.alias ?? product.key)]"
> >
<div class="flex-grow-1 overflow-hidden"> <div class="flex-grow-1 overflow-hidden">
<div class="h6 m-0 text-truncate" i18n> <div class="h6 m-0 text-truncate" i18n>

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

@ -7,6 +7,7 @@ import { CapMonPageComponent } from './products/capmon-page.component';
import { CopilotMoneyPageComponent } from './products/copilot-money-page.component'; import { CopilotMoneyPageComponent } from './products/copilot-money-page.component';
import { DeltaPageComponent } from './products/delta-page.component'; import { DeltaPageComponent } from './products/delta-page.component';
import { DivvyDiaryPageComponent } from './products/divvydiary-page.component'; import { DivvyDiaryPageComponent } from './products/divvydiary-page.component';
import { EightFiguresPageComponent } from './products/eightfigures-page.component';
import { ExirioPageComponent } from './products/exirio-page.component'; import { ExirioPageComponent } from './products/exirio-page.component';
import { FinaryPageComponent } from './products/finary-page.component'; import { FinaryPageComponent } from './products/finary-page.component';
import { FolisharePageComponent } from './products/folishare-page.component'; import { FolisharePageComponent } from './products/folishare-page.component';
@ -23,6 +24,7 @@ import { PlannixPageComponent } from './products/plannix-page.component';
import { PortfolioDividendTrackerPageComponent } from './products/portfolio-dividend-tracker-page.component'; import { PortfolioDividendTrackerPageComponent } from './products/portfolio-dividend-tracker-page.component';
import { PortseidoPageComponent } from './products/portseido-page.component'; import { PortseidoPageComponent } from './products/portseido-page.component';
import { ProjectionLabPageComponent } from './products/projectionlab-page.component'; import { ProjectionLabPageComponent } from './products/projectionlab-page.component';
import { RocketMoneyPageComponent } from './products/rocket-money-page.component';
import { SeekingAlphaPageComponent } from './products/seeking-alpha-page.component'; import { SeekingAlphaPageComponent } from './products/seeking-alpha-page.component';
import { SharesightPageComponent } from './products/sharesight-page.component'; import { SharesightPageComponent } from './products/sharesight-page.component';
import { SimplePortfolioPageComponent } from './products/simple-portfolio-page.component'; import { SimplePortfolioPageComponent } from './products/simple-portfolio-page.component';
@ -131,6 +133,15 @@ export const products: Product[] = [
pricingPerYear: '€65', pricingPerYear: '€65',
slogan: 'Your personal Dividend Calendar' slogan: 'Your personal Dividend Calendar'
}, },
{
alias: '8figures',
component: EightFiguresPageComponent,
founded: 2022,
key: 'eightfigures',
name: '8FIGURES',
origin: $localize`United States`,
slogan: 'Portfolio Tracker Designed by Professional Investors'
},
{ {
component: ExirioPageComponent, component: ExirioPageComponent,
founded: 2020, founded: 2020,
@ -307,6 +318,15 @@ export const products: Product[] = [
pricingPerYear: '$108', pricingPerYear: '$108',
slogan: 'Build Financial Plans You Love.' slogan: 'Build Financial Plans You Love.'
}, },
{
component: RocketMoneyPageComponent,
founded: 2015,
hasSelfHostingAbility: false,
key: 'rocket-money',
name: 'Rocket Money',
origin: $localize`United States`,
slogan: 'Track your net worth'
},
{ {
component: SeekingAlphaPageComponent, component: SeekingAlphaPageComponent,
founded: 2004, founded: 2004,

31
apps/client/src/app/pages/resources/personal-finance-tools/products/eightfigures-page.component.ts

@ -0,0 +1,31 @@
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';
@Component({
host: { class: 'page' },
imports: [CommonModule, MatButtonModule, RouterModule],
selector: 'gf-eightfigures-page',
standalone: true,
styleUrls: ['../product-page-template.scss'],
templateUrl: '../product-page-template.html'
})
export class EightFiguresPageComponent {
public product1 = products.find(({ key }) => {
return key === 'ghostfolio';
});
public product2 = products.find(({ key }) => {
return key === 'eightfigures';
});
public routerLinkAbout = ['/' + $localize`about`];
public routerLinkFeatures = ['/' + $localize`features`];
public routerLinkResourcesPersonalFinanceTools = [
'/' + $localize`resources`,
'personal-finance-tools'
];
}

31
apps/client/src/app/pages/resources/personal-finance-tools/products/rocket-money-page.component.ts

@ -0,0 +1,31 @@
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';
@Component({
host: { class: 'page' },
imports: [CommonModule, MatButtonModule, RouterModule],
selector: 'gf-rocket-money-page',
standalone: true,
styleUrls: ['../product-page-template.scss'],
templateUrl: '../product-page-template.html'
})
export class RocketMoneyPageComponent {
public product1 = products.find(({ key }) => {
return key === 'ghostfolio';
});
public product2 = products.find(({ key }) => {
return key === 'rocket-money';
});
public routerLinkAbout = ['/' + $localize`about`];
public routerLinkFeatures = ['/' + $localize`features`];
public routerLinkResourcesPersonalFinanceTools = [
'/' + $localize`resources`,
'personal-finance-tools'
];
}

1
libs/common/src/lib/interfaces/product.ts

@ -1,4 +1,5 @@
export interface Product { export interface Product {
alias?: string;
component: any; component: any;
founded?: number; founded?: number;
hasFreePlan?: boolean; hasFreePlan?: boolean;

6
test/import/ok.csv

@ -1,6 +1,6 @@
Date,Code,DataSource,Currency,Price,Quantity,Action,Fee,Note Date,Code,DataSource,Currency,Price,Quantity,Action,Fee,Note
01-09-2021,Account Opening Fee,MANUAL,USD,0,0,fee,49, 01-09-2021,Account Opening Fee,MANUAL,USD,0,0,fee,49,
16-09-2021,MSFT,YAHOO,USD,298.580,5,buy,19.00,My first order 🤓 16-09-2021,MSFT,YAHOO,USD,298.580,5,buy,19.00,My first order 🤓
17/11/2021,MSFT,YAHOO,USD,0.62,5,dividend,0.00 17/11/2021,MSFT,YAHOO,USD,0.62,5,dividend,0.00,
01.01.2022,Penthouse Apartment,MANUAL,USD,500000.0,1,item,0.00 01.01.2022,Penthouse Apartment,MANUAL,USD,500000.0,1,item,0.00,
20500606,MSFT,YAHOO,USD,0.00,0,buy,0.00 20500606,MSFT,YAHOO,USD,0.00,0,buy,0.00,

Can't render this file because it has a wrong number of fields in line 4.
Loading…
Cancel
Save