Browse Source

Improve portfolio summary

pull/7453/head
Thomas Kaul 1 month ago
parent
commit
0eaf41d8d3
  1. 2
      apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
  2. 44
      apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
  3. 10
      apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts

2
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html

@ -170,7 +170,7 @@
" "
[unit]="data.baseCurrency" [unit]="data.baseCurrency"
[value]="investmentInBaseCurrencyWithCurrencyEffect" [value]="investmentInBaseCurrencyWithCurrencyEffect"
>Investment</gf-value >Invested Capital</gf-value
> >
</div> </div>
@if ( @if (

44
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html

@ -57,7 +57,7 @@
<div class="col"><hr /></div> <div class="col"><hr /></div>
</div> </div>
<div class="flex-nowrap px-3 py-1 row"> <div class="flex-nowrap px-3 py-1 row">
<div class="flex-grow-1 text-truncate" i18n>Investment</div> <div class="flex-grow-1 text-truncate" i18n>Invested Capital</div>
<div class="justify-content-end"> <div class="justify-content-end">
<gf-value <gf-value
class="justify-content-end" class="justify-content-end"
@ -165,7 +165,7 @@
</div> </div>
<div class="flex-nowrap px-3 py-1 row"> <div class="flex-nowrap px-3 py-1 row">
<div class="align-items-center d-flex flex-grow-1 indent-1"> <div class="align-items-center d-flex flex-grow-1 indent-1">
<ng-container i18n>Cash</ng-container> <ng-container i18n>Holdings</ng-container>
@if ( @if (
!hasImpersonationId && !hasImpersonationId &&
summary?.totalValueInBaseCurrency > 0 && summary?.totalValueInBaseCurrency > 0 &&
@ -175,7 +175,8 @@
class="d-lg-inline-block d-none ml-2 small text-muted" class="d-lg-inline-block d-none ml-2 small text-muted"
[isPercent]="true" [isPercent]="true"
[locale]="locale" [locale]="locale"
[value]="isLoading ? undefined : cashPercentage" [precision]="0"
[value]="isLoading ? undefined : holdingsPercentage"
/> />
} }
</div> </div>
@ -187,13 +188,13 @@
[locale]="locale" [locale]="locale"
[precision]="precision" [precision]="precision"
[unit]="baseCurrency" [unit]="baseCurrency"
[value]="isLoading ? undefined : summary?.totalCashInBaseCurrency" [value]="isLoading ? undefined : holdingsInBaseCurrency"
/> />
</div> </div>
</div> </div>
@if (isLoading || summary?.emergencyFund?.cash > 0) { @if (isLoading || summary?.emergencyFund?.assets > 0) {
<div class="flex-nowrap px-3 py-1 row"> <div class="flex-nowrap px-3 py-1 row">
<div class="flex-grow-1 indent-2 text-truncate" i18n>Buying Power</div> <div class="flex-grow-1 indent-2 text-truncate" i18n>Investments</div>
<div class="flex-column flex-wrap justify-content-end"> <div class="flex-column flex-wrap justify-content-end">
<gf-value <gf-value
class="justify-content-end" class="justify-content-end"
@ -202,7 +203,7 @@
[locale]="locale" [locale]="locale"
[precision]="precision" [precision]="precision"
[unit]="baseCurrency" [unit]="baseCurrency"
[value]="isLoading ? undefined : summary?.cash" [value]="isLoading ? undefined : investmentsInBaseCurrency"
/> />
</div> </div>
</div> </div>
@ -216,14 +217,14 @@
[locale]="locale" [locale]="locale"
[precision]="precision" [precision]="precision"
[unit]="baseCurrency" [unit]="baseCurrency"
[value]="isLoading ? undefined : summary?.emergencyFund?.cash" [value]="isLoading ? undefined : summary?.emergencyFund?.assets"
/> />
</div> </div>
</div> </div>
} }
<div class="flex-nowrap px-3 py-1 row"> <div class="flex-nowrap px-3 py-1 row">
<div class="align-items-center d-flex flex-grow-1 indent-1"> <div class="align-items-center d-flex flex-grow-1 indent-1">
<ng-container i18n>Holdings</ng-container> <ng-container i18n>Cash</ng-container>
@if ( @if (
!hasImpersonationId && !hasImpersonationId &&
summary?.totalValueInBaseCurrency > 0 && summary?.totalValueInBaseCurrency > 0 &&
@ -233,7 +234,8 @@
class="d-lg-inline-block d-none ml-2 small text-muted" class="d-lg-inline-block d-none ml-2 small text-muted"
[isPercent]="true" [isPercent]="true"
[locale]="locale" [locale]="locale"
[value]="isLoading ? undefined : holdingsPercentage" [precision]="0"
[value]="isLoading ? undefined : cashPercentage"
/> />
} }
</div> </div>
@ -245,11 +247,25 @@
[locale]="locale" [locale]="locale"
[precision]="precision" [precision]="precision"
[unit]="baseCurrency" [unit]="baseCurrency"
[value]="isLoading ? undefined : holdingsInBaseCurrency" [value]="isLoading ? undefined : summary?.totalCashInBaseCurrency"
/>
</div>
</div>
@if (isLoading || summary?.emergencyFund?.cash > 0) {
<div class="flex-nowrap px-3 py-1 row">
<div class="flex-grow-1 indent-2 text-truncate" i18n>Buying Power</div>
<div class="flex-column flex-wrap justify-content-end">
<gf-value
class="justify-content-end"
position="end"
[isCurrency]="true"
[locale]="locale"
[precision]="precision"
[unit]="baseCurrency"
[value]="isLoading ? undefined : summary?.cash"
/> />
</div> </div>
</div> </div>
@if (isLoading || summary?.emergencyFund?.assets > 0) {
<div class="flex-nowrap px-3 py-1 row"> <div class="flex-nowrap px-3 py-1 row">
<div class="flex-grow-1 indent-2 text-truncate" i18n>Emergency Fund</div> <div class="flex-grow-1 indent-2 text-truncate" i18n>Emergency Fund</div>
<div class="flex-column flex-wrap justify-content-end"> <div class="flex-column flex-wrap justify-content-end">
@ -260,7 +276,7 @@
[locale]="locale" [locale]="locale"
[precision]="precision" [precision]="precision"
[unit]="baseCurrency" [unit]="baseCurrency"
[value]="isLoading ? undefined : summary?.emergencyFund?.assets" [value]="isLoading ? undefined : summary?.emergencyFund?.cash"
/> />
</div> </div>
</div> </div>
@ -277,6 +293,7 @@
class="d-lg-inline-block d-none ml-2 small text-muted" class="d-lg-inline-block d-none ml-2 small text-muted"
[isPercent]="true" [isPercent]="true"
[locale]="locale" [locale]="locale"
[precision]="0"
[value]="isLoading ? undefined : excludedFromAnalysisPercentage" [value]="isLoading ? undefined : excludedFromAnalysisPercentage"
/> />
} }
@ -363,6 +380,7 @@
class="d-lg-inline-block d-none ml-2 small text-muted" class="d-lg-inline-block d-none ml-2 small text-muted"
[isPercent]="true" [isPercent]="true"
[locale]="locale" [locale]="locale"
[precision]="0"
[value]="isLoading ? undefined : emergencyFundPercentage" [value]="isLoading ? undefined : emergencyFundPercentage"
/> />
} }

10
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts

@ -98,6 +98,16 @@ export class GfPortfolioSummaryComponent implements OnChanges {
: 0; : 0;
} }
protected get investmentsInBaseCurrency() {
if (!isNumber(this.holdingsInBaseCurrency)) {
return null;
}
return (
this.holdingsInBaseCurrency - (this.summary.emergencyFund?.assets ?? 0)
);
}
public ngOnChanges() { public ngOnChanges() {
if (this.summary) { if (this.summary) {
if ( if (

Loading…
Cancel
Save