Bugfix/fix horizontal overflow in activities table (#676)
* Fix horizontal overflow in tables * Update changelog
This commit is contained in:
parent
65bfe52db4
commit
bed3e5aae2
@ -17,6 +17,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
- Removed the _Admin_ user from the database seeding
|
- Removed the _Admin_ user from the database seeding
|
||||||
- Assigned the role `ADMIN` on sign up (only if there is no admin yet)
|
- Assigned the role `ADMIN` on sign up (only if there is no admin yet)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed the horizontal overflow in the accounts table
|
||||||
|
- Fixed the horizontal overflow in the activities table
|
||||||
|
|
||||||
### Todo
|
### Todo
|
||||||
|
|
||||||
- Apply data migration (`yarn database:migrate`)
|
- Apply data migration (`yarn database:migrate`)
|
||||||
|
@ -11,7 +11,7 @@ import { takeUntil } from 'rxjs/operators';
|
|||||||
import { environment } from '../../../environments/environment';
|
import { environment } from '../../../environments/environment';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
host: { class: 'mb-5' },
|
host: { class: 'page' },
|
||||||
selector: 'gf-about-page',
|
selector: 'gf-about-page',
|
||||||
styleUrls: ['./about-page.scss'],
|
styleUrls: ['./about-page.scss'],
|
||||||
templateUrl: './about-page.html'
|
templateUrl: './about-page.html'
|
||||||
|
@ -2,7 +2,7 @@ import { Component, OnDestroy } from '@angular/core';
|
|||||||
import { Subject } from 'rxjs';
|
import { Subject } from 'rxjs';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
host: { class: 'mb-5' },
|
host: { class: 'page' },
|
||||||
selector: 'gf-changelog-page',
|
selector: 'gf-changelog-page',
|
||||||
styleUrls: ['./changelog-page.scss'],
|
styleUrls: ['./changelog-page.scss'],
|
||||||
templateUrl: './changelog-page.html'
|
templateUrl: './changelog-page.html'
|
||||||
|
@ -31,7 +31,7 @@ import { catchError, switchMap, takeUntil } from 'rxjs/operators';
|
|||||||
import { CreateOrUpdateAccessDialog } from './create-or-update-access-dialog/create-or-update-access-dialog.component';
|
import { CreateOrUpdateAccessDialog } from './create-or-update-access-dialog/create-or-update-access-dialog.component';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
host: { class: 'mb-5' },
|
host: { class: 'page' },
|
||||||
selector: 'gf-account-page',
|
selector: 'gf-account-page',
|
||||||
styleUrls: ['./account-page.scss'],
|
styleUrls: ['./account-page.scss'],
|
||||||
templateUrl: './account-page.html'
|
templateUrl: './account-page.html'
|
||||||
|
@ -16,7 +16,7 @@ import { takeUntil } from 'rxjs/operators';
|
|||||||
import { CreateOrUpdateAccountDialog } from './create-or-update-account-dialog/create-or-update-account-dialog.component';
|
import { CreateOrUpdateAccountDialog } from './create-or-update-account-dialog/create-or-update-account-dialog.component';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
host: { class: 'mb-5' },
|
host: { class: 'page' },
|
||||||
selector: 'gf-accounts-page',
|
selector: 'gf-accounts-page',
|
||||||
styleUrls: ['./accounts-page.scss'],
|
styleUrls: ['./accounts-page.scss'],
|
||||||
templateUrl: './accounts-page.html'
|
templateUrl: './accounts-page.html'
|
||||||
|
@ -1,19 +1,21 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row mb-3">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h3 class="d-flex justify-content-center mb-3" i18n>Accounts</h3>
|
<h3 class="d-flex justify-content-center mb-3" i18n>Accounts</h3>
|
||||||
<gf-accounts-table
|
<div class="accounts">
|
||||||
[accounts]="accounts"
|
<gf-accounts-table
|
||||||
[baseCurrency]="user?.settings?.baseCurrency"
|
[accounts]="accounts"
|
||||||
[deviceType]="deviceType"
|
[baseCurrency]="user?.settings?.baseCurrency"
|
||||||
[locale]="user?.settings?.locale"
|
[deviceType]="deviceType"
|
||||||
[showActions]="!hasImpersonationId && hasPermissionToDeleteAccount && !user.settings.isRestrictedView"
|
[locale]="user?.settings?.locale"
|
||||||
[totalBalance]="totalBalance"
|
[showActions]="!hasImpersonationId && hasPermissionToDeleteAccount && !user.settings.isRestrictedView"
|
||||||
[totalValue]="totalValue"
|
[totalBalance]="totalBalance"
|
||||||
[transactionCount]="transactionCount"
|
[totalValue]="totalValue"
|
||||||
(accountDeleted)="onDeleteAccount($event)"
|
[transactionCount]="transactionCount"
|
||||||
(accountToUpdate)="onUpdateAccount($event)"
|
(accountDeleted)="onDeleteAccount($event)"
|
||||||
></gf-accounts-table>
|
(accountToUpdate)="onUpdateAccount($event)"
|
||||||
|
></gf-accounts-table>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
:host {
|
:host {
|
||||||
display: block;
|
display: block;
|
||||||
|
|
||||||
|
.accounts {
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
|
||||||
.fab-container {
|
.fab-container {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
right: 2rem;
|
right: 2rem;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { Component } from '@angular/core';
|
import { Component } from '@angular/core';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
host: { class: 'mb-5' },
|
host: { class: 'page' },
|
||||||
selector: 'gf-hallo-ghostfolio-page',
|
selector: 'gf-hallo-ghostfolio-page',
|
||||||
styleUrls: ['./hallo-ghostfolio-page.scss'],
|
styleUrls: ['./hallo-ghostfolio-page.scss'],
|
||||||
templateUrl: './hallo-ghostfolio-page.html'
|
templateUrl: './hallo-ghostfolio-page.html'
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { Component } from '@angular/core';
|
import { Component } from '@angular/core';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
host: { class: 'mb-5' },
|
host: { class: 'page' },
|
||||||
selector: 'gf-hello-ghostfolio-page',
|
selector: 'gf-hello-ghostfolio-page',
|
||||||
styleUrls: ['./hello-ghostfolio-page.scss'],
|
styleUrls: ['./hello-ghostfolio-page.scss'],
|
||||||
templateUrl: './hello-ghostfolio-page.html'
|
templateUrl: './hello-ghostfolio-page.html'
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { Component } from '@angular/core';
|
import { Component } from '@angular/core';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
host: { class: 'mb-5' },
|
host: { class: 'page' },
|
||||||
selector: 'gf-first-months-in-open-source-page',
|
selector: 'gf-first-months-in-open-source-page',
|
||||||
styleUrls: ['./first-months-in-open-source-page.scss'],
|
styleUrls: ['./first-months-in-open-source-page.scss'],
|
||||||
templateUrl: './first-months-in-open-source-page.html'
|
templateUrl: './first-months-in-open-source-page.html'
|
||||||
|
@ -2,7 +2,7 @@ import { Component, OnDestroy } from '@angular/core';
|
|||||||
import { Subject } from 'rxjs';
|
import { Subject } from 'rxjs';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
host: { class: 'mb-5' },
|
host: { class: 'page' },
|
||||||
selector: 'gf-blog-page',
|
selector: 'gf-blog-page',
|
||||||
styleUrls: ['./blog-page.scss'],
|
styleUrls: ['./blog-page.scss'],
|
||||||
templateUrl: './blog-page.html'
|
templateUrl: './blog-page.html'
|
||||||
|
@ -6,7 +6,7 @@ import { format } from 'date-fns';
|
|||||||
import { Subject } from 'rxjs';
|
import { Subject } from 'rxjs';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
host: { class: 'mb-5' },
|
host: { class: 'page' },
|
||||||
selector: 'gf-landing-page',
|
selector: 'gf-landing-page',
|
||||||
styleUrls: ['./landing-page.scss'],
|
styleUrls: ['./landing-page.scss'],
|
||||||
templateUrl: './landing-page.html'
|
templateUrl: './landing-page.html'
|
||||||
|
@ -20,7 +20,7 @@ import { Subject, Subscription } from 'rxjs';
|
|||||||
import { takeUntil } from 'rxjs/operators';
|
import { takeUntil } from 'rxjs/operators';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
host: { class: 'mb-5' },
|
host: { class: 'page' },
|
||||||
selector: 'gf-allocations-page',
|
selector: 'gf-allocations-page',
|
||||||
styleUrls: ['./allocations-page.scss'],
|
styleUrls: ['./allocations-page.scss'],
|
||||||
templateUrl: './allocations-page.html'
|
templateUrl: './allocations-page.html'
|
||||||
|
@ -11,7 +11,7 @@ import { Subject } from 'rxjs';
|
|||||||
import { takeUntil } from 'rxjs/operators';
|
import { takeUntil } from 'rxjs/operators';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
host: { class: 'mb-5' },
|
host: { class: 'page' },
|
||||||
selector: 'gf-analysis-page',
|
selector: 'gf-analysis-page',
|
||||||
styleUrls: ['./analysis-page.scss'],
|
styleUrls: ['./analysis-page.scss'],
|
||||||
templateUrl: './analysis-page.html'
|
templateUrl: './analysis-page.html'
|
||||||
|
@ -7,7 +7,7 @@ import { Subject } from 'rxjs';
|
|||||||
import { takeUntil } from 'rxjs/operators';
|
import { takeUntil } from 'rxjs/operators';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
host: { class: 'mb-5' },
|
host: { class: 'page' },
|
||||||
selector: 'gf-portfolio-page',
|
selector: 'gf-portfolio-page',
|
||||||
styleUrls: ['./portfolio-page.scss'],
|
styleUrls: ['./portfolio-page.scss'],
|
||||||
templateUrl: './portfolio-page.html'
|
templateUrl: './portfolio-page.html'
|
||||||
|
@ -7,7 +7,7 @@ import { Subject } from 'rxjs';
|
|||||||
import { takeUntil } from 'rxjs/operators';
|
import { takeUntil } from 'rxjs/operators';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
host: { class: 'mb-5' },
|
host: { class: 'page' },
|
||||||
selector: 'gf-report-page',
|
selector: 'gf-report-page',
|
||||||
styleUrls: ['./report-page.scss'],
|
styleUrls: ['./report-page.scss'],
|
||||||
templateUrl: './report-page.html'
|
templateUrl: './report-page.html'
|
||||||
|
@ -24,7 +24,7 @@ import { CreateOrUpdateTransactionDialog } from './create-or-update-transaction-
|
|||||||
import { ImportTransactionDialog } from './import-transaction-dialog/import-transaction-dialog.component';
|
import { ImportTransactionDialog } from './import-transaction-dialog/import-transaction-dialog.component';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
host: { class: 'mb-5' },
|
host: { class: 'page' },
|
||||||
selector: 'gf-transactions-page',
|
selector: 'gf-transactions-page',
|
||||||
styleUrls: ['./transactions-page.scss'],
|
styleUrls: ['./transactions-page.scss'],
|
||||||
templateUrl: './transactions-page.html'
|
templateUrl: './transactions-page.html'
|
||||||
|
@ -7,7 +7,7 @@ import { Subject } from 'rxjs';
|
|||||||
import { takeUntil } from 'rxjs/operators';
|
import { takeUntil } from 'rxjs/operators';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
host: { class: 'mb-5' },
|
host: { class: 'page' },
|
||||||
selector: 'gf-pricing-page',
|
selector: 'gf-pricing-page',
|
||||||
styleUrls: ['./pricing-page.scss'],
|
styleUrls: ['./pricing-page.scss'],
|
||||||
templateUrl: './pricing-page.html'
|
templateUrl: './pricing-page.html'
|
||||||
|
@ -13,7 +13,7 @@ import { EMPTY, Subject } from 'rxjs';
|
|||||||
import { catchError, takeUntil } from 'rxjs/operators';
|
import { catchError, takeUntil } from 'rxjs/operators';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
host: { class: 'mb-5' },
|
host: { class: 'page' },
|
||||||
selector: 'gf-public-page',
|
selector: 'gf-public-page',
|
||||||
styleUrls: ['./public-page.scss'],
|
styleUrls: ['./public-page.scss'],
|
||||||
templateUrl: './public-page.html'
|
templateUrl: './public-page.html'
|
||||||
|
@ -14,7 +14,7 @@ import { takeUntil } from 'rxjs/operators';
|
|||||||
import { ShowAccessTokenDialog } from './show-access-token-dialog/show-access-token-dialog.component';
|
import { ShowAccessTokenDialog } from './show-access-token-dialog/show-access-token-dialog.component';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
host: { class: 'mb-5' },
|
host: { class: 'page' },
|
||||||
selector: 'gf-register-page',
|
selector: 'gf-register-page',
|
||||||
styleUrls: ['./register-page.scss'],
|
styleUrls: ['./register-page.scss'],
|
||||||
templateUrl: './register-page.html'
|
templateUrl: './register-page.html'
|
||||||
|
@ -2,7 +2,7 @@ import { Component, OnInit } from '@angular/core';
|
|||||||
import { Subject } from 'rxjs';
|
import { Subject } from 'rxjs';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
host: { class: 'mb-5' },
|
host: { class: 'page' },
|
||||||
selector: 'gf-resources-page',
|
selector: 'gf-resources-page',
|
||||||
styleUrls: ['./resources-page.scss'],
|
styleUrls: ['./resources-page.scss'],
|
||||||
templateUrl: './resources-page.html'
|
templateUrl: './resources-page.html'
|
||||||
|
@ -6,7 +6,7 @@ import { Subject } from 'rxjs';
|
|||||||
import { takeUntil } from 'rxjs/operators';
|
import { takeUntil } from 'rxjs/operators';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
host: { class: 'mb-5' },
|
host: { class: 'page' },
|
||||||
selector: 'gf-webauthn-page',
|
selector: 'gf-webauthn-page',
|
||||||
styleUrls: ['./webauthn-page.scss'],
|
styleUrls: ['./webauthn-page.scss'],
|
||||||
templateUrl: './webauthn-page.html'
|
templateUrl: './webauthn-page.html'
|
||||||
|
@ -164,6 +164,10 @@ ngx-skeleton-loader {
|
|||||||
min-width: unset !important;
|
min-width: unset !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.page {
|
||||||
|
padding-bottom: 5rem;
|
||||||
|
}
|
||||||
|
|
||||||
.svgMap-tooltip {
|
.svgMap-tooltip {
|
||||||
border-bottom: none;
|
border-bottom: none;
|
||||||
|
|
||||||
|
@ -36,314 +36,334 @@
|
|||||||
</mat-autocomplete>
|
</mat-autocomplete>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
|
|
||||||
<table
|
<div class="activities">
|
||||||
class="gf-table w-100"
|
<table
|
||||||
matSort
|
class="gf-table w-100"
|
||||||
matSortActive="date"
|
matSort
|
||||||
matSortDirection="desc"
|
matSortActive="date"
|
||||||
mat-table
|
matSortDirection="desc"
|
||||||
[dataSource]="dataSource"
|
mat-table
|
||||||
>
|
[dataSource]="dataSource"
|
||||||
<ng-container matColumnDef="count">
|
>
|
||||||
<th
|
<ng-container matColumnDef="count">
|
||||||
*matHeaderCellDef
|
<th
|
||||||
class="d-none d-lg-table-cell px-1 text-right"
|
*matHeaderCellDef
|
||||||
i18n
|
class="d-none d-lg-table-cell px-1 text-right"
|
||||||
mat-header-cell
|
i18n
|
||||||
></th>
|
mat-header-cell
|
||||||
<td
|
></th>
|
||||||
*matCellDef="let element; let i = index"
|
<td
|
||||||
class="d-none d-lg-table-cell px-1 text-right"
|
*matCellDef="let element; let i = index"
|
||||||
mat-cell
|
class="d-none d-lg-table-cell px-1 text-right"
|
||||||
>
|
mat-cell
|
||||||
{{ dataSource.data.length - i }}
|
|
||||||
</td>
|
|
||||||
<td
|
|
||||||
*matFooterCellDef
|
|
||||||
class="d-none d-lg-table-cell px-1"
|
|
||||||
mat-footer-cell
|
|
||||||
></td>
|
|
||||||
</ng-container>
|
|
||||||
<ng-container matColumnDef="date">
|
|
||||||
<th *matHeaderCellDef class="px-1" i18n mat-header-cell mat-sort-header>
|
|
||||||
Date
|
|
||||||
</th>
|
|
||||||
<td *matCellDef="let element" class="px-1" mat-cell>
|
|
||||||
<div class="d-flex">
|
|
||||||
{{ element.date | date: defaultDateFormat }}
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td *matFooterCellDef class="px-1" i18n mat-footer-cell>Total</td>
|
|
||||||
</ng-container>
|
|
||||||
|
|
||||||
<ng-container matColumnDef="type">
|
|
||||||
<th *matHeaderCellDef class="px-1" i18n mat-header-cell mat-sort-header>
|
|
||||||
Type
|
|
||||||
</th>
|
|
||||||
<td *matCellDef="let element" mat-cell class="px-1">
|
|
||||||
<div
|
|
||||||
class="d-inline-flex p-1 type-badge"
|
|
||||||
[ngClass]="{
|
|
||||||
buy: element.type === 'BUY',
|
|
||||||
dividend: element.type === 'DIVIDEND',
|
|
||||||
sell: element.type === 'SELL'
|
|
||||||
}"
|
|
||||||
>
|
>
|
||||||
<ion-icon
|
{{ dataSource.data.length - i }}
|
||||||
[name]="
|
</td>
|
||||||
element.type === 'BUY' || element.type === 'DIVIDEND'
|
<td
|
||||||
? 'arrow-forward-circle-outline'
|
*matFooterCellDef
|
||||||
: 'arrow-back-circle-outline'
|
class="d-none d-lg-table-cell px-1"
|
||||||
|
mat-footer-cell
|
||||||
|
></td>
|
||||||
|
</ng-container>
|
||||||
|
<ng-container matColumnDef="date">
|
||||||
|
<th *matHeaderCellDef class="px-1" i18n mat-header-cell mat-sort-header>
|
||||||
|
Date
|
||||||
|
</th>
|
||||||
|
<td *matCellDef="let element" class="px-1" mat-cell>
|
||||||
|
<div class="d-flex">
|
||||||
|
{{ element.date | date: defaultDateFormat }}
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td *matFooterCellDef class="px-1" i18n mat-footer-cell>Total</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<ng-container matColumnDef="type">
|
||||||
|
<th *matHeaderCellDef class="px-1" i18n mat-header-cell mat-sort-header>
|
||||||
|
Type
|
||||||
|
</th>
|
||||||
|
<td *matCellDef="let element" mat-cell class="px-1">
|
||||||
|
<div
|
||||||
|
class="d-inline-flex p-1 type-badge"
|
||||||
|
[ngClass]="{
|
||||||
|
buy: element.type === 'BUY',
|
||||||
|
dividend: element.type === 'DIVIDEND',
|
||||||
|
sell: element.type === 'SELL'
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
<ion-icon
|
||||||
|
[name]="
|
||||||
|
element.type === 'BUY' || element.type === 'DIVIDEND'
|
||||||
|
? 'arrow-forward-circle-outline'
|
||||||
|
: 'arrow-back-circle-outline'
|
||||||
|
"
|
||||||
|
></ion-icon>
|
||||||
|
<span class="d-none d-lg-block mx-1">{{ element.type }}</span>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td *matFooterCellDef class="px-1" mat-footer-cell></td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<ng-container matColumnDef="symbol">
|
||||||
|
<th *matHeaderCellDef class="px-1" i18n mat-header-cell mat-sort-header>
|
||||||
|
Symbol
|
||||||
|
</th>
|
||||||
|
<td *matCellDef="let element" class="px-1" mat-cell>
|
||||||
|
<div class="d-flex align-items-center">
|
||||||
|
{{ element.symbol | gfSymbol }}
|
||||||
|
<span *ngIf="element.isDraft" class="badge badge-secondary ml-1" i18n
|
||||||
|
>Draft</span
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td *matFooterCellDef class="px-1" mat-footer-cell></td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<ng-container matColumnDef="currency">
|
||||||
|
<th
|
||||||
|
*matHeaderCellDef
|
||||||
|
class="d-none d-lg-table-cell px-1"
|
||||||
|
i18n
|
||||||
|
mat-header-cell
|
||||||
|
mat-sort-header
|
||||||
|
>
|
||||||
|
Currency
|
||||||
|
</th>
|
||||||
|
<td
|
||||||
|
*matCellDef="let element"
|
||||||
|
class="d-none d-lg-table-cell px-1"
|
||||||
|
mat-cell
|
||||||
|
>
|
||||||
|
{{ element.currency }}
|
||||||
|
</td>
|
||||||
|
<td *matFooterCellDef class="d-none d-lg-table-cell px-1" mat-footer-cell>
|
||||||
|
{{ baseCurrency }}
|
||||||
|
</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<ng-container matColumnDef="quantity">
|
||||||
|
<th
|
||||||
|
*matHeaderCellDef
|
||||||
|
class="d-none d-lg-table-cell justify-content-end px-1"
|
||||||
|
i18n
|
||||||
|
mat-header-cell
|
||||||
|
mat-sort-header
|
||||||
|
>
|
||||||
|
Quantity
|
||||||
|
</th>
|
||||||
|
<td
|
||||||
|
*matCellDef="let element"
|
||||||
|
class="d-none d-lg-table-cell px-1"
|
||||||
|
mat-cell
|
||||||
|
>
|
||||||
|
<div class="d-flex justify-content-end">
|
||||||
|
<gf-value
|
||||||
|
[isCurrency]="true"
|
||||||
|
[locale]="locale"
|
||||||
|
[value]="isLoading ? undefined : element.quantity"
|
||||||
|
></gf-value>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td
|
||||||
|
*matFooterCellDef
|
||||||
|
class="d-none d-lg-table-cell px-1"
|
||||||
|
mat-footer-cell
|
||||||
|
></td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<ng-container matColumnDef="unitPrice">
|
||||||
|
<th
|
||||||
|
*matHeaderCellDef
|
||||||
|
class="d-none d-lg-table-cell justify-content-end px-1"
|
||||||
|
i18n
|
||||||
|
mat-header-cell
|
||||||
|
mat-sort-header
|
||||||
|
>
|
||||||
|
Unit Price
|
||||||
|
</th>
|
||||||
|
<td
|
||||||
|
*matCellDef="let element"
|
||||||
|
class="d-none d-lg-table-cell px-1"
|
||||||
|
mat-cell
|
||||||
|
>
|
||||||
|
<div class="d-flex justify-content-end">
|
||||||
|
<gf-value
|
||||||
|
[isCurrency]="true"
|
||||||
|
[locale]="locale"
|
||||||
|
[value]="isLoading ? undefined : element.unitPrice"
|
||||||
|
></gf-value>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td
|
||||||
|
*matFooterCellDef
|
||||||
|
class="d-none d-lg-table-cell px-1"
|
||||||
|
mat-footer-cell
|
||||||
|
></td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<ng-container matColumnDef="fee">
|
||||||
|
<th
|
||||||
|
*matHeaderCellDef
|
||||||
|
class="d-none d-lg-table-cell justify-content-end px-1"
|
||||||
|
i18n
|
||||||
|
mat-header-cell
|
||||||
|
mat-sort-header
|
||||||
|
>
|
||||||
|
Fee
|
||||||
|
</th>
|
||||||
|
<td
|
||||||
|
*matCellDef="let element"
|
||||||
|
class="d-none d-lg-table-cell px-1"
|
||||||
|
mat-cell
|
||||||
|
>
|
||||||
|
<div class="d-flex justify-content-end">
|
||||||
|
<gf-value
|
||||||
|
[isCurrency]="true"
|
||||||
|
[locale]="locale"
|
||||||
|
[value]="isLoading ? undefined : element.fee"
|
||||||
|
></gf-value>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td *matFooterCellDef class="d-none d-lg-table-cell px-1" mat-footer-cell>
|
||||||
|
<div class="d-flex justify-content-end">
|
||||||
|
<gf-value
|
||||||
|
[isCurrency]="true"
|
||||||
|
[locale]="locale"
|
||||||
|
[value]="isLoading ? undefined : totalFees"
|
||||||
|
></gf-value>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<ng-container matColumnDef="value">
|
||||||
|
<th
|
||||||
|
*matHeaderCellDef
|
||||||
|
class="justify-content-end px-1"
|
||||||
|
i18n
|
||||||
|
mat-header-cell
|
||||||
|
mat-sort-header
|
||||||
|
>
|
||||||
|
Value
|
||||||
|
</th>
|
||||||
|
<td *matCellDef="let element" class="px-1" mat-cell>
|
||||||
|
<div class="d-flex justify-content-end">
|
||||||
|
<gf-value
|
||||||
|
[isCurrency]="true"
|
||||||
|
[locale]="locale"
|
||||||
|
[value]="isLoading ? undefined : element.value"
|
||||||
|
></gf-value>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td *matFooterCellDef class="px-1" mat-footer-cell>
|
||||||
|
<div class="d-flex justify-content-end">
|
||||||
|
<gf-value
|
||||||
|
[isCurrency]="true"
|
||||||
|
[locale]="locale"
|
||||||
|
[value]="isLoading ? undefined : totalValue"
|
||||||
|
></gf-value>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<ng-container matColumnDef="account">
|
||||||
|
<th *matHeaderCellDef class="px-1" mat-header-cell>
|
||||||
|
<span class="d-none d-lg-block" i18n>Account</span>
|
||||||
|
</th>
|
||||||
|
<td *matCellDef="let element" class="px-1" mat-cell>
|
||||||
|
<div class="d-flex">
|
||||||
|
<gf-symbol-icon
|
||||||
|
*ngIf="element.Account?.Platform?.url"
|
||||||
|
class="mr-1"
|
||||||
|
[tooltip]="element.Account?.Platform?.name"
|
||||||
|
[url]="element.Account?.Platform?.url"
|
||||||
|
></gf-symbol-icon>
|
||||||
|
<span class="d-none d-lg-block">{{ element.Account?.name }}</span>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td *matFooterCellDef class="px-1" mat-footer-cell></td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<ng-container matColumnDef="actions">
|
||||||
|
<th *matHeaderCellDef class="px-1 text-center" mat-header-cell>
|
||||||
|
<button
|
||||||
|
*ngIf="
|
||||||
|
hasPermissionToExportActivities || hasPermissionToImportActivities
|
||||||
"
|
"
|
||||||
></ion-icon>
|
class="mx-1 no-min-width px-2"
|
||||||
<span class="d-none d-lg-block mx-1">{{ element.type }}</span>
|
mat-button
|
||||||
</div>
|
[matMenuTriggerFor]="activitiesMenu"
|
||||||
</td>
|
(click)="$event.stopPropagation()"
|
||||||
<td *matFooterCellDef class="px-1" mat-footer-cell></td>
|
|
||||||
</ng-container>
|
|
||||||
|
|
||||||
<ng-container matColumnDef="symbol">
|
|
||||||
<th *matHeaderCellDef class="px-1" i18n mat-header-cell mat-sort-header>
|
|
||||||
Symbol
|
|
||||||
</th>
|
|
||||||
<td *matCellDef="let element" class="px-1" mat-cell>
|
|
||||||
<div class="d-flex align-items-center">
|
|
||||||
{{ element.symbol | gfSymbol }}
|
|
||||||
<span *ngIf="element.isDraft" class="badge badge-secondary ml-1" i18n
|
|
||||||
>Draft</span
|
|
||||||
>
|
>
|
||||||
</div>
|
<ion-icon name="ellipsis-vertical"></ion-icon>
|
||||||
</td>
|
</button>
|
||||||
<td *matFooterCellDef class="px-1" mat-footer-cell></td>
|
<mat-menu #activitiesMenu="matMenu" xPosition="before">
|
||||||
</ng-container>
|
<button
|
||||||
|
*ngIf="hasPermissionToImportActivities"
|
||||||
<ng-container matColumnDef="currency">
|
class="align-items-center d-flex"
|
||||||
<th
|
mat-menu-item
|
||||||
*matHeaderCellDef
|
(click)="onImport()"
|
||||||
class="d-none d-lg-table-cell px-1"
|
>
|
||||||
i18n
|
<ion-icon class="mr-2" name="cloud-upload-outline"></ion-icon>
|
||||||
mat-header-cell
|
<span i18n>Import</span>
|
||||||
mat-sort-header
|
</button>
|
||||||
>
|
<button
|
||||||
Currency
|
*ngIf="hasPermissionToExportActivities"
|
||||||
</th>
|
class="align-items-center d-flex"
|
||||||
<td *matCellDef="let element" class="d-none d-lg-table-cell px-1" mat-cell>
|
mat-menu-item
|
||||||
{{ element.currency }}
|
(click)="onExport()"
|
||||||
</td>
|
>
|
||||||
<td *matFooterCellDef class="d-none d-lg-table-cell px-1" mat-footer-cell>
|
<ion-icon class="mr-2" name="cloud-download-outline"></ion-icon>
|
||||||
{{ baseCurrency }}
|
<span i18n>Export</span>
|
||||||
</td>
|
</button>
|
||||||
</ng-container>
|
</mat-menu>
|
||||||
|
</th>
|
||||||
<ng-container matColumnDef="quantity">
|
<td *matCellDef="let element" class="px-1 text-center" mat-cell>
|
||||||
<th
|
|
||||||
*matHeaderCellDef
|
|
||||||
class="d-none d-lg-table-cell justify-content-end px-1"
|
|
||||||
i18n
|
|
||||||
mat-header-cell
|
|
||||||
mat-sort-header
|
|
||||||
>
|
|
||||||
Quantity
|
|
||||||
</th>
|
|
||||||
<td *matCellDef="let element" class="d-none d-lg-table-cell px-1" mat-cell>
|
|
||||||
<div class="d-flex justify-content-end">
|
|
||||||
<gf-value
|
|
||||||
[isCurrency]="true"
|
|
||||||
[locale]="locale"
|
|
||||||
[value]="isLoading ? undefined : element.quantity"
|
|
||||||
></gf-value>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td
|
|
||||||
*matFooterCellDef
|
|
||||||
class="d-none d-lg-table-cell px-1"
|
|
||||||
mat-footer-cell
|
|
||||||
></td>
|
|
||||||
</ng-container>
|
|
||||||
|
|
||||||
<ng-container matColumnDef="unitPrice">
|
|
||||||
<th
|
|
||||||
*matHeaderCellDef
|
|
||||||
class="d-none d-lg-table-cell justify-content-end px-1"
|
|
||||||
i18n
|
|
||||||
mat-header-cell
|
|
||||||
mat-sort-header
|
|
||||||
>
|
|
||||||
Unit Price
|
|
||||||
</th>
|
|
||||||
<td *matCellDef="let element" class="d-none d-lg-table-cell px-1" mat-cell>
|
|
||||||
<div class="d-flex justify-content-end">
|
|
||||||
<gf-value
|
|
||||||
[isCurrency]="true"
|
|
||||||
[locale]="locale"
|
|
||||||
[value]="isLoading ? undefined : element.unitPrice"
|
|
||||||
></gf-value>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td
|
|
||||||
*matFooterCellDef
|
|
||||||
class="d-none d-lg-table-cell px-1"
|
|
||||||
mat-footer-cell
|
|
||||||
></td>
|
|
||||||
</ng-container>
|
|
||||||
|
|
||||||
<ng-container matColumnDef="fee">
|
|
||||||
<th
|
|
||||||
*matHeaderCellDef
|
|
||||||
class="d-none d-lg-table-cell justify-content-end px-1"
|
|
||||||
i18n
|
|
||||||
mat-header-cell
|
|
||||||
mat-sort-header
|
|
||||||
>
|
|
||||||
Fee
|
|
||||||
</th>
|
|
||||||
<td *matCellDef="let element" class="d-none d-lg-table-cell px-1" mat-cell>
|
|
||||||
<div class="d-flex justify-content-end">
|
|
||||||
<gf-value
|
|
||||||
[isCurrency]="true"
|
|
||||||
[locale]="locale"
|
|
||||||
[value]="isLoading ? undefined : element.fee"
|
|
||||||
></gf-value>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td *matFooterCellDef class="d-none d-lg-table-cell px-1" mat-footer-cell>
|
|
||||||
<div class="d-flex justify-content-end">
|
|
||||||
<gf-value
|
|
||||||
[isCurrency]="true"
|
|
||||||
[locale]="locale"
|
|
||||||
[value]="isLoading ? undefined : totalFees"
|
|
||||||
></gf-value>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</ng-container>
|
|
||||||
|
|
||||||
<ng-container matColumnDef="value">
|
|
||||||
<th
|
|
||||||
*matHeaderCellDef
|
|
||||||
class="justify-content-end px-1"
|
|
||||||
i18n
|
|
||||||
mat-header-cell
|
|
||||||
mat-sort-header
|
|
||||||
>
|
|
||||||
Value
|
|
||||||
</th>
|
|
||||||
<td *matCellDef="let element" class="px-1" mat-cell>
|
|
||||||
<div class="d-flex justify-content-end">
|
|
||||||
<gf-value
|
|
||||||
[isCurrency]="true"
|
|
||||||
[locale]="locale"
|
|
||||||
[value]="isLoading ? undefined : element.value"
|
|
||||||
></gf-value>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td *matFooterCellDef class="px-1" mat-footer-cell>
|
|
||||||
<div class="d-flex justify-content-end">
|
|
||||||
<gf-value
|
|
||||||
[isCurrency]="true"
|
|
||||||
[locale]="locale"
|
|
||||||
[value]="isLoading ? undefined : totalValue"
|
|
||||||
></gf-value>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</ng-container>
|
|
||||||
|
|
||||||
<ng-container matColumnDef="account">
|
|
||||||
<th *matHeaderCellDef class="px-1" mat-header-cell>
|
|
||||||
<span class="d-none d-lg-block" i18n>Account</span>
|
|
||||||
</th>
|
|
||||||
<td *matCellDef="let element" class="px-1" mat-cell>
|
|
||||||
<div class="d-flex">
|
|
||||||
<gf-symbol-icon
|
|
||||||
*ngIf="element.Account?.Platform?.url"
|
|
||||||
class="mr-1"
|
|
||||||
[tooltip]="element.Account?.Platform?.name"
|
|
||||||
[url]="element.Account?.Platform?.url"
|
|
||||||
></gf-symbol-icon>
|
|
||||||
<span class="d-none d-lg-block">{{ element.Account?.name }}</span>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td *matFooterCellDef class="px-1" mat-footer-cell></td>
|
|
||||||
</ng-container>
|
|
||||||
|
|
||||||
<ng-container matColumnDef="actions">
|
|
||||||
<th *matHeaderCellDef class="px-1 text-center" mat-header-cell>
|
|
||||||
<button
|
|
||||||
*ngIf="
|
|
||||||
hasPermissionToExportActivities || hasPermissionToImportActivities
|
|
||||||
"
|
|
||||||
class="mx-1 no-min-width px-2"
|
|
||||||
mat-button
|
|
||||||
[matMenuTriggerFor]="activitiesMenu"
|
|
||||||
(click)="$event.stopPropagation()"
|
|
||||||
>
|
|
||||||
<ion-icon name="ellipsis-vertical"></ion-icon>
|
|
||||||
</button>
|
|
||||||
<mat-menu #activitiesMenu="matMenu" xPosition="before">
|
|
||||||
<button
|
<button
|
||||||
*ngIf="hasPermissionToImportActivities"
|
*ngIf="this.showActions"
|
||||||
class="align-items-center d-flex"
|
class="mx-1 no-min-width px-2"
|
||||||
mat-menu-item
|
mat-button
|
||||||
(click)="onImport()"
|
[matMenuTriggerFor]="activityMenu"
|
||||||
|
(click)="$event.stopPropagation()"
|
||||||
>
|
>
|
||||||
<ion-icon class="mr-2" name="cloud-upload-outline"></ion-icon>
|
<ion-icon name="ellipsis-vertical"></ion-icon>
|
||||||
<span i18n>Import</span>
|
|
||||||
</button>
|
</button>
|
||||||
<button
|
<mat-menu #activityMenu="matMenu" xPosition="before">
|
||||||
*ngIf="hasPermissionToExportActivities"
|
<button i18n mat-menu-item (click)="onUpdateActivity(element)">
|
||||||
class="align-items-center d-flex"
|
Edit
|
||||||
mat-menu-item
|
</button>
|
||||||
(click)="onExport()"
|
<button i18n mat-menu-item (click)="onCloneActivity(element)">
|
||||||
>
|
Clone
|
||||||
<ion-icon class="mr-2" name="cloud-download-outline"></ion-icon>
|
</button>
|
||||||
<span i18n>Export</span>
|
<button i18n mat-menu-item (click)="onDeleteActivity(element.id)">
|
||||||
</button>
|
Delete
|
||||||
</mat-menu>
|
</button>
|
||||||
</th>
|
</mat-menu>
|
||||||
<td *matCellDef="let element" class="px-1 text-center" mat-cell>
|
</td>
|
||||||
<button
|
<td *matFooterCellDef class="px-1" mat-footer-cell></td>
|
||||||
*ngIf="this.showActions"
|
</ng-container>
|
||||||
class="mx-1 no-min-width px-2"
|
|
||||||
mat-button
|
|
||||||
[matMenuTriggerFor]="activityMenu"
|
|
||||||
(click)="$event.stopPropagation()"
|
|
||||||
>
|
|
||||||
<ion-icon name="ellipsis-vertical"></ion-icon>
|
|
||||||
</button>
|
|
||||||
<mat-menu #activityMenu="matMenu" xPosition="before">
|
|
||||||
<button i18n mat-menu-item (click)="onUpdateActivity(element)">
|
|
||||||
Edit
|
|
||||||
</button>
|
|
||||||
<button i18n mat-menu-item (click)="onCloneActivity(element)">
|
|
||||||
Clone
|
|
||||||
</button>
|
|
||||||
<button i18n mat-menu-item (click)="onDeleteActivity(element.id)">
|
|
||||||
Delete
|
|
||||||
</button>
|
|
||||||
</mat-menu>
|
|
||||||
</td>
|
|
||||||
<td *matFooterCellDef class="px-1" mat-footer-cell></td>
|
|
||||||
</ng-container>
|
|
||||||
|
|
||||||
<tr *matHeaderRowDef="displayedColumns" mat-header-row></tr>
|
<tr *matHeaderRowDef="displayedColumns" mat-header-row></tr>
|
||||||
<tr
|
<tr
|
||||||
*matRowDef="let row; columns: displayedColumns"
|
*matRowDef="let row; columns: displayedColumns"
|
||||||
mat-row
|
mat-row
|
||||||
(click)="
|
(click)="
|
||||||
hasPermissionToOpenDetails &&
|
hasPermissionToOpenDetails &&
|
||||||
!row.isDraft &&
|
!row.isDraft &&
|
||||||
onOpenPositionDialog({
|
onOpenPositionDialog({
|
||||||
dataSource: row.dataSource,
|
dataSource: row.dataSource,
|
||||||
symbol: row.symbol
|
symbol: row.symbol
|
||||||
})
|
})
|
||||||
"
|
"
|
||||||
[ngClass]="{ 'cursor-pointer': hasPermissionToOpenDetails && !row.isDraft }"
|
[ngClass]="{
|
||||||
></tr>
|
'cursor-pointer': hasPermissionToOpenDetails && !row.isDraft
|
||||||
<tr
|
}"
|
||||||
*matFooterRowDef="displayedColumns"
|
></tr>
|
||||||
mat-footer-row
|
<tr
|
||||||
[ngClass]="{ 'd-none': isLoading || dataSource.data.length === 0 }"
|
*matFooterRowDef="displayedColumns"
|
||||||
></tr>
|
mat-footer-row
|
||||||
</table>
|
[ngClass]="{ 'd-none': isLoading || dataSource.data.length === 0 }"
|
||||||
|
></tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
<ngx-skeleton-loader
|
<ngx-skeleton-loader
|
||||||
*ngIf="isLoading"
|
*ngIf="isLoading"
|
||||||
|
@ -14,45 +14,49 @@
|
|||||||
min-height: 1.5rem !important;
|
min-height: 1.5rem !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mat-table {
|
.activities {
|
||||||
td {
|
overflow-x: auto;
|
||||||
&.mat-footer-cell {
|
|
||||||
border-top: 1px solid
|
|
||||||
rgba(
|
|
||||||
var(--palette-foreground-divider),
|
|
||||||
var(--palette-foreground-divider-alpha)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
th {
|
.mat-table {
|
||||||
::ng-deep {
|
td {
|
||||||
.mat-sort-header-container {
|
&.mat-footer-cell {
|
||||||
justify-content: inherit;
|
border-top: 1px solid
|
||||||
|
rgba(
|
||||||
|
var(--palette-foreground-divider),
|
||||||
|
var(--palette-foreground-divider-alpha)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
.mat-row {
|
th {
|
||||||
.type-badge {
|
::ng-deep {
|
||||||
background-color: rgba(var(--palette-foreground-text), 0.05);
|
.mat-sort-header-container {
|
||||||
border-radius: 1rem;
|
justify-content: inherit;
|
||||||
line-height: 1em;
|
}
|
||||||
|
|
||||||
ion-icon {
|
|
||||||
font-size: 1rem;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
&.buy {
|
.mat-row {
|
||||||
color: var(--green);
|
.type-badge {
|
||||||
}
|
background-color: rgba(var(--palette-foreground-text), 0.05);
|
||||||
|
border-radius: 1rem;
|
||||||
|
line-height: 1em;
|
||||||
|
|
||||||
&.dividend {
|
ion-icon {
|
||||||
color: var(--blue);
|
font-size: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.sell {
|
&.buy {
|
||||||
color: var(--orange);
|
color: var(--green);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.dividend {
|
||||||
|
color: var(--blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.sell {
|
||||||
|
color: var(--orange);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user