From 8e47ede0da041c5c4497f3d4ddc91e4af2f8f172 Mon Sep 17 00:00:00 2001 From: JoryHogeveen Date: Fri, 15 Nov 2024 00:44:32 +0100 Subject: [PATCH] Create expandable row for holding parent information (ETF) --- .../top-holdings/top-holdings.component.html | 45 ++++++++++++++++++- .../top-holdings/top-holdings.component.scss | 4 ++ .../top-holdings/top-holdings.component.ts | 25 +++++++++-- 3 files changed, 70 insertions(+), 4 deletions(-) diff --git a/libs/ui/src/lib/top-holdings/top-holdings.component.html b/libs/ui/src/lib/top-holdings/top-holdings.component.html index 72463da4a..889c83889 100644 --- a/libs/ui/src/lib/top-holdings/top-holdings.component.html +++ b/libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5,6 +5,7 @@ matSort matSortActive="allocationInPercentage" matSortDirection="desc" + multiTemplateDataRows [dataSource]="dataSource" > @@ -57,8 +58,50 @@ + + +
+
+ + @for (parentHolding of element.parents; track parentHolding) { + + {{ parentHolding.name }}: + + {{ + parentHolding.allocationInPercentage | number: '1.0-2' + }}% + + + } + +
+
+ +
+ - + + diff --git a/libs/ui/src/lib/top-holdings/top-holdings.component.scss b/libs/ui/src/lib/top-holdings/top-holdings.component.scss index 990b8b294..3244277ab 100644 --- a/libs/ui/src/lib/top-holdings/top-holdings.component.scss +++ b/libs/ui/src/lib/top-holdings/top-holdings.component.scss @@ -1,6 +1,10 @@ :host { display: block; + tr.holding-detail { + height: 0; + } + .gf-table { th { ::ng-deep { diff --git a/libs/ui/src/lib/top-holdings/top-holdings.component.ts b/libs/ui/src/lib/top-holdings/top-holdings.component.ts index 0a3f0e977..94bc92d89 100644 --- a/libs/ui/src/lib/top-holdings/top-holdings.component.ts +++ b/libs/ui/src/lib/top-holdings/top-holdings.component.ts @@ -1,7 +1,14 @@ import { getLocale } from '@ghostfolio/common/helper'; -import { Holding } from '@ghostfolio/common/interfaces'; +import { HoldingWithParents } from '@ghostfolio/common/interfaces'; import { GfValueComponent } from '@ghostfolio/ui/value'; +import { + animate, + state, + style, + transition, + trigger +} from '@angular/animations'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, @@ -13,6 +20,7 @@ import { ViewChild } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; +import { MatListModule } from '@angular/material/list'; import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator'; import { MatSort, MatSortModule } from '@angular/material/sort'; import { MatTableDataSource, MatTableModule } from '@angular/material/table'; @@ -29,8 +37,19 @@ import { Subject } from 'rxjs'; MatPaginatorModule, MatSortModule, MatTableModule, + MatListModule, NgxSkeletonLoaderModule ], + animations: [ + trigger('detailExpand', [ + state('collapsed,void', style({ height: '0px', minHeight: '0' })), + state('expanded', style({ height: '*' })), + transition( + 'expanded <=> collapsed', + animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)') + ) + ]) + ], schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-top-holdings', standalone: true, @@ -41,12 +60,12 @@ export class GfTopHoldingsComponent implements OnChanges, OnDestroy { @Input() baseCurrency: string; @Input() locale = getLocale(); @Input() pageSize = Number.MAX_SAFE_INTEGER; - @Input() topHoldings: Holding[]; + @Input() topHoldings: HoldingWithParents[]; @ViewChild(MatPaginator) paginator: MatPaginator; @ViewChild(MatSort) sort: MatSort; - public dataSource = new MatTableDataSource(); + public dataSource = new MatTableDataSource(); public displayedColumns: string[] = [ 'name', 'valueInBaseCurrency',