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',