@ -2,11 +2,13 @@ import {
getAnnualizedPerformancePercent ,
getIntervalFromDateRange
} from '@ghostfolio/common/calculation-helper' ;
import { getTooltipOptions } from '@ghostfolio/common/chart-helper' ;
import { getLocale } from '@ghostfolio/common/helper' ;
import {
AssetProfileIdentifier ,
PortfolioPosition
} from '@ghostfolio/common/interfaces' ;
import { DateRange } from '@ghostfolio/common/types' ;
import { ColorScheme, DateRange } from '@ghostfolio/common/types' ;
import { CommonModule } from '@angular/common' ;
import {
@ -25,7 +27,7 @@ import { DataSource } from '@prisma/client';
import { Big } from 'big.js' ;
import { ChartConfiguration } from 'chart.js' ;
import { LinearScale } from 'chart.js' ;
import { Chart } from 'chart.js' ;
import { Chart , Tooltip } from 'chart.js' ;
import { TreemapController , TreemapElement } from 'chartjs-chart-treemap' ;
import { differenceInDays , max } from 'date-fns' ;
import { orderBy } from 'lodash' ;
@ -44,9 +46,12 @@ const { gray, green, red } = require('open-color');
export class GfTreemapChartComponent
implements AfterViewInit , OnChanges , OnDestroy
{
@Input ( ) baseCurrency : string ;
@Input ( ) colorScheme : ColorScheme ;
@Input ( ) cursor : string ;
@Input ( ) dateRange : DateRange ;
@Input ( ) holdings : PortfolioPosition [ ] ;
@Input ( ) locale = getLocale ( ) ;
@Output ( ) treemapChartClicked = new EventEmitter < AssetProfileIdentifier > ( ) ;
@ -58,7 +63,7 @@ export class GfTreemapChartComponent
public isLoading = true ;
public constructor ( ) {
Chart . register ( LinearScale , T reemapController, TreemapElement ) ;
Chart . register ( LinearScale , T ooltip, T reemapController, TreemapElement ) ;
}
public ngAfterViewInit() {
@ -168,6 +173,9 @@ export class GfTreemapChartComponent
if ( this . chartCanvas ) {
if ( this . chart ) {
this . chart . data = data ;
this . chart . options . plugins . tooltip = < unknown > (
this . getTooltipPluginConfiguration ( )
) ;
this . chart . update ( ) ;
} else {
this . chart = new Chart ( this . chartCanvas . nativeElement , {
@ -199,9 +207,7 @@ export class GfTreemapChartComponent
}
} ,
plugins : {
tooltip : {
enabled : false
}
tooltip : this.getTooltipPluginConfiguration ( )
}
} ,
type : 'treemap'
@ -211,4 +217,34 @@ export class GfTreemapChartComponent
this . isLoading = false ;
}
private getTooltipPluginConfiguration() {
return {
. . . getTooltipOptions ( {
colorScheme : this.colorScheme ,
currency : this.baseCurrency ,
locale : this.locale
} ) ,
callbacks : {
label : ( context ) = > {
if ( context . raw . _data . valueInBaseCurrency !== null ) {
const value = < number > context . raw . _data . valueInBaseCurrency ;
return ` ${ value . toLocaleString ( this . locale , {
maximumFractionDigits : 2 ,
minimumFractionDigits : 2
} ) } $ { this . baseCurrency } ` ;
} else {
const percentage =
< number > context . raw . _data . allocationInPercentage * 100 ;
return ` ${ percentage . toFixed ( 2 ) } % ` ;
}
} ,
title : ( ) = > {
return '' ;
}
} ,
xAlign : 'center' ,
yAlign : 'center'
} ;
}
}