From 2ed0614126fa3d0251beae2c6b0265cee3b222c1 Mon Sep 17 00:00:00 2001 From: tobikugel Date: Tue, 18 Mar 2025 10:43:15 -0300 Subject: [PATCH] feat: implements frontend logic --- apps/api/src/app/admin/admin.controller.ts | 9 ++-- apps/api/src/app/admin/admin.service.ts | 37 ++++++++----- .../asset-profile-dialog.component.ts | 52 ++++++++++++++++-- .../asset-profile-dialog.html | 54 ++++++++++++------- apps/client/src/app/services/admin.service.ts | 34 +++++++----- 5 files changed, 129 insertions(+), 57 deletions(-) diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index a9018f08e..f65556f09 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -338,12 +338,9 @@ export class AdminController { @Param('dataSource') dataSource: DataSource, @Param('symbol') symbol: string ): Promise { - return this.adminService.patchAssetProfileData( - { dataSource, symbol }, - { - ...assetProfileData - } - ); + return this.adminService.patchAssetProfileData(dataSource, symbol, { + ...assetProfileData + }); } @HasPermission(permissions.accessAdminControl) diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 21c351b58..54aefa926 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -492,42 +492,48 @@ export class AdminService { } public async patchAssetProfileData( - assetProfileIdentifier: AssetProfileIdentifier, + dataSource: DataSource, + symbol: string, { assetClass, assetSubClass, comment, countries, currency, - dataSource, + dataSource: newDataSource, holdings, name, scraperConfiguration, sectors, - symbol, + symbol: newSymbol, symbolMapping, url }: Prisma.SymbolProfileUpdateInput ) { if ( - symbol && - dataSource && - assetProfileIdentifier.symbol !== symbol && - assetProfileIdentifier.dataSource !== dataSource + newSymbol && + newDataSource && + (newSymbol !== symbol || newDataSource !== dataSource) ) { await this.symbolProfileService.updateAssetProfileIdentifier( - assetProfileIdentifier, { - dataSource: dataSource as DataSource, // TODO change - symbol: symbol as string + dataSource, + symbol + }, + { + dataSource: newDataSource as DataSource, + symbol: newSymbol as string } ); await this.marketDataService.updateAssetProfileIdentifier( - assetProfileIdentifier, { - dataSource: dataSource as DataSource, - symbol: symbol as string + dataSource, + symbol + }, + { + dataSource: newDataSource as DataSource, + symbol: newSymbol as string } ); @@ -572,7 +578,10 @@ export class AdminService { }; await this.symbolProfileService.updateSymbolProfile( - assetProfileIdentifier, + { + dataSource, + symbol + }, updatedSymbolProfile ); 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 5b966ed74..443f6a7aa 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 @@ -55,7 +55,12 @@ export class AssetProfileDialog implements OnDestroy, OnInit { return { id: assetSubClass, label: translate(assetSubClass) }; }); public assetProfile: AdminMarketDataDetails['assetProfile']; - public assetProfileIdentifierForm; + public assetProfileIdentifierForm = this.formBuilder.group({ + editedSearchSymbol: new FormControl( + { symbol: null, dataSource: null }, + [Validators.required] + ) + }); public assetProfileForm = this.formBuilder.group({ assetClass: new FormControl(undefined), assetSubClass: new FormControl(undefined), @@ -225,6 +230,14 @@ export class AssetProfileDialog implements OnDestroy, OnInit { }); } + public get isSymbolEditable() { + return !this.assetProfileForm.dirty; + } + + public get isSymbolEditButtonInvisible() { + return this.assetProfile?.dataSource === 'MANUAL'; + } + public onClose() { this.dialogRef.close(); } @@ -284,9 +297,40 @@ export class AssetProfileDialog implements OnDestroy, OnInit { this.assetProfileForm.enable(); + this.assetProfileIdentifierForm.reset(); + this.changeDetectorRef.markForCheck(); } + public async onSubmitAssetProfileIdentifierForm() { + const assetProfileIdentifierData: UpdateAssetProfileDto = { + dataSource: + this.assetProfileIdentifierForm.get('editedSearchSymbol').value + .dataSource, + symbol: + this.assetProfileIdentifierForm.get('editedSearchSymbol').value.symbol + }; + + try { + await validateObjectForForm({ + classDto: UpdateAssetProfileDto, + form: this.assetProfileIdentifierForm, + object: assetProfileIdentifierData + }); + } catch (error) { + console.error(error); + return; + } + + this.adminService + .patchAssetProfile(this.data.dataSource, this.data.symbol, { + ...assetProfileIdentifierData + }) + .subscribe(() => { + this.initialize(); + }); + } + public async onSubmitAssetProfileForm() { let countries = []; let scraperConfiguration = {}; @@ -360,10 +404,8 @@ export class AssetProfileDialog implements OnDestroy, OnInit { } this.adminService - .patchAssetProfile({ - ...assetProfileData, - dataSource: this.data.dataSource, - symbol: this.data.symbol + .patchAssetProfile(this.data.dataSource, this.data.symbol, { + ...assetProfileData }) .subscribe(() => { this.initialize(); 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 a0c0153de..4c1fe9ed3 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 @@ -88,24 +88,39 @@
@if (isEditSymbolMode) {
- - Name, symbol or ISIN - - - - + + Name, symbol or ISIN + + + + +
} @else {
@@ -128,7 +143,10 @@ class="mx-1 no-min-width px-2" mat-button type="button" - [disabled]="assetProfileForm.dirty" + [disabled]="!isSymbolEditable" + [ngClass]="{ + 'd-none': isSymbolEditButtonInvisible + }" (click)="onSetEditSymboleMode()" > diff --git a/apps/client/src/app/services/admin.service.ts b/apps/client/src/app/services/admin.service.ts index 5d71a80f9..1a61bcaf5 100644 --- a/apps/client/src/app/services/admin.service.ts +++ b/apps/client/src/app/services/admin.service.ts @@ -216,20 +216,24 @@ export class AdminService { return this.http.get(url); } - public patchAssetProfile({ - assetClass, - assetSubClass, - comment, - countries, - currency, - dataSource, - name, - scraperConfiguration, - sectors, - symbol, - symbolMapping, - url - }: AssetProfileIdentifier & UpdateAssetProfileDto) { + public patchAssetProfile( + dataSource: DataSource, + symbol: string, + { + assetClass, + assetSubClass, + comment, + countries, + currency, + dataSource: newDataSource, + name, + scraperConfiguration, + sectors, + symbol: newSymbol, + symbolMapping, + url + }: UpdateAssetProfileDto + ) { return this.http.patch( `/api/v1/admin/profile-data/${dataSource}/${symbol}`, { @@ -239,6 +243,8 @@ export class AdminService { countries, currency, name, + newDataSource, + newSymbol, scraperConfiguration, sectors, symbolMapping,