diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b8581363..bb2809b7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- Added support to toggle the data gathering for individual asset profiles in the asset profile details dialog of the admin control panel + ### Changed - Improved the check for duplicates in the preview step of the activities import (allow different comments) diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index d73e2b878..6a8906c17 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -480,6 +480,7 @@ export class AdminService { currency, dataSource: newDataSource, holdings, + isActive, name, scraperConfiguration, sectors, @@ -557,6 +558,7 @@ export class AdminService { currency, dataSource, holdings, + isActive, scraperConfiguration, sectors, symbol, diff --git a/apps/api/src/app/admin/update-asset-profile.dto.ts b/apps/api/src/app/admin/update-asset-profile.dto.ts index b28fe3cdc..45923410a 100644 --- a/apps/api/src/app/admin/update-asset-profile.dto.ts +++ b/apps/api/src/app/admin/update-asset-profile.dto.ts @@ -3,6 +3,7 @@ import { IsCurrencyCode } from '@ghostfolio/api/validators/is-currency-code'; import { AssetClass, AssetSubClass, DataSource, Prisma } from '@prisma/client'; import { IsArray, + IsBoolean, IsEnum, IsObject, IsOptional, @@ -35,6 +36,10 @@ export class UpdateAssetProfileDto { @IsOptional() dataSource?: DataSource; + @IsBoolean() + @IsOptional() + isActive?: boolean; + @IsOptional() @IsString() name?: string; diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 9a4fff5ed..c72420417 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -555,6 +555,7 @@ export class ImportService { createdAt: undefined, holdings: undefined, id: undefined, + isActive: true, sectors: undefined, updatedAt: undefined } diff --git a/apps/api/src/app/order/create-order.dto.ts b/apps/api/src/app/order/create-order.dto.ts index 6f52e7032..f40e65ba1 100644 --- a/apps/api/src/app/order/create-order.dto.ts +++ b/apps/api/src/app/order/create-order.dto.ts @@ -27,12 +27,12 @@ export class CreateOrderDto { @IsString() accountId?: string; - @IsOptional() @IsEnum(AssetClass, { each: true }) + @IsOptional() assetClass?: AssetClass; - @IsOptional() @IsEnum(AssetSubClass, { each: true }) + @IsOptional() assetSubClass?: AssetSubClass; @IsOptional() @@ -49,8 +49,8 @@ export class CreateOrderDto { @IsOptional() customCurrency?: string; - @IsOptional() @IsEnum(DataSource, { each: true }) + @IsOptional() dataSource?: DataSource; @IsISO8601() diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts index 217ec499b..c5a902c29 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts @@ -24,6 +24,7 @@ export const symbolProfileDummyData = { createdAt: undefined, holdings: [], id: undefined, + isActive: true, sectors: [], updatedAt: undefined }; diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts index 14aa3a19e..d9b344699 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts @@ -34,6 +34,7 @@ import { ValidationErrors, Validators } from '@angular/forms'; +import { MatCheckboxChange } from '@angular/material/checkbox'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { MatSnackBar } from '@angular/material/snack-bar'; import { @@ -88,6 +89,7 @@ export class AssetProfileDialog implements OnDestroy, OnInit { historicalData: this.formBuilder.group({ csvString: '' }), + isActive: [true], name: ['', Validators.required], scraperConfiguration: this.formBuilder.group({ defaultMarketPrice: null, @@ -254,6 +256,7 @@ export class AssetProfileDialog implements OnDestroy, OnInit { historicalData: { csvString: AssetProfileDialog.HISTORICAL_DATA_TEMPLATE }, + isActive: this.assetProfile?.isActive, name: this.assetProfile.name ?? this.assetProfile.symbol, scraperConfiguration: { defaultMarketPrice: @@ -395,6 +398,7 @@ export class AssetProfileDialog implements OnDestroy, OnInit { assetSubClass: this.assetProfileForm.get('assetSubClass').value, comment: this.assetProfileForm.get('comment').value || null, currency: this.assetProfileForm.get('currency').value, + isActive: this.assetProfileForm.get('isActive').value, name: this.assetProfileForm.get('name').value, url: this.assetProfileForm.get('url').value || null }; @@ -538,6 +542,20 @@ export class AssetProfileDialog implements OnDestroy, OnInit { }); } + public onToggleIsActive({ checked }: MatCheckboxChange) { + if (checked) { + this.assetProfileForm.get('isActive')?.setValue(true); + } else { + this.assetProfileForm.get('isActive')?.setValue(false); + } + + if (checked === this.assetProfile.isActive) { + this.assetProfileForm.get('isActive')?.markAsPristine(); + } else { + this.assetProfileForm.get('isActive')?.markAsDirty(); + } + } + public onUnsetBenchmark({ dataSource, symbol }: AssetProfileIdentifier) { this.dataService .deleteBenchmark({ dataSource, symbol }) diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html index f1e8a40bd..c58a40a51 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -512,7 +512,17 @@ -
+
+
+ + Data Gathering + +