|
|
@ -79,463 +79,485 @@ |
|
|
|
[showXAxis]="true" |
|
|
|
[showYAxis]="true" |
|
|
|
/> |
|
|
|
<div class="mb-3"> |
|
|
|
<mat-accordion class="my-3"> |
|
|
|
<mat-expansion-panel class="shadow-none"> |
|
|
|
<mat-expansion-panel-header class="p-0 pr-3"> |
|
|
|
<mat-panel-title class="font-weight-bold" i18n |
|
|
|
>Historical Market Data</mat-panel-title |
|
|
|
> |
|
|
|
</mat-expansion-panel-header> |
|
|
|
|
|
|
|
<gf-historical-market-data-editor |
|
|
|
class="mb-3" |
|
|
|
[currency]="assetProfile?.currency" |
|
|
|
[dataSource]="data.dataSource" |
|
|
|
[dateOfFirstActivity]="assetProfile?.dateOfFirstActivity" |
|
|
|
[locale]="data.locale" |
|
|
|
[marketData]="marketDataItems" |
|
|
|
[symbol]="data.symbol" |
|
|
|
[user]="user" |
|
|
|
(marketDataChanged)="onMarketDataChanged($event)" |
|
|
|
/> |
|
|
|
</mat-expansion-panel> |
|
|
|
</mat-accordion> |
|
|
|
</div> |
|
|
|
|
|
|
|
<div class="row"> |
|
|
|
@if (isEditAssetProfileIdentifierMode) { |
|
|
|
<div class="col-12 mb-4"> |
|
|
|
<form |
|
|
|
class="align-items-center d-flex" |
|
|
|
[formGroup]="assetProfileIdentifierForm" |
|
|
|
(keyup.enter)=" |
|
|
|
assetProfileIdentifierForm.valid && |
|
|
|
onSubmitAssetProfileIdentifierForm() |
|
|
|
" |
|
|
|
(ngSubmit)="onSubmitAssetProfileIdentifierForm()" |
|
|
|
> |
|
|
|
<mat-form-field appearance="outline" class="gf-spacer without-hint"> |
|
|
|
<mat-label i18n>Name, symbol or ISIN</mat-label> |
|
|
|
<gf-symbol-autocomplete |
|
|
|
formControlName="assetProfileIdentifier" |
|
|
|
[includeIndices]="true" |
|
|
|
/> |
|
|
|
</mat-form-field> |
|
|
|
<button |
|
|
|
class="ml-2 no-min-width px-2" |
|
|
|
color="primary" |
|
|
|
mat-flat-button |
|
|
|
type="submit" |
|
|
|
[disabled]=" |
|
|
|
assetProfileIdentifierForm.hasError( |
|
|
|
'invalidData', |
|
|
|
'assetProfileIdentifier' |
|
|
|
) || |
|
|
|
assetProfileIdentifierForm.hasError( |
|
|
|
'equalsPreviousProfileIdentifier' |
|
|
|
) |
|
|
|
" |
|
|
|
> |
|
|
|
<ng-container i18n>Apply</ng-container> |
|
|
|
</button> |
|
|
|
<button |
|
|
|
class="ml-2 no-min-width px-2" |
|
|
|
mat-button |
|
|
|
type="button" |
|
|
|
(click)="onCancelEditAssetProfileIdentifierMode()" |
|
|
|
> |
|
|
|
<ng-container i18n>Cancel</ng-container> |
|
|
|
</button> |
|
|
|
</form> |
|
|
|
</div> |
|
|
|
} @else { |
|
|
|
<div class="col-6 mb-3"> |
|
|
|
<gf-value i18n size="medium" [value]="assetProfile?.symbol" |
|
|
|
>Symbol</gf-value |
|
|
|
> |
|
|
|
</div> |
|
|
|
<div class="col-6 mb-3"> |
|
|
|
<gf-value |
|
|
|
i18n |
|
|
|
size="medium" |
|
|
|
[value]=" |
|
|
|
assetProfile?.dataProviderInfo?.name ?? assetProfile?.dataSource |
|
|
|
" |
|
|
|
>Data Source</gf-value |
|
|
|
> |
|
|
|
<div |
|
|
|
class="edit-asset-profile-identifier-container position-absolute" |
|
|
|
> |
|
|
|
<button |
|
|
|
class="h-100 no-min-width px-2" |
|
|
|
mat-button |
|
|
|
type="button" |
|
|
|
[disabled]="!canSaveAssetProfileIdentifier" |
|
|
|
[ngClass]="{ |
|
|
|
'd-none': !canEditAssetProfileIdentifier |
|
|
|
}" |
|
|
|
(click)="onSetEditAssetProfileIdentifierMode()" |
|
|
|
> |
|
|
|
<ion-icon name="create-outline" /> |
|
|
|
</button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
} |
|
|
|
<div class="col-6 mb-3"> |
|
|
|
<gf-value i18n size="medium" [value]="assetProfile?.currency" |
|
|
|
>Currency</gf-value |
|
|
|
> |
|
|
|
</div> |
|
|
|
<div class="col-6 mb-3"></div> |
|
|
|
<div class="col-6 mb-3"> |
|
|
|
<gf-value |
|
|
|
i18n |
|
|
|
size="medium" |
|
|
|
[isDate]="assetProfile?.dateOfFirstActivity ? true : false" |
|
|
|
[locale]="data.locale" |
|
|
|
[value]="assetProfile?.dateOfFirstActivity ?? '-'" |
|
|
|
>First Activity</gf-value |
|
|
|
> |
|
|
|
</div> |
|
|
|
<div class="col-6 mb-3"> |
|
|
|
<gf-value |
|
|
|
i18n |
|
|
|
size="medium" |
|
|
|
[locale]="data.locale" |
|
|
|
[value]="assetProfile?.activitiesCount" |
|
|
|
>Activities</gf-value |
|
|
|
> |
|
|
|
</div> |
|
|
|
<div class="col-6 mb-3"> |
|
|
|
<gf-value |
|
|
|
i18n |
|
|
|
size="medium" |
|
|
|
[hidden]="!assetClassLabel" |
|
|
|
[value]="assetClassLabel" |
|
|
|
>Asset Class</gf-value |
|
|
|
> |
|
|
|
</div> |
|
|
|
<div class="col-6 mb-3"> |
|
|
|
<gf-value |
|
|
|
i18n |
|
|
|
size="medium" |
|
|
|
[hidden]="!assetSubClassLabel" |
|
|
|
[value]="assetSubClassLabel" |
|
|
|
>Asset Sub Class</gf-value |
|
|
|
> |
|
|
|
</div> |
|
|
|
@if ( |
|
|
|
assetProfile?.countries?.length > 0 || assetProfile?.sectors?.length > 0 |
|
|
|
) { |
|
|
|
@if ( |
|
|
|
assetProfile?.countries?.length === 1 && |
|
|
|
assetProfile?.sectors?.length === 1 |
|
|
|
) { |
|
|
|
@if (assetProfile?.sectors?.length === 1) { |
|
|
|
<mat-tab-group |
|
|
|
animationDuration="0ms" |
|
|
|
[dynamicHeight]="true" |
|
|
|
[mat-stretch-tabs]="false" |
|
|
|
> |
|
|
|
<mat-tab> |
|
|
|
<ng-template mat-tab-label> |
|
|
|
<ion-icon name="reader-outline" /> |
|
|
|
<div class="d-none d-sm-block ml-2" i18n>Overview</div> |
|
|
|
</ng-template> |
|
|
|
<div class="container mt-3 p-0"> |
|
|
|
<div class="row w-100"> |
|
|
|
@if (isEditAssetProfileIdentifierMode) { |
|
|
|
<div class="col-12 mb-4"> |
|
|
|
<form |
|
|
|
class="align-items-center d-flex" |
|
|
|
[formGroup]="assetProfileIdentifierForm" |
|
|
|
(keyup.enter)=" |
|
|
|
assetProfileIdentifierForm.valid && |
|
|
|
onSubmitAssetProfileIdentifierForm() |
|
|
|
" |
|
|
|
(ngSubmit)="onSubmitAssetProfileIdentifierForm()" |
|
|
|
> |
|
|
|
<mat-form-field |
|
|
|
appearance="outline" |
|
|
|
class="gf-spacer without-hint" |
|
|
|
> |
|
|
|
<mat-label i18n>Name, symbol or ISIN</mat-label> |
|
|
|
<gf-symbol-autocomplete |
|
|
|
formControlName="assetProfileIdentifier" |
|
|
|
[includeIndices]="true" |
|
|
|
/> |
|
|
|
</mat-form-field> |
|
|
|
<button |
|
|
|
class="ml-2 no-min-width px-2" |
|
|
|
color="primary" |
|
|
|
mat-flat-button |
|
|
|
type="submit" |
|
|
|
[disabled]=" |
|
|
|
assetProfileIdentifierForm.hasError( |
|
|
|
'invalidData', |
|
|
|
'assetProfileIdentifier' |
|
|
|
) || |
|
|
|
assetProfileIdentifierForm.hasError( |
|
|
|
'equalsPreviousProfileIdentifier' |
|
|
|
) |
|
|
|
" |
|
|
|
> |
|
|
|
<ng-container i18n>Apply</ng-container> |
|
|
|
</button> |
|
|
|
<button |
|
|
|
class="ml-2 no-min-width px-2" |
|
|
|
mat-button |
|
|
|
type="button" |
|
|
|
(click)="onCancelEditAssetProfileIdentifierMode()" |
|
|
|
> |
|
|
|
<ng-container i18n>Cancel</ng-container> |
|
|
|
</button> |
|
|
|
</form> |
|
|
|
</div> |
|
|
|
} @else { |
|
|
|
<div class="col-6 mb-3"> |
|
|
|
<gf-value i18n size="medium" [value]="assetProfile?.symbol" |
|
|
|
>Symbol</gf-value |
|
|
|
> |
|
|
|
</div> |
|
|
|
<div class="col-6 mb-3"> |
|
|
|
<gf-value |
|
|
|
i18n |
|
|
|
size="medium" |
|
|
|
[value]=" |
|
|
|
assetProfile?.dataProviderInfo?.name ?? |
|
|
|
assetProfile?.dataSource |
|
|
|
" |
|
|
|
>Data Source</gf-value |
|
|
|
> |
|
|
|
<div |
|
|
|
class="edit-asset-profile-identifier-container position-absolute" |
|
|
|
> |
|
|
|
<button |
|
|
|
class="h-100 no-min-width px-2" |
|
|
|
mat-button |
|
|
|
type="button" |
|
|
|
[disabled]="!canSaveAssetProfileIdentifier" |
|
|
|
[ngClass]="{ |
|
|
|
'd-none': !canEditAssetProfileIdentifier |
|
|
|
}" |
|
|
|
(click)="onSetEditAssetProfileIdentifierMode()" |
|
|
|
> |
|
|
|
<ion-icon name="create-outline" /> |
|
|
|
</button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
} |
|
|
|
<div class="col-6 mb-3"> |
|
|
|
<gf-value i18n size="medium" [value]="assetProfile?.currency" |
|
|
|
>Currency</gf-value |
|
|
|
> |
|
|
|
</div> |
|
|
|
<div class="col-6 mb-3"></div> |
|
|
|
<div class="col-6 mb-3"> |
|
|
|
<gf-value |
|
|
|
i18n |
|
|
|
size="medium" |
|
|
|
[isDate]="assetProfile?.dateOfFirstActivity ? true : false" |
|
|
|
[locale]="data.locale" |
|
|
|
[value]="assetProfile?.sectors[0].name" |
|
|
|
>Sector</gf-value |
|
|
|
[value]="assetProfile?.dateOfFirstActivity ?? '-'" |
|
|
|
>First Activity</gf-value |
|
|
|
> |
|
|
|
</div> |
|
|
|
} |
|
|
|
@if (assetProfile?.countries?.length === 1) { |
|
|
|
<div class="col-6 mb-3"> |
|
|
|
<gf-value |
|
|
|
i18n |
|
|
|
size="medium" |
|
|
|
[locale]="data.locale" |
|
|
|
[value]="assetProfile?.countries[0].name" |
|
|
|
>Country</gf-value |
|
|
|
[value]="assetProfile?.activitiesCount" |
|
|
|
>Activities</gf-value |
|
|
|
> |
|
|
|
</div> |
|
|
|
} |
|
|
|
} @else { |
|
|
|
<div class="col-md-6 mb-3"> |
|
|
|
<div class="h5" i18n>Sectors</div> |
|
|
|
<gf-portfolio-proportion-chart |
|
|
|
[colorScheme]="data.colorScheme" |
|
|
|
[data]="sectors" |
|
|
|
[isInPercent]="true" |
|
|
|
[keys]="['name']" |
|
|
|
[maxItems]="10" |
|
|
|
/> |
|
|
|
</div> |
|
|
|
<div class="col-md-6 mb-3"> |
|
|
|
<div class="h5" i18n>Countries</div> |
|
|
|
<gf-portfolio-proportion-chart |
|
|
|
[colorScheme]="data.colorScheme" |
|
|
|
[data]="countries" |
|
|
|
[isInPercent]="true" |
|
|
|
[keys]="['name']" |
|
|
|
[maxItems]="10" |
|
|
|
/> |
|
|
|
</div> |
|
|
|
} |
|
|
|
} |
|
|
|
</div> |
|
|
|
<form |
|
|
|
#assetProfileFormElement |
|
|
|
[formGroup]="assetProfileForm" |
|
|
|
(keyup.enter)="assetProfileForm.valid && onSubmitAssetProfileForm()" |
|
|
|
(ngSubmit)="onSubmitAssetProfileForm()" |
|
|
|
> |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field appearance="outline" class="w-100 without-hint"> |
|
|
|
<mat-label i18n>Name</mat-label> |
|
|
|
<input formControlName="name" matInput type="text" /> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
@if (assetProfile?.dataSource === 'MANUAL') { |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field appearance="outline" class="w-100 without-hint"> |
|
|
|
<mat-label i18n>Currency</mat-label> |
|
|
|
<gf-currency-selector |
|
|
|
formControlName="currency" |
|
|
|
[currencies]="currencies" |
|
|
|
/> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
} |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field appearance="outline" class="w-100 without-hint"> |
|
|
|
<mat-label i18n>Asset Class</mat-label> |
|
|
|
<mat-select formControlName="assetClass"> |
|
|
|
<mat-option [value]="null" /> |
|
|
|
@for ( |
|
|
|
assetClassOption of assetClassOptions; |
|
|
|
track assetClassOption.id |
|
|
|
) { |
|
|
|
<mat-option [value]="assetClassOption.id">{{ |
|
|
|
assetClassOption.label |
|
|
|
}}</mat-option> |
|
|
|
} |
|
|
|
</mat-select> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field appearance="outline" class="w-100 without-hint"> |
|
|
|
<mat-label i18n>Asset Sub Class</mat-label> |
|
|
|
<mat-select formControlName="assetSubClass"> |
|
|
|
<mat-option [value]="null" /> |
|
|
|
@for ( |
|
|
|
assetSubClassOption of assetSubClassOptions; |
|
|
|
track assetSubClassOption.id |
|
|
|
<div class="col-6 mb-3"> |
|
|
|
<gf-value |
|
|
|
i18n |
|
|
|
size="medium" |
|
|
|
[hidden]="!assetClassLabel" |
|
|
|
[value]="assetClassLabel" |
|
|
|
>Asset Class</gf-value |
|
|
|
> |
|
|
|
</div> |
|
|
|
<div class="col-6 mb-3"> |
|
|
|
<gf-value |
|
|
|
i18n |
|
|
|
size="medium" |
|
|
|
[hidden]="!assetSubClassLabel" |
|
|
|
[value]="assetSubClassLabel" |
|
|
|
>Asset Sub Class</gf-value |
|
|
|
> |
|
|
|
</div> |
|
|
|
@if ( |
|
|
|
assetProfile?.countries?.length > 0 || |
|
|
|
assetProfile?.sectors?.length > 0 |
|
|
|
) { |
|
|
|
<mat-option [value]="assetSubClassOption.id">{{ |
|
|
|
assetSubClassOption.label |
|
|
|
}}</mat-option> |
|
|
|
@if ( |
|
|
|
assetProfile?.countries?.length === 1 && |
|
|
|
assetProfile?.sectors?.length === 1 |
|
|
|
) { |
|
|
|
@if (assetProfile?.sectors?.length === 1) { |
|
|
|
<div class="col-6 mb-3"> |
|
|
|
<gf-value |
|
|
|
i18n |
|
|
|
size="medium" |
|
|
|
[locale]="data.locale" |
|
|
|
[value]="assetProfile?.sectors[0].name" |
|
|
|
>Sector</gf-value |
|
|
|
> |
|
|
|
</div> |
|
|
|
} |
|
|
|
@if (assetProfile?.countries?.length === 1) { |
|
|
|
<div class="col-6 mb-3"> |
|
|
|
<gf-value |
|
|
|
i18n |
|
|
|
size="medium" |
|
|
|
[locale]="data.locale" |
|
|
|
[value]="assetProfile?.countries[0].name" |
|
|
|
>Country</gf-value |
|
|
|
> |
|
|
|
</div> |
|
|
|
} |
|
|
|
} @else { |
|
|
|
<div class="col-md-6 mb-3"> |
|
|
|
<div class="h5" i18n>Sectors</div> |
|
|
|
<gf-portfolio-proportion-chart |
|
|
|
[colorScheme]="data.colorScheme" |
|
|
|
[data]="sectors" |
|
|
|
[isInPercent]="true" |
|
|
|
[keys]="['name']" |
|
|
|
[maxItems]="10" |
|
|
|
/> |
|
|
|
</div> |
|
|
|
<div class="col-md-6 mb-3"> |
|
|
|
<div class="h5" i18n>Countries</div> |
|
|
|
<gf-portfolio-proportion-chart |
|
|
|
[colorScheme]="data.colorScheme" |
|
|
|
[data]="countries" |
|
|
|
[isInPercent]="true" |
|
|
|
[keys]="['name']" |
|
|
|
[maxItems]="10" |
|
|
|
/> |
|
|
|
</div> |
|
|
|
} |
|
|
|
} |
|
|
|
</mat-select> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
<div class="d-flex my-3"> |
|
|
|
<div class="w-50"> |
|
|
|
<mat-checkbox |
|
|
|
color="primary" |
|
|
|
i18n |
|
|
|
[checked]="isBenchmark" |
|
|
|
[disabled]="isEditAssetProfileIdentifierMode" |
|
|
|
(change)=" |
|
|
|
isBenchmark |
|
|
|
? onUnsetBenchmark({ |
|
|
|
dataSource: data.dataSource, |
|
|
|
symbol: data.symbol |
|
|
|
}) |
|
|
|
: onSetBenchmark({ |
|
|
|
dataSource: data.dataSource, |
|
|
|
symbol: data.symbol |
|
|
|
}) |
|
|
|
" |
|
|
|
>Benchmark</mat-checkbox |
|
|
|
</div> |
|
|
|
<form |
|
|
|
#assetProfileFormElement |
|
|
|
[formGroup]="assetProfileForm" |
|
|
|
(keyup.enter)="assetProfileForm.valid && onSubmitAssetProfileForm()" |
|
|
|
(ngSubmit)="onSubmitAssetProfileForm()" |
|
|
|
> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field appearance="outline" class="w-100"> |
|
|
|
<mat-label i18n>Symbol Mapping</mat-label> |
|
|
|
<textarea |
|
|
|
cdkTextareaAutosize |
|
|
|
formControlName="symbolMapping" |
|
|
|
matInput |
|
|
|
type="text" |
|
|
|
></textarea> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
@if (assetProfile?.dataSource === 'MANUAL') { |
|
|
|
<div class="mb-3"> |
|
|
|
<mat-accordion class="my-3"> |
|
|
|
<mat-expansion-panel |
|
|
|
class="shadow-none" |
|
|
|
[expanded]=" |
|
|
|
assetProfileForm.controls.scraperConfiguration.controls.selector |
|
|
|
.value !== '' && |
|
|
|
assetProfileForm.controls.scraperConfiguration.controls.url |
|
|
|
.value !== '' |
|
|
|
" |
|
|
|
(closed)="scraperConfiguationIsExpanded.set(false)" |
|
|
|
(opened)="scraperConfiguationIsExpanded.set(true)" |
|
|
|
> |
|
|
|
<mat-expansion-panel-header class="p-0 pr-3"> |
|
|
|
<mat-panel-title class="font-weight-bold" i18n |
|
|
|
>Scraper Configuration</mat-panel-title |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field appearance="outline" class="w-100 without-hint"> |
|
|
|
<mat-label i18n>Name</mat-label> |
|
|
|
<input formControlName="name" matInput type="text" /> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
@if (assetProfile?.dataSource === 'MANUAL') { |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field appearance="outline" class="w-100 without-hint"> |
|
|
|
<mat-label i18n>Currency</mat-label> |
|
|
|
<gf-currency-selector |
|
|
|
formControlName="currency" |
|
|
|
[currencies]="currencies" |
|
|
|
/> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
} |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field appearance="outline" class="w-100 without-hint"> |
|
|
|
<mat-label i18n>Asset Class</mat-label> |
|
|
|
<mat-select formControlName="assetClass"> |
|
|
|
<mat-option [value]="null" /> |
|
|
|
@for ( |
|
|
|
assetClassOption of assetClassOptions; |
|
|
|
track assetClassOption.id |
|
|
|
) { |
|
|
|
<mat-option [value]="assetClassOption.id">{{ |
|
|
|
assetClassOption.label |
|
|
|
}}</mat-option> |
|
|
|
} |
|
|
|
</mat-select> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field appearance="outline" class="w-100 without-hint"> |
|
|
|
<mat-label i18n>Asset Sub Class</mat-label> |
|
|
|
<mat-select formControlName="assetSubClass"> |
|
|
|
<mat-option [value]="null" /> |
|
|
|
@for ( |
|
|
|
assetSubClassOption of assetSubClassOptions; |
|
|
|
track assetSubClassOption.id |
|
|
|
) { |
|
|
|
<mat-option [value]="assetSubClassOption.id">{{ |
|
|
|
assetSubClassOption.label |
|
|
|
}}</mat-option> |
|
|
|
} |
|
|
|
</mat-select> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
<div class="d-flex my-3"> |
|
|
|
<div class="w-50"> |
|
|
|
<mat-checkbox |
|
|
|
color="primary" |
|
|
|
i18n |
|
|
|
[checked]="isBenchmark" |
|
|
|
[disabled]="isEditAssetProfileIdentifierMode" |
|
|
|
(change)=" |
|
|
|
isBenchmark |
|
|
|
? onUnsetBenchmark({ |
|
|
|
dataSource: data.dataSource, |
|
|
|
symbol: data.symbol |
|
|
|
}) |
|
|
|
: onSetBenchmark({ |
|
|
|
dataSource: data.dataSource, |
|
|
|
symbol: data.symbol |
|
|
|
}) |
|
|
|
" |
|
|
|
>Benchmark</mat-checkbox |
|
|
|
> |
|
|
|
</mat-expansion-panel-header> |
|
|
|
<div formGroupName="scraperConfiguration"> |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field |
|
|
|
appearance="outline" |
|
|
|
class="w-100 without-hint" |
|
|
|
> |
|
|
|
<mat-label i18n>Default Market Price</mat-label> |
|
|
|
<input |
|
|
|
formControlName="defaultMarketPrice" |
|
|
|
matInput |
|
|
|
type="number" |
|
|
|
/> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field |
|
|
|
appearance="outline" |
|
|
|
class="w-100 without-hint" |
|
|
|
> |
|
|
|
<mat-label i18n>HTTP Request Headers</mat-label> |
|
|
|
<textarea |
|
|
|
cdkTextareaAutosize |
|
|
|
formControlName="headers" |
|
|
|
matInput |
|
|
|
type="text" |
|
|
|
[matAutocomplete]="auto" |
|
|
|
></textarea> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field |
|
|
|
appearance="outline" |
|
|
|
class="w-100 without-hint" |
|
|
|
> |
|
|
|
<mat-label i18n>Locale</mat-label> |
|
|
|
<input formControlName="locale" matInput type="text" /> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field |
|
|
|
appearance="outline" |
|
|
|
class="w-100 without-hint" |
|
|
|
> |
|
|
|
<mat-label i18n>Mode</mat-label> |
|
|
|
<mat-select formControlName="mode"> |
|
|
|
@for (modeValue of modeValues; track modeValue) { |
|
|
|
<mat-option [value]="modeValue.value">{{ |
|
|
|
modeValue.viewValue |
|
|
|
}}</mat-option> |
|
|
|
} |
|
|
|
</mat-select> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field |
|
|
|
appearance="outline" |
|
|
|
class="w-100 without-hint" |
|
|
|
> |
|
|
|
<mat-label> |
|
|
|
<ng-container i18n>Selector</ng-container>* |
|
|
|
</mat-label> |
|
|
|
<textarea |
|
|
|
cdkTextareaAutosize |
|
|
|
formControlName="selector" |
|
|
|
matInput |
|
|
|
type="text" |
|
|
|
></textarea> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field |
|
|
|
appearance="outline" |
|
|
|
class="w-100 without-hint" |
|
|
|
> |
|
|
|
<mat-label> |
|
|
|
<ng-container i18n>Url</ng-container>* |
|
|
|
</mat-label> |
|
|
|
<input formControlName="url" matInput type="text" /> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
<div class="my-3 text-right"> |
|
|
|
<button |
|
|
|
color="accent" |
|
|
|
mat-flat-button |
|
|
|
type="button" |
|
|
|
[disabled]=" |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field appearance="outline" class="w-100"> |
|
|
|
<mat-label i18n>Symbol Mapping</mat-label> |
|
|
|
<textarea |
|
|
|
cdkTextareaAutosize |
|
|
|
formControlName="symbolMapping" |
|
|
|
matInput |
|
|
|
type="text" |
|
|
|
></textarea> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
@if (assetProfile?.dataSource === 'MANUAL') { |
|
|
|
<div class="mb-3"> |
|
|
|
<mat-accordion class="my-3"> |
|
|
|
<mat-expansion-panel |
|
|
|
class="shadow-none" |
|
|
|
[expanded]=" |
|
|
|
assetProfileForm.controls.scraperConfiguration.controls |
|
|
|
.selector.value === '' || |
|
|
|
.selector.value !== '' && |
|
|
|
assetProfileForm.controls.scraperConfiguration.controls |
|
|
|
.url.value === '' |
|
|
|
.url.value !== '' |
|
|
|
" |
|
|
|
(click)="onTestMarketData()" |
|
|
|
(closed)="scraperConfiguationIsExpanded.set(false)" |
|
|
|
(opened)="scraperConfiguationIsExpanded.set(true)" |
|
|
|
> |
|
|
|
<ng-container i18n>Test</ng-container> |
|
|
|
</button> |
|
|
|
</div> |
|
|
|
<mat-expansion-panel-header class="p-0 pr-3"> |
|
|
|
<mat-panel-title class="font-weight-bold" i18n |
|
|
|
>Scraper Configuration</mat-panel-title |
|
|
|
> |
|
|
|
</mat-expansion-panel-header> |
|
|
|
<div formGroupName="scraperConfiguration"> |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field |
|
|
|
appearance="outline" |
|
|
|
class="w-100 without-hint" |
|
|
|
> |
|
|
|
<mat-label i18n>Default Market Price</mat-label> |
|
|
|
<input |
|
|
|
formControlName="defaultMarketPrice" |
|
|
|
matInput |
|
|
|
type="number" |
|
|
|
/> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field |
|
|
|
appearance="outline" |
|
|
|
class="w-100 without-hint" |
|
|
|
> |
|
|
|
<mat-label i18n>HTTP Request Headers</mat-label> |
|
|
|
<textarea |
|
|
|
cdkTextareaAutosize |
|
|
|
formControlName="headers" |
|
|
|
matInput |
|
|
|
type="text" |
|
|
|
[matAutocomplete]="auto" |
|
|
|
></textarea> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field |
|
|
|
appearance="outline" |
|
|
|
class="w-100 without-hint" |
|
|
|
> |
|
|
|
<mat-label i18n>Locale</mat-label> |
|
|
|
<input |
|
|
|
formControlName="locale" |
|
|
|
matInput |
|
|
|
type="text" |
|
|
|
/> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field |
|
|
|
appearance="outline" |
|
|
|
class="w-100 without-hint" |
|
|
|
> |
|
|
|
<mat-label i18n>Mode</mat-label> |
|
|
|
<mat-select formControlName="mode"> |
|
|
|
@for (modeValue of modeValues; track modeValue) { |
|
|
|
<mat-option [value]="modeValue.value">{{ |
|
|
|
modeValue.viewValue |
|
|
|
}}</mat-option> |
|
|
|
} |
|
|
|
</mat-select> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field |
|
|
|
appearance="outline" |
|
|
|
class="w-100 without-hint" |
|
|
|
> |
|
|
|
<mat-label> |
|
|
|
<ng-container i18n>Selector</ng-container>* |
|
|
|
</mat-label> |
|
|
|
<textarea |
|
|
|
cdkTextareaAutosize |
|
|
|
formControlName="selector" |
|
|
|
matInput |
|
|
|
type="text" |
|
|
|
></textarea> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field |
|
|
|
appearance="outline" |
|
|
|
class="w-100 without-hint" |
|
|
|
> |
|
|
|
<mat-label> |
|
|
|
<ng-container i18n>Url</ng-container>* |
|
|
|
</mat-label> |
|
|
|
<input formControlName="url" matInput type="text" /> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
<div class="my-3 text-right"> |
|
|
|
<button |
|
|
|
color="accent" |
|
|
|
mat-flat-button |
|
|
|
type="button" |
|
|
|
[disabled]=" |
|
|
|
assetProfileForm.controls.scraperConfiguration |
|
|
|
.controls.selector.value === '' || |
|
|
|
assetProfileForm.controls.scraperConfiguration |
|
|
|
.controls.url.value === '' |
|
|
|
" |
|
|
|
(click)="onTestMarketData()" |
|
|
|
> |
|
|
|
<ng-container i18n>Test</ng-container> |
|
|
|
</button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</mat-expansion-panel> |
|
|
|
</mat-accordion> |
|
|
|
</div> |
|
|
|
</mat-expansion-panel> |
|
|
|
</mat-accordion> |
|
|
|
</div> |
|
|
|
} |
|
|
|
@if (assetProfile?.dataSource === 'MANUAL') { |
|
|
|
<div> |
|
|
|
<mat-form-field appearance="outline" class="w-100"> |
|
|
|
<mat-label i18n>Sectors</mat-label> |
|
|
|
<textarea |
|
|
|
cdkTextareaAutosize |
|
|
|
formControlName="sectors" |
|
|
|
matInput |
|
|
|
type="text" |
|
|
|
></textarea> |
|
|
|
</mat-form-field> |
|
|
|
} |
|
|
|
@if (assetProfile?.dataSource === 'MANUAL') { |
|
|
|
<div> |
|
|
|
<mat-form-field appearance="outline" class="w-100"> |
|
|
|
<mat-label i18n>Sectors</mat-label> |
|
|
|
<textarea |
|
|
|
cdkTextareaAutosize |
|
|
|
formControlName="sectors" |
|
|
|
matInput |
|
|
|
type="text" |
|
|
|
></textarea> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
<div> |
|
|
|
<mat-form-field appearance="outline" class="w-100"> |
|
|
|
<mat-label i18n>Countries</mat-label> |
|
|
|
<textarea |
|
|
|
cdkTextareaAutosize |
|
|
|
formControlName="countries" |
|
|
|
matInput |
|
|
|
type="text" |
|
|
|
></textarea> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
} |
|
|
|
<div> |
|
|
|
<mat-form-field appearance="outline" class="w-100 without-hint"> |
|
|
|
<mat-label i18n>Url</mat-label> |
|
|
|
<input formControlName="url" matInput type="text" /> |
|
|
|
@if (assetProfileForm.get('url').value) { |
|
|
|
<gf-entity-logo |
|
|
|
class="mr-3" |
|
|
|
matSuffix |
|
|
|
[url]="assetProfileForm.get('url').value" |
|
|
|
/> |
|
|
|
} |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field appearance="outline" class="w-100"> |
|
|
|
<mat-label i18n>Note</mat-label> |
|
|
|
<textarea |
|
|
|
cdkAutosizeMinRows="2" |
|
|
|
cdkTextareaAutosize |
|
|
|
formControlName="comment" |
|
|
|
matInput |
|
|
|
(keyup.enter)="$event.stopPropagation()" |
|
|
|
></textarea> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
</form> |
|
|
|
</div> |
|
|
|
<div> |
|
|
|
<mat-form-field appearance="outline" class="w-100"> |
|
|
|
<mat-label i18n>Countries</mat-label> |
|
|
|
<textarea |
|
|
|
cdkTextareaAutosize |
|
|
|
formControlName="countries" |
|
|
|
matInput |
|
|
|
type="text" |
|
|
|
></textarea> |
|
|
|
</mat-form-field> |
|
|
|
</mat-tab> |
|
|
|
<mat-tab> |
|
|
|
<ng-template mat-tab-label> |
|
|
|
<ion-icon name="server-outline" /> |
|
|
|
<div class="d-none d-sm-block ml-2" i18n>Historical Market Data</div> |
|
|
|
</ng-template> |
|
|
|
<div class="container mt-3 p-0"> |
|
|
|
<div class="no-gutters row w-100"> |
|
|
|
<div class="col-12"> |
|
|
|
<gf-historical-market-data-editor |
|
|
|
[currency]="assetProfile?.currency" |
|
|
|
[dataSource]="data.dataSource" |
|
|
|
[dateOfFirstActivity]="assetProfile?.dateOfFirstActivity" |
|
|
|
[locale]="data.locale" |
|
|
|
[marketData]="marketDataItems" |
|
|
|
[symbol]="data.symbol" |
|
|
|
[user]="user" |
|
|
|
(marketDataChanged)="onMarketDataChanged($event)" |
|
|
|
/> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
} |
|
|
|
<div> |
|
|
|
<mat-form-field appearance="outline" class="w-100 without-hint"> |
|
|
|
<mat-label i18n>Url</mat-label> |
|
|
|
<input formControlName="url" matInput type="text" /> |
|
|
|
@if (assetProfileForm.get('url').value) { |
|
|
|
<gf-entity-logo |
|
|
|
class="mr-3" |
|
|
|
matSuffix |
|
|
|
[url]="assetProfileForm.get('url').value" |
|
|
|
/> |
|
|
|
} |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
<div class="mt-3"> |
|
|
|
<mat-form-field appearance="outline" class="w-100"> |
|
|
|
<mat-label i18n>Note</mat-label> |
|
|
|
<textarea |
|
|
|
cdkAutosizeMinRows="2" |
|
|
|
cdkTextareaAutosize |
|
|
|
formControlName="comment" |
|
|
|
matInput |
|
|
|
(keyup.enter)="$event.stopPropagation()" |
|
|
|
></textarea> |
|
|
|
</mat-form-field> |
|
|
|
</div> |
|
|
|
</form> |
|
|
|
</mat-tab> |
|
|
|
</mat-tab-group> |
|
|
|
</div> |
|
|
|
|
|
|
|
<div class="d-flex" mat-dialog-actions> |
|
|
|