@ -1,9 +1,4 @@
< form
class="d-flex flex-column h-100"
[formGroup]="assetProfileForm"
(keyup.enter)="assetProfileForm.valid & & onSubmit()"
(ngSubmit)="onSubmit()"
>
< div class = "d-flex flex-column h-100" >
< div class = "d-flex mb-3" >
< h1 class = "flex-grow-1 m-0" mat-dialog-title >
{{ assetProfile?.name ?? data.symbol }}
@ -91,21 +86,84 @@
/>
< div class = "row" >
< 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 >
@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
@ -202,230 +260,256 @@
}
}
< / div >
< 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') {
< 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 > Currency< / mat-label >
< gf-currency-selector
formControlName="currency"
[currencies]="currencies"
/>
< mat-label i18n > Name< / mat-label >
< input formControlName = "name" matInput type = "text" / >
< / 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 (assetClass of assetClasses; track assetClass) {
< mat-option [ value ] = " assetClass . id " > {{
assetClass.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 (assetSubClass of assetSubClasses; track assetSubClass) {
< mat-option [ value ] = " assetSubClass . id " > {{
assetSubClass.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"
(change)="
isBenchmark
? onUnsetBenchmark({
dataSource: data.dataSource,
symbol: data.symbol
})
: onSetBenchmark({
dataSource: data.dataSource,
symbol: data.symbol
})
"
>Benchmark< /mat-checkbox
>
@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 (assetClass of assetClasses; track assetClass) {
< mat-option [ value ] = " assetClass . id " > {{
assetClass.label
}}< / mat-option >
}
< / mat-select >
< / mat-form-field >
< / 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 !== ''
< 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 (assetSubClass of assetSubClasses; track assetSubClass) {
< mat-option [ value ] = " assetSubClass . id " > {{
assetSubClass.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
})
"
(closed)="scraperConfiguationIsExpanded.set(false)"
(opened)="scraperConfiguationIsExpanded.set(true)"
>Benchmark< /mat-checkbox
>
< mat-expansion-panel-header class = "p-0" >
< mat-panel-title 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 >
< / div >
}
@if (assetProfile?.dataSource === 'MANUAL') {
< div >
< div class = "mt-3" >
< mat-form-field appearance = "outline" class = "w-100" >
< mat-label i18n > Sectors < / mat-label >
< mat-label i18n > Symbol Mapping< / mat-label >
< textarea
cdkTextareaAutosize
formControlName="sectors "
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" >
< mat-panel-title 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 >
}
@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-asset-profile-icon
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 > Countries< / mat-label >
< mat-label i18n > Note < / mat-label >
< textarea
cdkAutosizeMinRows="2"
cdkTextareaAutosize
formControlName="countries"
formControlName="comment "
matInput
type="text"
(keyup.enter)="$event.stopPropagation() "
>< / 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-asset-profile-icon
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 class = "d-flex justify-content-end" mat-dialog-actions >
@ -433,10 +517,10 @@
< button
color="primary"
mat-flat-button
type="submit"
[disabled]="!(assetProfileForm.dirty & & assetProfileForm.valid)"
(click)="onTriggerSubmitAssetProfileForm()"
>
< ng-container i18n > Save< / ng-container >
< / button >
< / div >
< / form >
< / div >