Browse Source

Feature/add edit exchange rate button to admin control (#2577)

* Ad edit button

* Update changelog
pull/2579/head
Thomas Kaul 1 year ago
committed by GitHub
parent
commit
e69c7a753c
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      CHANGELOG.md
  2. 20
      apps/api/src/app/admin/admin.service.ts
  3. 6
      apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
  4. 12
      apps/client/src/app/components/admin-overview/admin-overview.html
  5. 4
      apps/client/src/app/components/admin-overview/admin-overview.module.ts
  6. 8
      libs/common/src/lib/interfaces/admin-data.interface.ts

4
CHANGELOG.md

@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased ## Unreleased
### Added
- Added a button to edit the exchange rates in the admin control panel
### Changed ### Changed
- Improved the language localization for German (`de`) - Improved the language localization for German (`de`)

20
apps/api/src/app/admin/admin.service.ts

@ -23,7 +23,13 @@ import {
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { MarketDataPreset } from '@ghostfolio/common/types'; import { MarketDataPreset } from '@ghostfolio/common/types';
import { BadRequestException, Injectable } from '@nestjs/common'; import { BadRequestException, Injectable } from '@nestjs/common';
import { AssetSubClass, Prisma, Property, SymbolProfile } from '@prisma/client'; import {
AssetSubClass,
DataSource,
Prisma,
Property,
SymbolProfile
} from '@prisma/client';
import { differenceInDays } from 'date-fns'; import { differenceInDays } from 'date-fns';
import { groupBy } from 'lodash'; import { groupBy } from 'lodash';
@ -94,9 +100,17 @@ export class AdminService {
return currency !== DEFAULT_CURRENCY; return currency !== DEFAULT_CURRENCY;
}) })
.map((currency) => { .map((currency) => {
const label1 = DEFAULT_CURRENCY;
const label2 = currency;
return { return {
label1: DEFAULT_CURRENCY, label1,
label2: currency, label2,
dataSource:
DataSource[
this.configurationService.get('DATA_SOURCE_EXCHANGE_RATES')
],
symbol: `${label1}${label2}`,
value: this.exchangeRateDataService.toCurrency( value: this.exchangeRateDataService.toCurrency(
1, 1,
DEFAULT_CURRENCY, DEFAULT_CURRENCY,

6
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts

@ -128,10 +128,10 @@ export class AssetProfileDialog implements OnDestroy, OnInit {
} }
this.assetProfileForm.setValue({ this.assetProfileForm.setValue({
name: this.assetProfile.name, assetClass: this.assetProfile.assetClass ?? null,
assetClass: this.assetProfile.assetClass, assetSubClass: this.assetProfile.assetSubClass ?? null,
assetSubClass: this.assetProfile.assetSubClass,
comment: this.assetProfile?.comment ?? '', comment: this.assetProfile?.comment ?? '',
name: this.assetProfile.name ?? this.assetProfile.symbol,
scraperConfiguration: JSON.stringify( scraperConfiguration: JSON.stringify(
this.assetProfile?.scraperConfiguration ?? {} this.assetProfile?.scraperConfiguration ?? {}
), ),

12
apps/client/src/app/components/admin-overview/admin-overview.html

@ -55,6 +55,18 @@
</td> </td>
<td class="pl-1">{{ exchangeRate.label2 }}</td> <td class="pl-1">{{ exchangeRate.label2 }}</td>
<td> <td>
<a
class="h-100 mx-1 no-min-width px-2"
mat-button
[queryParams]="{
assetProfileDialog: true,
dataSource: exchangeRate.dataSource,
symbol: exchangeRate.symbol
}"
[routerLink]="['/admin', 'market-data']"
>
<ion-icon name="create-outline"></ion-icon>
</a>
<button <button
*ngIf="customCurrencies.includes(exchangeRate.label2)" *ngIf="customCurrencies.includes(exchangeRate.label2)"
class="h-100 mx-1 no-min-width px-2" class="h-100 mx-1 no-min-width px-2"

4
apps/client/src/app/components/admin-overview/admin-overview.module.ts

@ -5,6 +5,7 @@ import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card'; import { MatCardModule } from '@angular/material/card';
import { MatSelectModule } from '@angular/material/select'; import { MatSelectModule } from '@angular/material/select';
import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { MatSlideToggleModule } from '@angular/material/slide-toggle';
import { RouterModule } from '@angular/router';
import { CacheService } from '@ghostfolio/client/services/cache.service'; import { CacheService } from '@ghostfolio/client/services/cache.service';
import { GfValueModule } from '@ghostfolio/ui/value'; import { GfValueModule } from '@ghostfolio/ui/value';
@ -21,7 +22,8 @@ import { AdminOverviewComponent } from './admin-overview.component';
MatCardModule, MatCardModule,
MatSelectModule, MatSelectModule,
MatSlideToggleModule, MatSlideToggleModule,
ReactiveFormsModule ReactiveFormsModule,
RouterModule
], ],
providers: [CacheService], providers: [CacheService],
schemas: [CUSTOM_ELEMENTS_SCHEMA] schemas: [CUSTOM_ELEMENTS_SCHEMA]

8
libs/common/src/lib/interfaces/admin-data.interface.ts

@ -1,5 +1,11 @@
import { UniqueAsset } from './unique-asset.interface';
export interface AdminData { export interface AdminData {
exchangeRates: { label1: string; label2: string; value: number }[]; exchangeRates: ({
label1: string;
label2: string;
value: number;
} & UniqueAsset)[];
settings: { [key: string]: boolean | object | string | string[] }; settings: { [key: string]: boolean | object | string | string[] };
transactionCount: number; transactionCount: number;
userCount: number; userCount: number;

Loading…
Cancel
Save