Browse Source

Merge branch 'main' into bugfix/fix-big.js-exception-in-report-endpoint

pull/1586/head
Thomas Kaul 3 years ago
committed by GitHub
parent
commit
81713658f0
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 10
      CHANGELOG.md
  2. 73
      README.md
  3. 5
      apps/api/src/app/info/info.service.ts
  4. 2
      apps/client/src/app/app.component.scss
  5. 2
      apps/client/src/app/components/access-table/access-table.component.scss
  6. 2
      apps/client/src/app/components/accounts-table/accounts-table.component.scss
  7. 2
      apps/client/src/app/components/admin-jobs/admin-jobs.scss
  8. 2
      apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.scss
  9. 2
      apps/client/src/app/components/admin-market-data/admin-market-data.scss
  10. 2
      apps/client/src/app/components/admin-overview/admin-overview.scss
  11. 2
      apps/client/src/app/components/admin-users/admin-users.scss
  12. 2
      apps/client/src/app/components/header/header.component.scss
  13. 2
      apps/client/src/app/components/home-holdings/home-holdings.scss
  14. 2
      apps/client/src/app/components/home-market/home-market.scss
  15. 2
      apps/client/src/app/components/home-overview/home-overview.scss
  16. 2
      apps/client/src/app/components/home-summary/home-summary.scss
  17. 2
      apps/client/src/app/components/positions/positions.component.scss
  18. 9
      apps/client/src/app/components/world-map-chart/world-map-chart.component.ts
  19. 4
      apps/client/src/app/pages/account/account-page.html
  20. 2
      apps/client/src/app/pages/admin/admin-page.scss
  21. 2
      apps/client/src/app/pages/home/home-page.scss
  22. 18
      apps/client/src/app/pages/landing/landing-page.component.ts
  23. 15
      apps/client/src/app/pages/landing/landing-page.html
  24. 2
      apps/client/src/app/pages/landing/landing-page.module.ts
  25. 6
      apps/client/src/app/pages/landing/landing-page.scss
  26. 4
      apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
  27. 6
      apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
  28. 3
      apps/client/src/app/pages/portfolio/allocations/allocations-page.html
  29. 2
      apps/client/src/app/pages/portfolio/portfolio-page.scss
  30. 2
      apps/client/src/app/pages/zen/zen-page.scss
  31. 638
      apps/client/src/locales/messages.fr.xlf
  32. 4
      apps/client/src/styles.scss
  33. 74
      apps/client/src/styles/bootstrap.scss
  34. 2
      apps/client/src/styles/ghostfolio-style.scss
  35. 1
      libs/common/src/lib/config.ts
  36. 2
      libs/common/src/lib/interfaces/info-item.interface.ts
  37. 2
      libs/ui/src/lib/activities-filter/activities-filter.component.scss
  38. 2
      libs/ui/src/lib/activities-table/activities-table.component.scss
  39. 2
      libs/ui/src/lib/holdings-table/holdings-table.component.scss

10
CHANGELOG.md

@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased ## Unreleased
### Added
- Extended the landing page by a global heat map of subscribers
- Added support for the thousand separator in the global heat map component
### Changed
- Improved the form of the import dividends dialog (disable while loading)
- Removed the deprecated `~` in _Sass_ imports
### Fixed ### Fixed
- Fixed an exception in the _X-ray_ section - Fixed an exception in the _X-ray_ section

73
README.md

@ -1,34 +1,26 @@
<div align="center"> <div align="center">
<a href="https://ghostfol.io">
<img [<img src="https://avatars.githubusercontent.com/u/82473144?s=200" width="100" alt="Ghostfolio logo">](https://ghostfol.io)
alt="Ghostfolio Logo"
src="https://avatars.githubusercontent.com/u/82473144?s=200" # Ghostfolio
width="100"
/> **Open Source Wealth Management Software**
</a>
[**Ghostfol.io**](https://ghostfol.io) | [**Live Demo**](https://ghostfol.io/en/demo) | [**Ghostfolio Premium**](https://ghostfol.io/en/pricing) | [**FAQ**](https://ghostfol.io/en/faq) |
<h1>Ghostfolio</h1> [**Blog**](https://ghostfol.io/en/blog) | [**Slack**](https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg) | [**Twitter**](https://twitter.com/ghostfolio_)
<p>
<strong>Open Source Wealth Management Software</strong> [![Shield: Buy me a coffee](https://img.shields.io/badge/Buy%20me%20a%20coffee-Support-yellow?logo=buymeacoffee)](https://www.buymeacoffee.com/ghostfolio)
</p> [![Shield: Contributions Welcome](https://img.shields.io/badge/Contributions-Welcome-orange.svg)](#contributing)
<p> [![Shield: License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0)
<a href="https://ghostfol.io"><strong>Ghostfol.io</strong></a><a href="https://ghostfol.io/en/demo"><strong>Live Demo</strong></a> | <a href="https://ghostfol.io/en/pricing"><strong>Ghostfolio Premium</strong></a> | <a href="https://ghostfol.io/en/faq"><strong>FAQ</strong></a> | <a href="https://ghostfol.io/en/blog"><strong>Blog</strong></a> | <a href="https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg"><strong>Slack</strong></a> | <a href="https://twitter.com/ghostfolio_"><strong>Twitter</strong></a>
</p>
<p>
<a href="https://www.buymeacoffee.com/ghostfolio">
<img src="https://img.shields.io/badge/Buy%20me%20a%20coffee-Support-yellow?logo=buymeacoffee"/></a>
<a href="#contributing">
<img src="https://img.shields.io/badge/Contributions-Welcome-orange.svg"/></a>
<a href="https://www.gnu.org/licenses/agpl-3.0" rel="nofollow">
<img src="https://img.shields.io/badge/License-AGPL%20v3-blue.svg" alt="License: AGPL v3"/></a>
</p>
</div> </div>
**Ghostfolio** is an open source wealth management software built with web technology. The application empowers busy people to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions. The software is designed for personal use in continuous operation. **Ghostfolio** is an open source wealth management software built with web technology. The application empowers busy people to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions. The software is designed for personal use in continuous operation.
<div align="center" style="margin-top: 1rem; margin-bottom: 1rem;"> <div align="center">
<a href="https://www.youtube.com/watch?v=yY6ObSQVJZk">
<img src="./apps/client/src/assets/images/video-preview.jpg" width="600"></a> [<img src="./apps/client/src/assets/images/video-preview.jpg" width="600" alt="Preview image of the Ghostfolio video trailer">](https://www.youtube.com/watch?v=yY6ObSQVJZk)
</div> </div>
## Ghostfolio Premium ## Ghostfolio Premium
@ -63,8 +55,10 @@ Ghostfolio is for you if you are...
- ✅ Zen Mode - ✅ Zen Mode
- ✅ Progressive Web App (PWA) with a mobile-first design - ✅ Progressive Web App (PWA) with a mobile-first design
<div align="center" style="margin-top: 1rem; margin-bottom: 1rem;"> <div align="center">
<img src="./apps/client/src/assets/images/screenshot.png" width="300">
<img src="./apps/client/src/assets/images/screenshot.png" width="300" alt="Image of a phone showing the Ghostfolio app open">
</div> </div>
## Technology Stack ## Technology Stack
@ -84,13 +78,9 @@ The frontend is built with [Angular](https://angular.io) and uses [Angular Mater
We provide official container images hosted on [Docker Hub](https://hub.docker.com/r/ghostfolio/ghostfolio) for `linux/amd64` and `linux/arm64`. We provide official container images hosted on [Docker Hub](https://hub.docker.com/r/ghostfolio/ghostfolio) for `linux/amd64` and `linux/arm64`.
<div align="center"> <div align="center">
<a href="https://www.buymeacoffee.com/ghostfolio">
<img [<img src="./apps/client/src/assets/images/button-buy-me-a-coffee.png" width="150" alt="Buy me a coffee button"/>](https://www.buymeacoffee.com/ghostfolio)
alt="Buy me a coffee button"
src="./apps/client/src/assets/images/button-buy-me-a-coffee.png"
width="150"
/>
</a>
</div> </div>
### Supported Environment Variables ### Supported Environment Variables
@ -175,10 +165,13 @@ Please follow the instructions of the Ghostfolio [Unraid Community App](https://
### Start Server ### Start Server
<ol type="a"> #### Debug
<li>Debug: Run <code>yarn watch:server</code> and click "Launch Program" in <a href="https://code.visualstudio.com">Visual Studio Code</a></li>
<li>Serve: Run <code>yarn start:server</code></li> Run `yarn watch:server` and click _Launch Program_ in [Visual Studio Code](https://code.visualstudio.com)
</ol>
#### Serve
Run `yarn start:server`
### Start Client ### Start Client
@ -278,7 +271,7 @@ Ghostfolio is **100% free** and **open source**. We encourage and support an act
Not sure what to work on? We have got some ideas. Please join the Ghostfolio [Slack channel](https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg), tweet to [@ghostfolio\_](https://twitter.com/ghostfolio_) or send an e-mail to hi@ghostfol.io. We would love to hear from you. Not sure what to work on? We have got some ideas. Please join the Ghostfolio [Slack channel](https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg), tweet to [@ghostfolio\_](https://twitter.com/ghostfolio_) or send an e-mail to hi@ghostfol.io. We would love to hear from you.
If you like to support this project, get **[Ghostfolio Premium](https://ghostfol.io/en/pricing)** or **[Buy me a coffee](https://www.buymeacoffee.com/ghostfolio)**. If you like to support this project, get [**Ghostfolio Premium**](https://ghostfol.io/en/pricing) or [**Buy me a coffee**](https://www.buymeacoffee.com/ghostfolio).
## License ## License

5
apps/api/src/app/info/info.service.ts

@ -7,6 +7,7 @@ import { PropertyService } from '@ghostfolio/api/services/property/property.serv
import { TagService } from '@ghostfolio/api/services/tag/tag.service'; import { TagService } from '@ghostfolio/api/services/tag/tag.service';
import { import {
DEMO_USER_ID, DEMO_USER_ID,
PROPERTY_COUNTRIES_OF_SUBSCRIBERS,
PROPERTY_IS_READ_ONLY_MODE, PROPERTY_IS_READ_ONLY_MODE,
PROPERTY_SLACK_COMMUNITY_USERS, PROPERTY_SLACK_COMMUNITY_USERS,
PROPERTY_STRIPE_CONFIG, PROPERTY_STRIPE_CONFIG,
@ -92,6 +93,10 @@ export class InfoService {
if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) {
globalPermissions.push(permissions.enableSubscription); globalPermissions.push(permissions.enableSubscription);
info.countriesOfSubscribers =
((await this.propertyService.getByKey(
PROPERTY_COUNTRIES_OF_SUBSCRIBERS
)) as string[]) ?? [];
info.stripePublicKey = this.configurationService.get('STRIPE_PUBLIC_KEY'); info.stripePublicKey = this.configurationService.get('STRIPE_PUBLIC_KEY');
} }

2
apps/client/src/app/app.component.scss

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
display: block; display: block;

2
apps/client/src/app/components/access-table/access-table.component.scss

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
display: block; display: block;

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

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
display: block; display: block;

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

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
display: block; display: block;

2
apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.scss

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
display: block; display: block;

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

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
display: block; display: block;

2
apps/client/src/app/components/admin-overview/admin-overview.scss

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
display: block; display: block;

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

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
display: block; display: block;

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

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
display: block; display: block;

2
apps/client/src/app/components/home-holdings/home-holdings.scss

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
display: block; display: block;

2
apps/client/src/app/components/home-market/home-market.scss

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
display: block; display: block;

2
apps/client/src/app/components/home-overview/home-overview.scss

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
display: block; display: block;

2
apps/client/src/app/components/home-summary/home-summary.scss

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
display: block; display: block;

2
apps/client/src/app/components/positions/positions.component.scss

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
display: block; display: block;

9
apps/client/src/app/components/world-map-chart/world-map-chart.component.ts

@ -7,6 +7,7 @@ import {
OnDestroy, OnDestroy,
OnInit OnInit
} from '@angular/core'; } from '@angular/core';
import { getNumberFormatGroup } from '@ghostfolio/common/helper';
import svgMap from 'svgmap'; import svgMap from 'svgmap';
@Component({ @Component({
@ -16,9 +17,10 @@ import svgMap from 'svgmap';
styleUrls: ['./world-map-chart.component.scss'] styleUrls: ['./world-map-chart.component.scss']
}) })
export class WorldMapChartComponent implements OnChanges, OnDestroy, OnInit { export class WorldMapChartComponent implements OnChanges, OnDestroy, OnInit {
@Input() baseCurrency: string; @Input() countries: { [code: string]: { name?: string; value: number } };
@Input() countries: { [code: string]: { name: string; value: number } }; @Input() format: string;
@Input() isInPercent = false; @Input() isInPercent = false;
@Input() locale: string;
public isLoading = true; public isLoading = true;
public svgMapElement; public svgMapElement;
@ -71,7 +73,8 @@ export class WorldMapChartComponent implements OnChanges, OnDestroy, OnInit {
applyData: 'value', applyData: 'value',
data: { data: {
value: { value: {
format: this.isInPercent ? `{0}%` : `{0} ${this.baseCurrency}` format: this.format,
thousandSeparator: getNumberFormatGroup(this.locale)
} }
}, },
values: this.countries values: this.countries

4
apps/client/src/app/pages/account/account-page.html

@ -135,10 +135,10 @@
>Español (<ng-container i18n>Community</ng-container >Español (<ng-container i18n>Community</ng-container
>)</mat-option >)</mat-option
> >
<!--<mat-option value="fr" <mat-option value="fr"
>Français (<ng-container i18n>Community</ng-container >Français (<ng-container i18n>Community</ng-container
>)</mat-option >)</mat-option
>--> >
<mat-option value="it" <mat-option value="it"
>Italiano (<ng-container i18n>Community</ng-container >Italiano (<ng-container i18n>Community</ng-container
>)</mat-option >)</mat-option

2
apps/client/src/app/pages/admin/admin-page.scss

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
color: rgb(var(--dark-primary-text)); color: rgb(var(--dark-primary-text));

2
apps/client/src/app/pages/home/home-page.scss

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
color: rgb(var(--dark-primary-text)); color: rgb(var(--dark-primary-text));

18
apps/client/src/app/pages/landing/landing-page.component.ts

@ -13,10 +13,14 @@ import { Subject } from 'rxjs';
templateUrl: './landing-page.html' templateUrl: './landing-page.html'
}) })
export class LandingPageComponent implements OnDestroy, OnInit { export class LandingPageComponent implements OnDestroy, OnInit {
public countriesOfSubscribersMap: {
[code: string]: { value: number };
} = {};
public currentYear = format(new Date(), 'yyyy'); public currentYear = format(new Date(), 'yyyy');
public demoAuthToken: string; public demoAuthToken: string;
public deviceType: string; public deviceType: string;
public hasPermissionForStatistics: boolean; public hasPermissionForStatistics: boolean;
public hasPermissionForSubscription: boolean;
public hasPermissionToCreateUser: boolean; public hasPermissionToCreateUser: boolean;
public statistics: Statistics; public statistics: Statistics;
public testimonials = [ public testimonials = [
@ -48,13 +52,25 @@ export class LandingPageComponent implements OnDestroy, OnInit {
private dataService: DataService, private dataService: DataService,
private deviceService: DeviceDetectorService private deviceService: DeviceDetectorService
) { ) {
const { globalPermissions, statistics } = this.dataService.fetchInfo(); const { countriesOfSubscribers, globalPermissions, statistics } =
this.dataService.fetchInfo();
for (const country of countriesOfSubscribers) {
this.countriesOfSubscribersMap[country] = {
value: 1
};
}
this.hasPermissionForStatistics = hasPermission( this.hasPermissionForStatistics = hasPermission(
globalPermissions, globalPermissions,
permissions.enableStatistics permissions.enableStatistics
); );
this.hasPermissionForSubscription = hasPermission(
globalPermissions,
permissions.enableSubscription
);
this.hasPermissionToCreateUser = hasPermission( this.hasPermissionToCreateUser = hasPermission(
globalPermissions, globalPermissions,
permissions.createUserAccount permissions.createUserAccount

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

@ -269,6 +269,21 @@
</div> </div>
</div> </div>
<div *ngIf="hasPermissionForSubscription" class="row my-5">
<div class="col-12">
<h2 class="h4 text-center">
Members from around the globe are using
<a href="pricing"><strong>Ghostfolio Premium</strong></a>
</h2>
</div>
<div class="col-md-8 customer-map-container offset-md-2">
<gf-world-map-chart
format="👻"
[countries]="countriesOfSubscribersMap"
></gf-world-map-chart>
</div>
</div>
<div class="row my-3"> <div class="row my-3">
<div class="col-12"> <div class="col-12">
<h2 class="h4 mb-1 text-center"> <h2 class="h4 mb-1 text-center">

2
apps/client/src/app/pages/landing/landing-page.module.ts

@ -3,6 +3,7 @@ import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card'; import { MatCardModule } from '@angular/material/card';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { GfWorldMapChartModule } from '@ghostfolio/client/components/world-map-chart/world-map-chart.module';
import { GfLogoModule } from '@ghostfolio/ui/logo'; import { GfLogoModule } from '@ghostfolio/ui/logo';
import { GfValueModule } from '@ghostfolio/ui/value'; import { GfValueModule } from '@ghostfolio/ui/value';
@ -15,6 +16,7 @@ import { LandingPageComponent } from './landing-page.component';
CommonModule, CommonModule,
GfLogoModule, GfLogoModule,
GfValueModule, GfValueModule,
GfWorldMapChartModule,
LandingPageRoutingModule, LandingPageRoutingModule,
MatButtonModule, MatButtonModule,
MatCardModule, MatCardModule,

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

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
display: block; display: block;
@ -9,6 +9,10 @@
} }
} }
.customer-map-container {
aspect-ratio: 16 / 9;
}
.downloads { .downloads {
img { img {
height: 2.5rem; height: 2.5rem;

4
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts

@ -56,6 +56,7 @@ export class ImportActivitiesDialog implements OnDestroy {
this.data?.activityTypes?.[0] === 'DIVIDEND' this.data?.activityTypes?.[0] === 'DIVIDEND'
) { ) {
this.mode = 'DIVIDEND'; this.mode = 'DIVIDEND';
this.uniqueAssetForm.controls['uniqueAsset'].disable();
this.dataService this.dataService
.fetchPositions({ .fetchPositions({
@ -72,6 +73,7 @@ export class ImportActivitiesDialog implements OnDestroy {
this.holdings = sortBy(positions, ({ name }) => { this.holdings = sortBy(positions, ({ name }) => {
return name.toLowerCase(); return name.toLowerCase();
}); });
this.uniqueAssetForm.controls['uniqueAsset'].enable();
this.changeDetectorRef.markForCheck(); this.changeDetectorRef.markForCheck();
}); });
@ -111,6 +113,8 @@ export class ImportActivitiesDialog implements OnDestroy {
} }
public onLoadDividends() { public onLoadDividends() {
this.uniqueAssetForm.controls['uniqueAsset'].disable();
const { dataSource, symbol } = const { dataSource, symbol } =
this.uniqueAssetForm.controls['uniqueAsset'].value; this.uniqueAssetForm.controls['uniqueAsset'].value;

6
apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts

@ -84,6 +84,7 @@ export class AllocationsPageComponent implements OnDestroy, OnInit {
}; };
public user: User; public user: User;
public worldMapChartFormat: string;
private unsubscribeSubject = new Subject<void>(); private unsubscribeSubject = new Subject<void>();
@ -193,6 +194,11 @@ export class AllocationsPageComponent implements OnDestroy, OnInit {
...tagFilters ...tagFilters
]; ];
this.worldMapChartFormat =
this.hasImpersonationId || this.user.settings.isRestrictedView
? `{0}%`
: `{0} ${this.user?.settings?.baseCurrency}`;
this.changeDetectorRef.markForCheck(); this.changeDetectorRef.markForCheck();
} }
}); });

3
apps/client/src/app/pages/portfolio/allocations/allocations-page.html

@ -257,9 +257,10 @@
</mat-card-header> </mat-card-header>
<mat-card-content> <mat-card-content>
<gf-world-map-chart <gf-world-map-chart
[baseCurrency]="user?.settings?.baseCurrency"
[countries]="countries" [countries]="countries"
[format]="worldMapChartFormat"
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView" [isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
[locale]="user?.settings?.locale"
></gf-world-map-chart> ></gf-world-map-chart>
<div class="row"> <div class="row">
<div class="col-xs-12 col-md-4 my-2"> <div class="col-xs-12 col-md-4 my-2">

2
apps/client/src/app/pages/portfolio/portfolio-page.scss

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
color: rgb(var(--dark-primary-text)); color: rgb(var(--dark-primary-text));

2
apps/client/src/app/pages/zen/zen-page.scss

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
color: rgb(var(--dark-primary-text)); color: rgb(var(--dark-primary-text));

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

File diff suppressed because it is too large

4
apps/client/src/styles.scss

@ -3,9 +3,9 @@
@import './styles/bootstrap'; @import './styles/bootstrap';
@import './styles/table'; @import './styles/table';
@import '~angular-material-css-vars/src/lib/main'; @import 'node_modules/angular-material-css-vars/src/lib/main';
@import '~svgmap/dist/svgMap'; @import 'node_modules/svgmap/dist/svgMap';
$mat-css-dark-theme-selector: '.is-dark-theme'; $mat-css-dark-theme-selector: '.is-dark-theme';
$mat-css-light-theme-selector: '.is-light-theme'; $mat-css-light-theme-selector: '.is-light-theme';

74
apps/client/src/styles/bootstrap.scss

@ -5,40 +5,40 @@
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
@import '~bootstrap/scss/functions'; @import 'node_modules/bootstrap/scss/functions';
@import '~bootstrap/scss/variables'; @import 'node_modules/bootstrap/scss/variables';
@import '~bootstrap/scss/mixins'; @import 'node_modules/bootstrap/scss/mixins';
@import '~bootstrap/scss/root'; @import 'node_modules/bootstrap/scss/root';
@import '~bootstrap/scss/reboot'; @import 'node_modules/bootstrap/scss/reboot';
@import '~bootstrap/scss/type'; @import 'node_modules/bootstrap/scss/type';
@import '~bootstrap/scss/images'; @import 'node_modules/bootstrap/scss/images';
// @import '~bootstrap/scss/code'; // @import 'node_modules/bootstrap/scss/code';
@import '~bootstrap/scss/grid'; @import 'node_modules/bootstrap/scss/grid';
// @import '~bootstrap/scss/tables'; // @import 'node_modules/bootstrap/scss/tables';
// @import '~bootstrap/scss/forms'; // @import 'node_modules/bootstrap/scss/forms';
// @import '~bootstrap/scss/buttons'; // @import 'node_modules/bootstrap/scss/buttons';
// @import '~bootstrap/scss/transitions'; // @import 'node_modules/bootstrap/scss/transitions';
// @import '~bootstrap/scss/dropdown'; // @import 'node_modules/bootstrap/scss/dropdown';
// @import '~bootstrap/scss/button-group'; // @import 'node_modules/bootstrap/scss/button-group';
// @import '~bootstrap/scss/input-group'; // @import 'node_modules/bootstrap/scss/input-group';
// @import '~bootstrap/scss/custom-forms'; // @import 'node_modules/bootstrap/scss/custom-forms';
// @import '~bootstrap/scss/nav'; // @import 'node_modules/bootstrap/scss/nav';
// @import '~bootstrap/scss/navbar'; // @import 'node_modules/bootstrap/scss/navbar';
// @import '~bootstrap/scss/card'; // @import 'node_modules/bootstrap/scss/card';
// @import '~bootstrap/scss/breadcrumb'; // @import 'node_modules/bootstrap/scss/breadcrumb';
// @import '~bootstrap/scss/pagination'; // @import 'node_modules/bootstrap/scss/pagination';
@import '~bootstrap/scss/badge'; @import 'node_modules/bootstrap/scss/badge';
// @import '~bootstrap/scss/jumbotron'; // @import 'node_modules/bootstrap/scss/jumbotron';
// @import '~bootstrap/scss/alert'; // @import 'node_modules/bootstrap/scss/alert';
// @import '~bootstrap/scss/progress'; // @import 'node_modules/bootstrap/scss/progress';
// @import '~bootstrap/scss/media'; // @import 'node_modules/bootstrap/scss/media';
// @import '~bootstrap/scss/list-group'; // @import 'node_modules/bootstrap/scss/list-group';
// @import '~bootstrap/scss/close'; // @import 'node_modules/bootstrap/scss/close';
// @import '~bootstrap/scss/toasts'; // @import 'node_modules/bootstrap/scss/toasts';
// @import '~bootstrap/scss/modal'; // @import 'node_modules/bootstrap/scss/modal';
// @import '~bootstrap/scss/tooltip'; // @import 'node_modules/bootstrap/scss/tooltip';
// @import '~bootstrap/scss/popover'; // @import 'node_modules/bootstrap/scss/popover';
// @import '~bootstrap/scss/carousel'; // @import 'node_modules/bootstrap/scss/carousel';
// @import '~bootstrap/scss/spinners'; // @import 'node_modules/bootstrap/scss/spinners';
@import '~bootstrap/scss/utilities'; @import 'node_modules/bootstrap/scss/utilities';
// @import '~bootstrap/scss/print'; // @import 'node_modules/bootstrap/scss/print';

2
apps/client/src/styles/ghostfolio-style.scss

@ -1,6 +1,6 @@
$mat-css-dark-theme-selector: '.is-dark-theme'; $mat-css-dark-theme-selector: '.is-dark-theme';
@import '~angular-material-css-vars/src/lib/public-util'; @import 'node_modules/angular-material-css-vars/src/lib/public-util';
$alpha-disabled-text: 0.38; $alpha-disabled-text: 0.38;
$alpha-hover: 0.04; $alpha-hover: 0.04;

1
libs/common/src/lib/config.ts

@ -72,6 +72,7 @@ export const GATHER_HISTORICAL_MARKET_DATA_PROCESS_OPTIONS: JobOptions = {
export const MAX_CHART_ITEMS = 365; export const MAX_CHART_ITEMS = 365;
export const PROPERTY_BENCHMARKS = 'BENCHMARKS'; export const PROPERTY_BENCHMARKS = 'BENCHMARKS';
export const PROPERTY_COUNTRIES_OF_SUBSCRIBERS = 'COUNTRIES_OF_SUBSCRIBERS';
export const PROPERTY_COUPONS = 'COUPONS'; export const PROPERTY_COUPONS = 'COUPONS';
export const PROPERTY_CURRENCIES = 'CURRENCIES'; export const PROPERTY_CURRENCIES = 'CURRENCIES';
export const PROPERTY_IS_READ_ONLY_MODE = 'IS_READ_ONLY_MODE'; export const PROPERTY_IS_READ_ONLY_MODE = 'IS_READ_ONLY_MODE';

2
libs/common/src/lib/interfaces/info-item.interface.ts

@ -6,12 +6,12 @@ import { Subscription } from './subscription.interface';
export interface InfoItem { export interface InfoItem {
baseCurrency: string; baseCurrency: string;
benchmarks: Partial<SymbolProfile>[]; benchmarks: Partial<SymbolProfile>[];
countriesOfSubscribers?: string[];
currencies: string[]; currencies: string[];
demoAuthToken: string; demoAuthToken: string;
fearAndGreedDataSource?: string; fearAndGreedDataSource?: string;
globalPermissions: string[]; globalPermissions: string[];
isReadOnlyMode?: boolean; isReadOnlyMode?: boolean;
lastDataGathering?: Date;
platforms: { id: string; name: string }[]; platforms: { id: string; name: string }[];
statistics: Statistics; statistics: Statistics;
stripePublicKey?: string; stripePublicKey?: string;

2
libs/ui/src/lib/activities-filter/activities-filter.component.scss

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
display: block; display: block;

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

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
display: block; display: block;

2
libs/ui/src/lib/holdings-table/holdings-table.component.scss

@ -1,4 +1,4 @@
@import '~apps/client/src/styles/ghostfolio-style'; @import 'apps/client/src/styles/ghostfolio-style';
:host { :host {
display: block; display: block;

Loading…
Cancel
Save