Browse Source

Merge branch 'main' into french-updates

pull/2057/head
Thomas Kaul 2 years ago
committed by GitHub
parent
commit
9f2cf97150
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      .github/workflows/build-code.yml
  2. 2
      .nvmrc
  3. 12
      CHANGELOG.md
  4. 4
      Dockerfile
  5. 2
      README.md
  6. 361
      apps/api/src/assets/cryptocurrencies/cryptocurrencies.json
  7. 11
      apps/client/src/app/app.component.html
  8. 6
      apps/client/src/app/app.component.ts
  9. 6
      apps/client/src/app/components/access-table/access-table.component.html
  10. 2
      apps/client/src/app/components/accounts-table/accounts-table.component.html
  11. 2
      apps/client/src/app/components/admin-jobs/admin-jobs.html
  12. 2
      apps/client/src/app/components/admin-market-data/admin-market-data.html
  13. 2
      apps/client/src/app/components/admin-platform/admin-platform.component.html
  14. 2
      apps/client/src/app/components/admin-users/admin-users.html
  15. 4
      apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html
  16. 15
      apps/client/src/app/pages/about/about-page-routing.module.ts
  17. 7
      apps/client/src/app/pages/about/about-page.component.ts
  18. 2
      apps/client/src/app/pages/about/changelog/changelog-page-routing.module.ts
  19. 21
      apps/client/src/app/pages/about/changelog/changelog-page.html
  20. 4
      apps/client/src/app/pages/about/changelog/changelog-page.module.ts
  21. 42
      apps/client/src/app/pages/about/changelog/changelog-page.scss
  22. 20
      apps/client/src/app/pages/about/license/license-page-routing.module.ts
  23. 19
      apps/client/src/app/pages/about/license/license-page.component.ts
  24. 10
      apps/client/src/app/pages/about/license/license-page.html
  25. 13
      apps/client/src/app/pages/about/license/license-page.module.ts
  26. 8
      apps/client/src/app/pages/about/license/license-page.scss
  27. 2
      apps/client/src/app/pages/about/overview/about-overview-page.component.ts
  28. 6
      apps/client/src/app/pages/about/overview/about-overview-page.html
  29. 8
      apps/client/src/app/pages/about/overview/about-overview-page.module.ts
  30. 1
      apps/client/src/app/pages/portfolio/activities/activities-page.component.ts
  31. 24
      apps/client/src/assets/sitemap.xml
  32. 2
      libs/ui/src/lib/activities-table/activities-table.component.html
  33. 4
      package.json

2
.github/workflows/build-code.yml

@ -10,7 +10,7 @@ jobs:
strategy: strategy:
matrix: matrix:
node_version: node_version:
- 16 - 18
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v3 uses: actions/checkout@v3

2
.nvmrc

@ -1 +1 @@
v16 v18

12
CHANGELOG.md

@ -11,6 +11,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Improved the language localization for French (`fr`) - Improved the language localization for French (`fr`)
## 1.278.0 - 2023-06-09
### Changed
- Extended the clone functionality of a transaction by the quantity
- Changed the direction of the ellipsis icon in various tables
- Extracted the license to a dedicated tab on the about page
- Displayed the link to the markets overview in the footer based on a permission
- Improved the spacing in the benchmark comparator
- Refreshed the cryptocurrencies list
- Upgraded `Node.js` from version `16` to `18` (`Dockerfile`)
## 1.277.0 - 2023-06-07 ## 1.277.0 - 2023-06-07
### Added ### Added

4
Dockerfile

@ -1,4 +1,4 @@
FROM --platform=$BUILDPLATFORM node:16-slim as builder FROM --platform=$BUILDPLATFORM node:18-slim as builder
# Build application and add additional files # Build application and add additional files
WORKDIR /ghostfolio WORKDIR /ghostfolio
@ -50,7 +50,7 @@ COPY package.json /ghostfolio/dist/apps/api
RUN yarn database:generate-typings RUN yarn database:generate-typings
# Image to run, copy everything needed from builder # Image to run, copy everything needed from builder
FROM node:16-slim FROM node:18-slim
RUN apt update && apt install -y \ RUN apt update && apt install -y \
openssl \ openssl \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*

2
README.md

@ -145,7 +145,7 @@ Please follow the instructions of the Ghostfolio [Unraid Community App](https://
### Prerequisites ### Prerequisites
- [Docker](https://www.docker.com/products/docker-desktop) - [Docker](https://www.docker.com/products/docker-desktop)
- [Node.js](https://nodejs.org/en/download) (version 16) - [Node.js](https://nodejs.org/en/download) (version 18+)
- [Yarn](https://yarnpkg.com/en/docs/install) - [Yarn](https://yarnpkg.com/en/docs/install)
- Create a local copy of this Git repository (clone) - Create a local copy of this Git repository (clone)
- Copy the file `.env.example` to `.env` and populate it with your data (`cp .env.example .env`) - Copy the file `.env.example` to `.env` and populate it with your data (`cp .env.example .env`)

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

File diff suppressed because it is too large

11
apps/client/src/app/app.component.html

@ -66,7 +66,9 @@
<div class="col-sm"> <div class="col-sm">
<div class="h6 mt-2" i18n>Personal Finance</div> <div class="h6 mt-2" i18n>Personal Finance</div>
<ul class="list-unstyled"> <ul class="list-unstyled">
<li><a i18n [routerLink]="['/markets']">Markets</a></li> <li *ngIf="hasPermissionToAccessFearAndGreedIndex">
<a i18n [routerLink]="['/markets']">Markets</a>
</li>
<li><a i18n [routerLink]="['/resources']">Resources</a></li> <li><a i18n [routerLink]="['/resources']">Resources</a></li>
</ul> </ul>
</div> </div>
@ -78,14 +80,15 @@
<a i18n [routerLink]="['/blog']">Blog</a> <a i18n [routerLink]="['/blog']">Blog</a>
</li> </li>
<li> <li>
<a i18n [routerLink]="['/about', 'changelog']" <a i18n [routerLink]="['/about', 'changelog']">Changelog</a>
>Changelog & License</a
>
</li> </li>
<li><a i18n [routerLink]="['/features']">Features</a></li> <li><a i18n [routerLink]="['/features']">Features</a></li>
<li *ngIf="hasPermissionForSubscription"> <li *ngIf="hasPermissionForSubscription">
<a i18n [routerLink]="['/faq']">Frequently Asked Questions (FAQ)</a> <a i18n [routerLink]="['/faq']">Frequently Asked Questions (FAQ)</a>
</li> </li>
<li>
<a i18n [routerLink]="['/about', 'license']">License</a>
</li>
<li *ngIf="hasPermissionForSubscription"> <li *ngIf="hasPermissionForSubscription">
<a [routerLink]="['/open']">Open Startup</a> <a [routerLink]="['/open']">Open Startup</a>
</li> </li>

6
apps/client/src/app/app.component.ts

@ -34,6 +34,7 @@ export class AppComponent implements OnDestroy, OnInit {
public deviceType: string; public deviceType: string;
public hasPermissionForBlog: boolean; public hasPermissionForBlog: boolean;
public hasPermissionForSubscription: boolean; public hasPermissionForSubscription: boolean;
public hasPermissionToAccessFearAndGreedIndex: boolean;
public info: InfoItem; public info: InfoItem;
public pageTitle: string; public pageTitle: string;
public user: User; public user: User;
@ -69,6 +70,11 @@ export class AppComponent implements OnDestroy, OnInit {
permissions.enableSubscription permissions.enableSubscription
); );
this.hasPermissionToAccessFearAndGreedIndex = hasPermission(
this.info?.globalPermissions,
permissions.enableFearAndGreedIndex
);
this.router.events this.router.events
.pipe(filter((event) => event instanceof NavigationEnd)) .pipe(filter((event) => event instanceof NavigationEnd))
.subscribe(() => { .subscribe(() => {

6
apps/client/src/app/components/access-table/access-table.component.html

@ -47,7 +47,7 @@
[matMenuTriggerFor]="transactionMenu" [matMenuTriggerFor]="transactionMenu"
(click)="$event.stopPropagation()" (click)="$event.stopPropagation()"
> >
<ion-icon name="ellipsis-vertical"></ion-icon> <ion-icon name="ellipsis-horizontal"></ion-icon>
</button> </button>
<mat-menu #transactionMenu="matMenu" xPosition="before"> <mat-menu #transactionMenu="matMenu" xPosition="before">
<button mat-menu-item (click)="onDeleteAccess(element.id)"> <button mat-menu-item (click)="onDeleteAccess(element.id)">
@ -57,6 +57,6 @@
</td> </td>
</ng-container> </ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr> <tr *matHeaderRowDef="displayedColumns" mat-header-row></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns"></tr> <tr *matRowDef="let row; columns: displayedColumns" mat-row></tr>
</table> </table>

2
apps/client/src/app/components/accounts-table/accounts-table.component.html

@ -216,7 +216,7 @@
[matMenuTriggerFor]="accountMenu" [matMenuTriggerFor]="accountMenu"
(click)="$event.stopPropagation()" (click)="$event.stopPropagation()"
> >
<ion-icon name="ellipsis-vertical"></ion-icon> <ion-icon name="ellipsis-horizontal"></ion-icon>
</button> </button>
<mat-menu #accountMenu="matMenu" xPosition="before"> <mat-menu #accountMenu="matMenu" xPosition="before">
<button mat-menu-item (click)="onUpdateAccount(element)"> <button mat-menu-item (click)="onUpdateAccount(element)">

2
apps/client/src/app/components/admin-jobs/admin-jobs.html

@ -108,7 +108,7 @@
[matMenuTriggerFor]="jobActionsMenu" [matMenuTriggerFor]="jobActionsMenu"
(click)="$event.stopPropagation()" (click)="$event.stopPropagation()"
> >
<ion-icon name="ellipsis-vertical"></ion-icon> <ion-icon name="ellipsis-horizontal"></ion-icon>
</button> </button>
<mat-menu #jobActionsMenu="matMenu" xPosition="before"> <mat-menu #jobActionsMenu="matMenu" xPosition="before">
<button mat-menu-item (click)="onViewData(job.data)"> <button mat-menu-item (click)="onViewData(job.data)">

2
apps/client/src/app/components/admin-market-data/admin-market-data.html

@ -140,7 +140,7 @@
[matMenuTriggerFor]="assetProfileActionsMenu" [matMenuTriggerFor]="assetProfileActionsMenu"
(click)="$event.stopPropagation()" (click)="$event.stopPropagation()"
> >
<ion-icon name="ellipsis-vertical"></ion-icon> <ion-icon name="ellipsis-horizontal"></ion-icon>
</button> </button>
<mat-menu #assetProfileActionsMenu="matMenu" xPosition="before"> <mat-menu #assetProfileActionsMenu="matMenu" xPosition="before">
<button <button

2
apps/client/src/app/components/admin-platform/admin-platform.component.html

@ -82,7 +82,7 @@
[matMenuTriggerFor]="platformMenu" [matMenuTriggerFor]="platformMenu"
(click)="$event.stopPropagation()" (click)="$event.stopPropagation()"
> >
<ion-icon name="ellipsis-vertical"></ion-icon> <ion-icon name="ellipsis-horizontal"></ion-icon>
</button> </button>
<mat-menu #platformMenu="matMenu" xPosition="before"> <mat-menu #platformMenu="matMenu" xPosition="before">
<button mat-menu-item (click)="onUpdatePlatform(element)"> <button mat-menu-item (click)="onUpdatePlatform(element)">

2
apps/client/src/app/components/admin-users/admin-users.html

@ -109,7 +109,7 @@
[matMenuTriggerFor]="userMenu" [matMenuTriggerFor]="userMenu"
(click)="$event.stopPropagation()" (click)="$event.stopPropagation()"
> >
<ion-icon name="ellipsis-vertical"></ion-icon> <ion-icon name="ellipsis-horizontal"></ion-icon>
</button> </button>
<mat-menu #userMenu="matMenu" xPosition="before"> <mat-menu #userMenu="matMenu" xPosition="before">
<button <button

4
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html

@ -1,6 +1,8 @@
<div class="mb-2 row"> <div class="mb-2 row">
<div class="col-md-6 col-xs-12 d-flex"> <div class="col-md-6 col-xs-12 d-flex">
<div class="align-items-center d-flex flex-grow-1 h5 mb-0 text-truncate"> <div
class="align-items-center d-flex flex-grow-1 h5 mb-0 py-2 text-truncate"
>
<span i18n>Performance</span> <span i18n>Performance</span>
<gf-premium-indicator <gf-premium-indicator
*ngIf="user?.subscription?.type === 'Basic'" *ngIf="user?.subscription?.type === 'Basic'"

15
apps/client/src/app/pages/about/about-page-routing.module.ts

@ -22,6 +22,21 @@ const routes: Routes = [
(m) => m.ChangelogPageModule (m) => m.ChangelogPageModule
) )
}, },
...[
'license',
/////
'licence',
'licencia',
'licentie',
'lizenz',
'licenza'
].map((path) => ({
path,
loadChildren: () =>
import('./license/license-page.module').then(
(m) => m.LicensePageModule
)
})),
{ {
path: 'privacy-policy', path: 'privacy-policy',
loadChildren: () => loadChildren: () =>

7
apps/client/src/app/pages/about/about-page.component.ts

@ -53,9 +53,14 @@ export class AboutPageComponent implements OnDestroy, OnInit {
}, },
{ {
iconName: 'sparkles-outline', iconName: 'sparkles-outline',
label: $localize`Changelog & License`, label: $localize`Changelog`,
path: ['/about', 'changelog'] path: ['/about', 'changelog']
}, },
{
iconName: 'ribbon-outline',
label: $localize`License`,
path: ['/about', 'license']
},
{ {
iconName: 'shield-checkmark-outline', iconName: 'shield-checkmark-outline',
label: $localize`Privacy Policy`, label: $localize`Privacy Policy`,

2
apps/client/src/app/pages/about/changelog/changelog-page-routing.module.ts

@ -9,7 +9,7 @@ const routes: Routes = [
canActivate: [AuthGuard], canActivate: [AuthGuard],
component: ChangelogPageComponent, component: ChangelogPageComponent,
path: '', path: '',
title: $localize`Changelog & License` title: $localize`Changelog`
} }
]; ];

21
apps/client/src/app/pages/about/changelog/changelog-page.html

@ -1,23 +1,10 @@
<div class="container"> <div class="container">
<div class="mb-5 row"> <div class="mb-5 row">
<div class="col"> <div class="col">
<h3 class="mb-3 text-center" i18n>Changelog</h3> <h1 class="d-none d-sm-block h3 mb-3 text-center" i18n>Changelog</h1>
<mat-card appearance="outlined" class="changelog"> <div class="changelog">
<mat-card-content> <markdown [src]="'../assets/CHANGELOG.md'"></markdown>
<markdown [src]="'../assets/CHANGELOG.md'"></markdown> </div>
</mat-card-content>
</mat-card>
</div>
</div>
<div class="row">
<div class="col">
<h3 class="mb-3 text-center" i18n>License</h3>
<mat-card appearance="outlined">
<mat-card-content>
<markdown [src]="'../assets/LICENSE'"></markdown>
</mat-card-content>
</mat-card>
</div> </div>
</div> </div>
</div> </div>

4
apps/client/src/app/pages/about/changelog/changelog-page.module.ts

@ -1,6 +1,5 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { MatCardModule } from '@angular/material/card';
import { MarkdownModule } from 'ngx-markdown'; import { MarkdownModule } from 'ngx-markdown';
import { ChangelogPageRoutingModule } from './changelog-page-routing.module'; import { ChangelogPageRoutingModule } from './changelog-page-routing.module';
@ -11,8 +10,7 @@ import { ChangelogPageComponent } from './changelog-page.component';
imports: [ imports: [
ChangelogPageRoutingModule, ChangelogPageRoutingModule,
CommonModule, CommonModule,
MarkdownModule.forChild(), MarkdownModule.forChild()
MatCardModule
], ],
schemas: [CUSTOM_ELEMENTS_SCHEMA] schemas: [CUSTOM_ELEMENTS_SCHEMA]
}) })

42
apps/client/src/app/pages/about/changelog/changelog-page.scss

@ -2,35 +2,33 @@
color: rgb(var(--dark-primary-text)); color: rgb(var(--dark-primary-text));
display: block; display: block;
.mat-mdc-card { .changelog {
&.changelog { ::ng-deep {
::ng-deep { a {
a { color: rgba(var(--palette-primary-500), 1);
color: rgba(var(--palette-primary-500), 1); font-weight: 500;
font-weight: 500;
&:hover { &:hover {
color: rgba(var(--palette-primary-300), 1); color: rgba(var(--palette-primary-300), 1);
}
} }
}
markdown { markdown {
h1, h1,
p { p {
display: none; display: none;
} }
h2 { h2 {
font-size: 18px; font-size: 18px;
&:not(:first-of-type) { &:not(:first-of-type) {
margin-top: 2rem; margin-top: 2rem;
}
} }
}
h3 { h3 {
font-size: 15px; font-size: 15px;
}
} }
} }
} }

20
apps/client/src/app/pages/about/license/license-page-routing.module.ts

@ -0,0 +1,20 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { LicensePageComponent } from './license-page.component';
const routes: Routes = [
{
canActivate: [AuthGuard],
component: LicensePageComponent,
path: '',
title: $localize`License`
}
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class LicensePageRoutingModule {}

19
apps/client/src/app/pages/about/license/license-page.component.ts

@ -0,0 +1,19 @@
import { Component, OnDestroy } from '@angular/core';
import { Subject } from 'rxjs';
@Component({
host: { class: 'page' },
selector: 'gf-license-page',
styleUrls: ['./license-page.scss'],
templateUrl: './license-page.html'
})
export class LicensePageComponent implements OnDestroy {
private unsubscribeSubject = new Subject<void>();
public constructor() {}
public ngOnDestroy() {
this.unsubscribeSubject.next();
this.unsubscribeSubject.complete();
}
}

10
apps/client/src/app/pages/about/license/license-page.html

@ -0,0 +1,10 @@
<div class="container">
<div class="mb-5 row">
<div class="col">
<h1 class="d-none d-sm-block h3 mb-3 text-center" i18n>License</h1>
<div>
<markdown [src]="'../assets/LICENSE'"></markdown>
</div>
</div>
</div>
</div>

13
apps/client/src/app/pages/about/license/license-page.module.ts

@ -0,0 +1,13 @@
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { MarkdownModule } from 'ngx-markdown';
import { LicensePageRoutingModule } from './license-page-routing.module';
import { LicensePageComponent } from './license-page.component';
@NgModule({
declarations: [LicensePageComponent],
imports: [LicensePageRoutingModule, CommonModule, MarkdownModule.forChild()],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class LicensePageModule {}

8
apps/client/src/app/pages/about/license/license-page.scss

@ -0,0 +1,8 @@
:host {
color: rgb(var(--dark-primary-text));
display: block;
}
:host-context(.is-dark-theme) {
color: rgb(var(--light-primary-text));
}

2
apps/client/src/app/pages/about/overview/about-overview-page.component.ts

@ -2,7 +2,6 @@ import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { environment } from '@ghostfolio/client/../environments/environment'; import { environment } from '@ghostfolio/client/../environments/environment';
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config';
import { User } from '@ghostfolio/common/interfaces'; import { User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
@ -15,7 +14,6 @@ import { takeUntil } from 'rxjs/operators';
templateUrl: './about-overview-page.html' templateUrl: './about-overview-page.html'
}) })
export class AboutOverviewPageComponent implements OnDestroy, OnInit { export class AboutOverviewPageComponent implements OnDestroy, OnInit {
public defaultLanguageCode = DEFAULT_LANGUAGE_CODE;
public hasPermissionForBlog: boolean; public hasPermissionForBlog: boolean;
public hasPermissionForSubscription: boolean; public hasPermissionForSubscription: boolean;
public isLoggedIn: boolean; public isLoggedIn: boolean;

6
apps/client/src/app/pages/about/overview/about-overview-page.html

@ -20,11 +20,7 @@
>AGPL-3.0 license</a >AGPL-3.0 license</a
> >
and we share aggregated and we share aggregated
<a <a title="Open Startup" [routerLink]="['/open']">key metrics</a>
href="https://ghostfol.io/{{ defaultLanguageCode }}/open"
title="Open Startup"
>key metrics</a
>
of the platform’s performance. The project has been initiated by of the platform’s performance. The project has been initiated by
<a href="https://dotsilver.ch" title="Website of Thomas Kaul" <a href="https://dotsilver.ch" title="Website of Thomas Kaul"
>Thomas Kaul</a >Thomas Kaul</a

8
apps/client/src/app/pages/about/overview/about-overview-page.module.ts

@ -1,13 +1,19 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { RouterModule } from '@angular/router';
import { AboutOverviewPageRoutingModule } from './about-overview-page-routing.module'; import { AboutOverviewPageRoutingModule } from './about-overview-page-routing.module';
import { AboutOverviewPageComponent } from './about-overview-page.component'; import { AboutOverviewPageComponent } from './about-overview-page.component';
@NgModule({ @NgModule({
declarations: [AboutOverviewPageComponent], declarations: [AboutOverviewPageComponent],
imports: [AboutOverviewPageRoutingModule, CommonModule, MatButtonModule], imports: [
AboutOverviewPageRoutingModule,
CommonModule,
MatButtonModule,
RouterModule
],
schemas: [CUSTOM_ELEMENTS_SCHEMA] schemas: [CUSTOM_ELEMENTS_SCHEMA]
}) })
export class AboutOverviewPageModule {} export class AboutOverviewPageModule {}

1
apps/client/src/app/pages/portfolio/activities/activities-page.component.ts

@ -291,7 +291,6 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit {
date: new Date(), date: new Date(),
id: null, id: null,
fee: 0, fee: 0,
quantity: null,
type: aActivity?.type ?? 'BUY', type: aActivity?.type ?? 'BUY',
unitPrice: null unitPrice: null
}, },

24
apps/client/src/assets/sitemap.xml

@ -58,6 +58,10 @@
<loc>https://ghostfol.io/de/ueber-uns/changelog</loc> <loc>https://ghostfol.io/de/ueber-uns/changelog</loc>
<lastmod>2023-06-01T00:00:00+00:00</lastmod> <lastmod>2023-06-01T00:00:00+00:00</lastmod>
</url> </url>
<url>
<loc>https://ghostfol.io/de/ueber-uns/lizenz</loc>
<lastmod>2023-06-01T00:00:00+00:00</lastmod>
</url>
<url> <url>
<loc>https://ghostfol.io/en</loc> <loc>https://ghostfol.io/en</loc>
<lastmod>2023-06-01T00:00:00+00:00</lastmod> <lastmod>2023-06-01T00:00:00+00:00</lastmod>
@ -70,6 +74,10 @@
<loc>https://ghostfol.io/en/about/changelog</loc> <loc>https://ghostfol.io/en/about/changelog</loc>
<lastmod>2023-06-01T00:00:00+00:00</lastmod> <lastmod>2023-06-01T00:00:00+00:00</lastmod>
</url> </url>
<url>
<loc>https://ghostfol.io/en/about/license</loc>
<lastmod>2023-06-01T00:00:00+00:00</lastmod>
</url>
<url> <url>
<loc>https://ghostfol.io/en/blog</loc> <loc>https://ghostfol.io/en/blog</loc>
<lastmod>2023-06-01T00:00:00+00:00</lastmod> <lastmod>2023-06-01T00:00:00+00:00</lastmod>
@ -190,6 +198,10 @@
<loc>https://ghostfol.io/es/sobre/changelog</loc> <loc>https://ghostfol.io/es/sobre/changelog</loc>
<lastmod>2023-06-01T00:00:00+00:00</lastmod> <lastmod>2023-06-01T00:00:00+00:00</lastmod>
</url> </url>
<url>
<loc>https://ghostfol.io/es/sobre/licencia</loc>
<lastmod>2023-06-01T00:00:00+00:00</lastmod>
</url>
<url> <url>
<loc>https://ghostfol.io/es/sobre/politica-de-privacidad</loc> <loc>https://ghostfol.io/es/sobre/politica-de-privacidad</loc>
<lastmod>2023-06-01T00:00:00+00:00</lastmod> <lastmod>2023-06-01T00:00:00+00:00</lastmod>
@ -206,6 +218,10 @@
<loc>https://ghostfol.io/fr/a-propos/changelog</loc> <loc>https://ghostfol.io/fr/a-propos/changelog</loc>
<lastmod>2023-06-01T00:00:00+00:00</lastmod> <lastmod>2023-06-01T00:00:00+00:00</lastmod>
</url> </url>
<url>
<loc>https://ghostfol.io/fr/a-propos/licence</loc>
<lastmod>2023-06-01T00:00:00+00:00</lastmod>
</url>
<url> <url>
<loc>https://ghostfol.io/fr/a-propos/politique-de-confidentialite</loc> <loc>https://ghostfol.io/fr/a-propos/politique-de-confidentialite</loc>
<lastmod>2023-06-01T00:00:00+00:00</lastmod> <lastmod>2023-06-01T00:00:00+00:00</lastmod>
@ -260,6 +276,10 @@
<loc>https://ghostfol.io/it/informazioni-su/changelog</loc> <loc>https://ghostfol.io/it/informazioni-su/changelog</loc>
<lastmod>2023-06-01T00:00:00+00:00</lastmod> <lastmod>2023-06-01T00:00:00+00:00</lastmod>
</url> </url>
<url>
<loc>https://ghostfol.io/it/informazioni-su/licenza</loc>
<lastmod>2023-06-01T00:00:00+00:00</lastmod>
</url>
<url> <url>
<loc>https://ghostfol.io/it/informazioni-su/informativa-sulla-privacy</loc> <loc>https://ghostfol.io/it/informazioni-su/informativa-sulla-privacy</loc>
<lastmod>2023-06-01T00:00:00+00:00</lastmod> <lastmod>2023-06-01T00:00:00+00:00</lastmod>
@ -316,6 +336,10 @@
<loc>https://ghostfol.io/nl/over/changelog</loc> <loc>https://ghostfol.io/nl/over/changelog</loc>
<lastmod>2023-06-01T00:00:00+00:00</lastmod> <lastmod>2023-06-01T00:00:00+00:00</lastmod>
</url> </url>
<url>
<loc>https://ghostfol.io/nl/over/licentie</loc>
<lastmod>2023-06-01T00:00:00+00:00</lastmod>
</url>
<url> <url>
<loc>https://ghostfol.io/nl/over/privacybeleid</loc> <loc>https://ghostfol.io/nl/over/privacybeleid</loc>
<lastmod>2023-06-01T00:00:00+00:00</lastmod> <lastmod>2023-06-01T00:00:00+00:00</lastmod>

2
libs/ui/src/lib/activities-table/activities-table.component.html

@ -504,7 +504,7 @@
[matMenuTriggerFor]="activityMenu" [matMenuTriggerFor]="activityMenu"
(click)="$event.stopPropagation()" (click)="$event.stopPropagation()"
> >
<ion-icon name="ellipsis-vertical"></ion-icon> <ion-icon name="ellipsis-horizontal"></ion-icon>
</button> </button>
<mat-menu #activityMenu="matMenu" xPosition="before"> <mat-menu #activityMenu="matMenu" xPosition="before">
<button mat-menu-item (click)="onUpdateActivity(element)"> <button mat-menu-item (click)="onUpdateActivity(element)">

4
package.json

@ -1,6 +1,6 @@
{ {
"name": "ghostfolio", "name": "ghostfolio",
"version": "1.277.0", "version": "1.278.0",
"homepage": "https://ghostfol.io", "homepage": "https://ghostfol.io",
"license": "AGPL-3.0", "license": "AGPL-3.0",
"scripts": { "scripts": {
@ -198,7 +198,7 @@
"typescript": "4.9.5" "typescript": "4.9.5"
}, },
"engines": { "engines": {
"node": ">=16" "node": ">=18"
}, },
"importSort": { "importSort": {
".ts": { ".ts": {

Loading…
Cancel
Save