Browse Source

Clickable parent holdings (asset popup)

pull/4044/head
JoryHogeveen 9 months ago
parent
commit
e8714b05ac
  1. 1
      apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
  2. 1
      apps/client/src/app/pages/portfolio/allocations/allocations-page.html
  3. 4
      libs/ui/src/lib/top-holdings/top-holdings.component.html
  4. 7
      libs/ui/src/lib/top-holdings/top-holdings.component.scss
  5. 25
      libs/ui/src/lib/top-holdings/top-holdings.component.ts

1
apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts

@ -501,6 +501,7 @@ export class AllocationsPageComponent implements OnDestroy, OnInit {
allocationInPercentage: allocationInPercentage:
parentHolding.valueInBaseCurrency / value, parentHolding.valueInBaseCurrency / value,
name: holding.name, name: holding.name,
position: holding,
symbol: prettifySymbol(symbol), symbol: prettifySymbol(symbol),
valueInBaseCurrency: parentHolding.valueInBaseCurrency valueInBaseCurrency: parentHolding.valueInBaseCurrency
} }

1
apps/client/src/app/pages/portfolio/allocations/allocations-page.html

@ -347,6 +347,7 @@
[locale]="user?.settings?.locale" [locale]="user?.settings?.locale"
[pageSize]="10" [pageSize]="10"
[topHoldings]="topHoldings" [topHoldings]="topHoldings"
(proportionChartClicked)="onSymbolChartClicked($event)"
/> />
</mat-card-content> </mat-card-content>
</mat-card> </mat-card>

4
libs/ui/src/lib/top-holdings/top-holdings.component.html

@ -76,9 +76,11 @@
let i = $index let i = $index
) { ) {
<div <div
[class.cursor-pointer]="parentHolding?.symbol.length > 0"
[matTooltip]="parentHolding.name" [matTooltip]="parentHolding.name"
[style.background-color]="getColor(parentHolding?.symbol)" [style.background-color]="getColor(parentHolding?.symbol)"
[style.width.%]="100 * parentHolding?.allocationInPercentage" [style.width.%]="100 * parentHolding?.allocationInPercentage"
(click)="onClickOpenPositionModal(parentHolding.position)"
> >
{{ parentHolding?.symbol }} {{ parentHolding?.symbol }}
</div> </div>
@ -129,6 +131,8 @@
<tr <tr
*matRowDef="let row; columns: displayedHoldingParentColumns" *matRowDef="let row; columns: displayedHoldingParentColumns"
mat-row mat-row
[class.cursor-pointer]="row.position"
(click)="onClickOpenPositionModal(row.position)"
></tr> ></tr>
</table> </table>
</div> </div>

7
libs/ui/src/lib/top-holdings/top-holdings.component.scss

@ -31,6 +31,10 @@
line-height: 2em; line-height: 2em;
padding: 0 var(--table-padding); padding: 0 var(--table-padding);
overflow: hidden; overflow: hidden;
&:hover {
filter: brightness(0.95);
}
} }
} }
@ -50,6 +54,9 @@
tr { tr {
height: auto; height: auto;
&:hover {
filter: brightness(0.95);
}
} }
th, th,
td { td {

25
libs/ui/src/lib/top-holdings/top-holdings.component.ts

@ -1,5 +1,9 @@
import { getLocale } from '@ghostfolio/common/helper'; import { getLocale } from '@ghostfolio/common/helper';
import { HoldingWithParents } from '@ghostfolio/common/interfaces'; import {
AssetProfileIdentifier,
HoldingWithParents,
PortfolioPosition
} from '@ghostfolio/common/interfaces';
import { GfValueComponent } from '@ghostfolio/ui/value'; import { GfValueComponent } from '@ghostfolio/ui/value';
import { import {
@ -14,9 +18,11 @@ import {
CUSTOM_ELEMENTS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA,
ChangeDetectionStrategy, ChangeDetectionStrategy,
Component, Component,
EventEmitter,
Input, Input,
OnChanges, OnChanges,
OnDestroy, OnDestroy,
Output,
ViewChild ViewChild
} from '@angular/core'; } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
@ -24,6 +30,7 @@ import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
import { MatSort, MatSortModule } from '@angular/material/sort'; import { MatSort, MatSortModule } from '@angular/material/sort';
import { MatTableDataSource, MatTableModule } from '@angular/material/table'; import { MatTableDataSource, MatTableModule } from '@angular/material/table';
import { MatTooltipModule } from '@angular/material/tooltip'; import { MatTooltipModule } from '@angular/material/tooltip';
import { DataSource } from '@prisma/client';
import { get } from 'lodash'; import { get } from 'lodash';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
@ -76,6 +83,15 @@ export class GfTopHoldingsComponent implements OnChanges, OnDestroy {
@Input() locale = getLocale(); @Input() locale = getLocale();
@Input() pageSize = Number.MAX_SAFE_INTEGER; @Input() pageSize = Number.MAX_SAFE_INTEGER;
@Input() topHoldings: HoldingWithParents[]; @Input() topHoldings: HoldingWithParents[];
@Input() positions: {
[symbol: string]: Pick<PortfolioPosition, 'type'> & {
dataSource?: DataSource;
name: string;
value: number;
};
} = {};
@Output() proportionChartClicked = new EventEmitter<AssetProfileIdentifier>();
@ViewChild(MatPaginator) paginator: MatPaginator; @ViewChild(MatPaginator) paginator: MatPaginator;
@ViewChild(MatSort) sort: MatSort; @ViewChild(MatSort) sort: MatSort;
@ -131,6 +147,13 @@ export class GfTopHoldingsComponent implements OnChanges, OnDestroy {
} }
} }
public onClickOpenPositionModal(holding: AssetProfileIdentifier) {
try {
console.log(holding);
this.proportionChartClicked.emit(holding);
} catch {}
}
public ngOnChanges() { public ngOnChanges() {
this.isLoading = true; this.isLoading = true;

Loading…
Cancel
Save