|
@ -2,7 +2,7 @@ |
|
|
<div |
|
|
<div |
|
|
[style.width]="deviceType === 'mobile' ? '85vw' : '30rem'" |
|
|
[style.width]="deviceType === 'mobile' ? '85vw' : '30rem'" |
|
|
(keydown.tab)="$event.stopPropagation()" |
|
|
(keydown.tab)="$event.stopPropagation()" |
|
|
> |
|
|
> |
|
|
<div class="align-items-center d-flex search-container"> |
|
|
<div class="align-items-center d-flex search-container"> |
|
|
<ion-icon class="ml-2 mr-0" name="search-outline" /> |
|
|
<ion-icon class="ml-2 mr-0" name="search-outline" /> |
|
|
<input |
|
|
<input |
|
@ -14,77 +14,91 @@ |
|
|
type="text" |
|
|
type="text" |
|
|
[formControl]="searchFormControl" |
|
|
[formControl]="searchFormControl" |
|
|
[placeholder]="placeholder" |
|
|
[placeholder]="placeholder" |
|
|
/> |
|
|
|
|
|
<div |
|
|
|
|
|
*ngIf="deviceType !== 'mobile' && !searchFormControl.value" |
|
|
|
|
|
class="hot-key-hint mx-1 px-1" |
|
|
|
|
|
> |
|
|
|
|
|
/ |
|
|
|
|
|
</div> |
|
|
|
|
|
<button |
|
|
|
|
|
*ngIf="searchFormControl.value" |
|
|
|
|
|
class="h-100 no-min-width px-3 rounded-0" |
|
|
|
|
|
mat-button |
|
|
|
|
|
(click)="initialize()" |
|
|
|
|
|
> |
|
|
|
|
|
<ion-icon class="m-0" name="close-circle-outline" /> |
|
|
|
|
|
</button> |
|
|
|
|
|
<button |
|
|
|
|
|
*ngIf="!searchFormControl.value" |
|
|
|
|
|
class="h-100 no-min-width px-3 rounded-0" |
|
|
|
|
|
mat-button |
|
|
|
|
|
(click)="onCloseAssistant()" |
|
|
|
|
|
> |
|
|
|
|
|
<ion-icon class="m-0" name="close-outline" /> |
|
|
|
|
|
</button> |
|
|
|
|
|
</div> |
|
|
|
|
|
<div |
|
|
|
|
|
*ngIf="isLoading || searchFormControl.value" |
|
|
|
|
|
class="overflow-auto py-3 result-container" |
|
|
|
|
|
> |
|
|
|
|
|
<div> |
|
|
|
|
|
<div class="h6 mb-1 px-2" i18n>Holdings</div> |
|
|
|
|
|
<gf-assistant-list-item |
|
|
|
|
|
*ngFor="let searchResultItem of searchResults?.holdings" |
|
|
|
|
|
mode="holding" |
|
|
|
|
|
[item]="searchResultItem" |
|
|
|
|
|
(clicked)="onCloseAssistant()" |
|
|
|
|
|
/> |
|
|
/> |
|
|
<ng-container *ngIf="searchResults?.holdings?.length === 0"> |
|
|
@if (deviceType !== 'mobile' && !searchFormControl.value) { |
|
|
<ngx-skeleton-loader |
|
|
<div |
|
|
*ngIf="isLoading" |
|
|
class="hot-key-hint mx-1 px-1" |
|
|
animation="pulse" |
|
|
> |
|
|
class="mx-2" |
|
|
/ |
|
|
|
|
|
</div> |
|
|
|
|
|
} |
|
|
|
|
|
@if (searchFormControl.value) { |
|
|
|
|
|
<button |
|
|
|
|
|
class="h-100 no-min-width px-3 rounded-0" |
|
|
|
|
|
mat-button |
|
|
|
|
|
(click)="initialize()" |
|
|
|
|
|
> |
|
|
|
|
|
<ion-icon class="m-0" name="close-circle-outline" /> |
|
|
|
|
|
</button> |
|
|
|
|
|
} |
|
|
|
|
|
@if (!searchFormControl.value) { |
|
|
|
|
|
<button |
|
|
|
|
|
class="h-100 no-min-width px-3 rounded-0" |
|
|
|
|
|
mat-button |
|
|
|
|
|
(click)="onCloseAssistant()" |
|
|
|
|
|
> |
|
|
|
|
|
<ion-icon class="m-0" name="close-outline" /> |
|
|
|
|
|
</button> |
|
|
|
|
|
} |
|
|
|
|
|
</div> |
|
|
|
|
|
@if (isLoading || searchFormControl.value) { |
|
|
|
|
|
<div |
|
|
|
|
|
class="overflow-auto py-3 result-container" |
|
|
|
|
|
> |
|
|
|
|
|
<div> |
|
|
|
|
|
<div class="h6 mb-1 px-2" i18n>Holdings</div> |
|
|
|
|
|
@for (searchResultItem of searchResults?.holdings; track searchResultItem) { |
|
|
|
|
|
<gf-assistant-list-item |
|
|
|
|
|
mode="holding" |
|
|
|
|
|
[item]="searchResultItem" |
|
|
|
|
|
(clicked)="onCloseAssistant()" |
|
|
|
|
|
/> |
|
|
|
|
|
} |
|
|
|
|
|
@if (searchResults?.holdings?.length === 0) { |
|
|
|
|
|
@if (isLoading) { |
|
|
|
|
|
<ngx-skeleton-loader |
|
|
|
|
|
animation="pulse" |
|
|
|
|
|
class="mx-2" |
|
|
[theme]="{ |
|
|
[theme]="{ |
|
|
height: '1.5rem', |
|
|
height: '1.5rem', |
|
|
width: '100%' |
|
|
width: '100%' |
|
|
}" |
|
|
}" |
|
|
/> |
|
|
/> |
|
|
<div *ngIf="!isLoading" class="px-2 py-1" i18n>No entries...</div> |
|
|
} |
|
|
</ng-container> |
|
|
@if (!isLoading) { |
|
|
</div> |
|
|
<div class="px-2 py-1" i18n>No entries...</div> |
|
|
<div *ngIf="hasPermissionToAccessAdminControl" class="mt-3"> |
|
|
} |
|
|
<div class="h6 mb-1 px-2" i18n>Asset Profiles</div> |
|
|
} |
|
|
<gf-assistant-list-item |
|
|
</div> |
|
|
*ngFor="let searchResultItem of searchResults?.assetProfiles" |
|
|
@if (hasPermissionToAccessAdminControl) { |
|
|
mode="assetProfile" |
|
|
<div class="mt-3"> |
|
|
[item]="searchResultItem" |
|
|
<div class="h6 mb-1 px-2" i18n>Asset Profiles</div> |
|
|
(clicked)="onCloseAssistant()" |
|
|
@for (searchResultItem of searchResults?.assetProfiles; track searchResultItem) { |
|
|
/> |
|
|
<gf-assistant-list-item |
|
|
<ng-container *ngIf="searchResults?.assetProfiles?.length === 0"> |
|
|
mode="assetProfile" |
|
|
<ngx-skeleton-loader |
|
|
[item]="searchResultItem" |
|
|
*ngIf="isLoading" |
|
|
(clicked)="onCloseAssistant()" |
|
|
animation="pulse" |
|
|
/> |
|
|
class="mx-2" |
|
|
} |
|
|
|
|
|
@if (searchResults?.assetProfiles?.length === 0) { |
|
|
|
|
|
@if (isLoading) { |
|
|
|
|
|
<ngx-skeleton-loader |
|
|
|
|
|
animation="pulse" |
|
|
|
|
|
class="mx-2" |
|
|
[theme]="{ |
|
|
[theme]="{ |
|
|
height: '1.5rem', |
|
|
height: '1.5rem', |
|
|
width: '100%' |
|
|
width: '100%' |
|
|
}" |
|
|
}" |
|
|
/> |
|
|
/> |
|
|
<div *ngIf="!isLoading" class="px-2 py-1" i18n>No entries...</div> |
|
|
} |
|
|
</ng-container> |
|
|
@if (!isLoading) { |
|
|
|
|
|
<div class="px-2 py-1" i18n>No entries...</div> |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
</div> |
|
|
|
|
|
} |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
} |
|
|
</div> |
|
|
</div> |
|
|
<form [formGroup]="filterForm"> |
|
|
<form [formGroup]="filterForm"> |
|
|
@if (!searchFormControl.value) { |
|
|
@if (!searchFormControl.value) { |
|
@ -94,7 +108,7 @@ |
|
|
<mat-select |
|
|
<mat-select |
|
|
[formControl]="dateRangeFormControl" |
|
|
[formControl]="dateRangeFormControl" |
|
|
(selectionChange)="onChangeDateRange($event.value)" |
|
|
(selectionChange)="onChangeDateRange($event.value)" |
|
|
> |
|
|
> |
|
|
@for (range of dateRangeOptions; track range) { |
|
|
@for (range of dateRangeOptions; track range) { |
|
|
<mat-option [value]="range.value">{{ range.label }}</mat-option> |
|
|
<mat-option [value]="range.value">{{ range.label }}</mat-option> |
|
|
} |
|
|
} |
|
@ -110,93 +124,94 @@ |
|
|
@for (account of accounts; track account.id) { |
|
|
@for (account of accounts; track account.id) { |
|
|
<mat-option [value]="account.id"> |
|
|
<mat-option [value]="account.id"> |
|
|
<div class="d-flex"> |
|
|
<div class="d-flex"> |
|
|
<gf-asset-profile-icon |
|
|
@if (account.Platform?.url) { |
|
|
*ngIf="account.Platform?.url" |
|
|
<gf-asset-profile-icon |
|
|
class="mr-1" |
|
|
class="mr-1" |
|
|
[tooltip]="account.Platform?.name" |
|
|
[tooltip]="account.Platform?.name" |
|
|
[url]="account.Platform?.url" |
|
|
[url]="account.Platform?.url" |
|
|
/><span>{{ account.name }}</span> |
|
|
/> |
|
|
</div> |
|
|
}<span>{{ account.name }}</span> |
|
|
</mat-option> |
|
|
</div> |
|
|
} |
|
|
</mat-option> |
|
|
</mat-select> |
|
|
} |
|
|
</mat-form-field> |
|
|
</mat-select> |
|
|
</div> |
|
|
</mat-form-field> |
|
|
<div class="mb-3"> |
|
|
</div> |
|
|
<mat-form-field appearance="outline" class="w-100 without-hint"> |
|
|
<div class="mb-3"> |
|
|
<mat-label i18n>Holding</mat-label> |
|
|
<mat-form-field appearance="outline" class="w-100 without-hint"> |
|
|
<mat-select |
|
|
<mat-label i18n>Holding</mat-label> |
|
|
formControlName="holding" |
|
|
<mat-select |
|
|
[compareWith]="holdingComparisonFunction" |
|
|
formControlName="holding" |
|
|
> |
|
|
[compareWith]="holdingComparisonFunction" |
|
|
<mat-select-trigger>{{ |
|
|
> |
|
|
filterForm.get('holding')?.value?.name |
|
|
<mat-select-trigger>{{ |
|
|
}}</mat-select-trigger> |
|
|
filterForm.get('holding')?.value?.name |
|
|
<mat-option [value]="null" /> |
|
|
}}</mat-select-trigger> |
|
|
@for (holding of holdings; track holding.name) { |
|
|
<mat-option [value]="null" /> |
|
|
<mat-option [value]="holding"> |
|
|
@for (holding of holdings; track holding.name) { |
|
|
<div class="line-height-1 text-truncate"> |
|
|
<mat-option [value]="holding"> |
|
|
<span |
|
|
<div class="line-height-1 text-truncate"> |
|
|
><b>{{ holding.name }}</b></span |
|
|
<span |
|
|
> |
|
|
><b>{{ holding.name }}</b></span |
|
|
<br /> |
|
|
> |
|
|
<small class="text-muted" |
|
|
<br /> |
|
|
>{{ holding.symbol | gfSymbol }} · |
|
|
<small class="text-muted" |
|
|
{{ holding.currency }}</small |
|
|
>{{ holding.symbol | gfSymbol }} · |
|
|
> |
|
|
{{ holding.currency }}</small |
|
|
</div> |
|
|
> |
|
|
</mat-option> |
|
|
</div> |
|
|
} |
|
|
</mat-option> |
|
|
</mat-select> |
|
|
} |
|
|
</mat-form-field> |
|
|
</mat-select> |
|
|
</div> |
|
|
</mat-form-field> |
|
|
<div class="mb-3"> |
|
|
</div> |
|
|
<mat-form-field appearance="outline" class="w-100 without-hint"> |
|
|
<div class="mb-3"> |
|
|
<mat-label i18n>Tag</mat-label> |
|
|
<mat-form-field appearance="outline" class="w-100 without-hint"> |
|
|
<mat-select formControlName="tag"> |
|
|
<mat-label i18n>Tag</mat-label> |
|
|
<mat-option [value]="null" /> |
|
|
<mat-select formControlName="tag"> |
|
|
@for (tag of tags; track tag.id) { |
|
|
<mat-option [value]="null" /> |
|
|
<mat-option [value]="tag.id">{{ tag.label }}</mat-option> |
|
|
@for (tag of tags; track tag.id) { |
|
|
} |
|
|
<mat-option [value]="tag.id">{{ tag.label }}</mat-option> |
|
|
</mat-select> |
|
|
} |
|
|
</mat-form-field> |
|
|
</mat-select> |
|
|
</div> |
|
|
</mat-form-field> |
|
|
<div class="mb-3"> |
|
|
</div> |
|
|
<mat-form-field appearance="outline" class="w-100 without-hint"> |
|
|
<div class="mb-3"> |
|
|
<mat-label i18n>Asset Class</mat-label> |
|
|
<mat-form-field appearance="outline" class="w-100 without-hint"> |
|
|
<mat-select formControlName="assetClass"> |
|
|
<mat-label i18n>Asset Class</mat-label> |
|
|
<mat-option [value]="null" /> |
|
|
<mat-select formControlName="assetClass"> |
|
|
@for (assetClass of assetClasses; track assetClass.id) { |
|
|
<mat-option [value]="null" /> |
|
|
<mat-option [value]="assetClass.id">{{ |
|
|
@for (assetClass of assetClasses; track assetClass.id) { |
|
|
assetClass.label |
|
|
<mat-option [value]="assetClass.id">{{ |
|
|
}}</mat-option> |
|
|
assetClass.label |
|
|
} |
|
|
}}</mat-option> |
|
|
</mat-select> |
|
|
} |
|
|
</mat-form-field> |
|
|
</mat-select> |
|
|
</div> |
|
|
</mat-form-field> |
|
|
<div class="d-flex w-100"> |
|
|
</div> |
|
|
<button |
|
|
<div class="d-flex w-100"> |
|
|
i18n |
|
|
<button |
|
|
mat-button |
|
|
i18n |
|
|
|
|
|
mat-button |
|
|
[disabled]=" |
|
|
[disabled]=" |
|
|
!hasFilter(filterForm.value) || !hasPermissionToChangeFilters |
|
|
!hasFilter(filterForm.value) || !hasPermissionToChangeFilters |
|
|
" |
|
|
" |
|
|
(click)="onResetFilters()" |
|
|
(click)="onResetFilters()" |
|
|
> |
|
|
> |
|
|
Reset Filters |
|
|
Reset Filters |
|
|
</button> |
|
|
</button> |
|
|
<span class="gf-spacer"></span> |
|
|
<span class="gf-spacer"></span> |
|
|
<button |
|
|
<button |
|
|
color="primary" |
|
|
color="primary" |
|
|
i18n |
|
|
i18n |
|
|
mat-flat-button |
|
|
mat-flat-button |
|
|
[disabled]="!filterForm.dirty || !hasPermissionToChangeFilters" |
|
|
[disabled]="!filterForm.dirty || !hasPermissionToChangeFilters" |
|
|
(click)="onApplyFilters()" |
|
|
(click)="onApplyFilters()" |
|
|
> |
|
|
> |
|
|
Apply Filters |
|
|
Apply Filters |
|
|
</button> |
|
|
</button> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
} |
|
|
|
|
|
</form> |
|
|
</div> |
|
|
</div> |
|
|
} |
|
|
|
|
|
</form> |
|
|
|
|
|
</div> |
|
|
|
|
|