diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index d2bf6e411..041e0efcb 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -626,22 +626,22 @@ export class AdminService { assetClass: assetClass as AssetClass, assetSubClass: assetSubClass as AssetSubClass, name: name as string, - url: url as string + countries: countries as Prisma.JsonArray, + url: url as string, + sectors: sectors as Prisma.JsonArray }; const updatedSymbolProfile: Prisma.SymbolProfileUpdateInput = { comment, - countries, currency, dataSource, holdings, isActive, scraperConfiguration, - sectors, symbol, symbolMapping, ...(dataSource === 'MANUAL' - ? { assetClass, assetSubClass, name, url } + ? { assetClass, assetSubClass, name, url, countries, sectors } : { SymbolProfileOverrides: { upsert: { 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 c0af46e22..6e2dab956 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 @@ -19,7 +19,7 @@ import { User } from '@ghostfolio/common/interfaces'; import { DateRange } from '@ghostfolio/common/types'; -import { validateObjectForForm } from '@ghostfolio/common/utils'; +import { jsonValidator, validateObjectForForm } from '@ghostfolio/common/utils'; import { GfCurrencySelectorComponent } from '@ghostfolio/ui/currency-selector'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { GfHistoricalMarketDataEditorComponent } from '@ghostfolio/ui/historical-market-data-editor'; @@ -149,7 +149,7 @@ export class GfAssetProfileDialogComponent implements OnInit { assetClass: new FormControl(undefined), assetSubClass: new FormControl(undefined), comment: '', - countries: '', + countries: ['', jsonValidator()], currency: '', historicalData: this.formBuilder.group({ csvString: '' @@ -158,14 +158,14 @@ export class GfAssetProfileDialogComponent implements OnInit { name: ['', Validators.required], scraperConfiguration: this.formBuilder.group({ defaultMarketPrice: null, - headers: JSON.stringify({}), + headers: [JSON.stringify({}), jsonValidator()], locale: '', mode: '', selector: '', url: '' }), - sectors: '', - symbolMapping: '', + sectors: ['', jsonValidator()], + symbolMapping: ['', jsonValidator()], url: '' }); 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 6b3141bfe..519584fa8 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 @@ -394,29 +394,151 @@ @if (assetProfile?.dataSource === 'MANUAL') { -
- - Sectors - - -
-
- - Countries - - +
+ + + + Scraper Configuration + +
+
+ + Default Market Price + + +
+
+ + HTTP Request Headers + + +
+
+ + Locale + + +
+
+ + Mode + + @for (modeValue of modeValues; track modeValue) { + {{ + modeValue.viewValue + }} + } + + +
+
+ + + Selector* + + + +
+
+ + + Url* + + + +
+
+ +
+
+
+
} +
+ + Sectors + + +
+
+ + Countries + + +
Url diff --git a/libs/common/src/lib/utils/form.util.ts b/libs/common/src/lib/utils/form.util.ts index b510e6215..6a6c32b1f 100644 --- a/libs/common/src/lib/utils/form.util.ts +++ b/libs/common/src/lib/utils/form.util.ts @@ -1,6 +1,17 @@ +import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms'; import { FormGroup } from '@angular/forms'; import { plainToInstance } from 'class-transformer'; -import { validate } from 'class-validator'; +import { isJSON, validate } from 'class-validator'; + +export function jsonValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + if (!isJSON(control.value)) { + return { invalidJson: true }; + } + + return null; + }; +} export async function validateObjectForForm({ classDto, diff --git a/libs/common/src/lib/utils/index.ts b/libs/common/src/lib/utils/index.ts index 2bdd03fdc..371126790 100644 --- a/libs/common/src/lib/utils/index.ts +++ b/libs/common/src/lib/utils/index.ts @@ -1,3 +1,3 @@ -import { validateObjectForForm } from './form.util'; +import { jsonValidator, validateObjectForForm } from './form.util'; -export { validateObjectForForm }; +export { jsonValidator, validateObjectForForm };