mirror of https://github.com/ghostfolio/ghostfolio
				
				
			
							committed by
							
								 GitHub
								GitHub
							
						
					
				
				 11 changed files with 193 additions and 17 deletions
			
			
		| @ -0,0 +1,10 @@ | |||||
|  | <ngx-skeleton-loader | ||||
|  |   *ngIf="isLoading" | ||||
|  |   animation="pulse" | ||||
|  |   class="h-100" | ||||
|  |   [theme]="{ | ||||
|  |     width: '100%' | ||||
|  |   }" | ||||
|  | ></ngx-skeleton-loader> | ||||
|  | 
 | ||||
|  | <div class="align-items-center d-flex h-100 w-100" id="svgMap"></div> | ||||
| @ -0,0 +1,24 @@ | |||||
|  | :host { | ||||
|  |   display: block; | ||||
|  |   height: 100%; | ||||
|  | 
 | ||||
|  |   ::ng-deep { | ||||
|  |     .loader { | ||||
|  |       height: 100% !important; | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     .svgMap-map-wrapper { | ||||
|  |       background: transparent; | ||||
|  | 
 | ||||
|  |       .svgMap-map-controls-wrapper { | ||||
|  |         display: none; | ||||
|  |       } | ||||
|  |     } | ||||
|  |   } | ||||
|  | } | ||||
|  | 
 | ||||
|  | :host-context(.is-dark-theme) { | ||||
|  |   .svgMap-tooltip { | ||||
|  |     background: var(--dark-background); | ||||
|  |   } | ||||
|  | } | ||||
| @ -0,0 +1,79 @@ | |||||
|  | import { | ||||
|  |   ChangeDetectionStrategy, | ||||
|  |   ChangeDetectorRef, | ||||
|  |   Component, | ||||
|  |   Input, | ||||
|  |   OnChanges, | ||||
|  |   OnDestroy, | ||||
|  |   OnInit | ||||
|  | } from '@angular/core'; | ||||
|  | import { primaryColorHex } from '@ghostfolio/common/config'; | ||||
|  | import { getCssVariable, getTextColor } from '@ghostfolio/common/helper'; | ||||
|  | import { Currency } from '@prisma/client'; | ||||
|  | import svgMap from 'svgmap'; | ||||
|  | 
 | ||||
|  | @Component({ | ||||
|  |   selector: 'gf-world-map-chart', | ||||
|  |   changeDetection: ChangeDetectionStrategy.OnPush, | ||||
|  |   templateUrl: './world-map-chart.component.html', | ||||
|  |   styleUrls: ['./world-map-chart.component.scss'] | ||||
|  | }) | ||||
|  | export class WorldMapChartComponent implements OnChanges, OnDestroy, OnInit { | ||||
|  |   @Input() baseCurrency: Currency; | ||||
|  |   @Input() countries: { [code: string]: { name: string; value: number } }; | ||||
|  | 
 | ||||
|  |   public isLoading = true; | ||||
|  |   public svgMapElement; | ||||
|  | 
 | ||||
|  |   public constructor(private changeDetectorRef: ChangeDetectorRef) {} | ||||
|  | 
 | ||||
|  |   public ngOnInit() {} | ||||
|  | 
 | ||||
|  |   public ngOnChanges() { | ||||
|  |     if (this.countries) { | ||||
|  |       this.destroySvgMap(); | ||||
|  | 
 | ||||
|  |       this.initialize(); | ||||
|  |     } | ||||
|  |   } | ||||
|  | 
 | ||||
|  |   public ngOnDestroy() { | ||||
|  |     this.destroySvgMap(); | ||||
|  |   } | ||||
|  | 
 | ||||
|  |   private initialize() { | ||||
|  |     this.svgMapElement = new svgMap({ | ||||
|  |       colorMax: primaryColorHex, | ||||
|  |       colorMin: '#d3f4f3', | ||||
|  |       colorNoData: `rgba(${getTextColor()}, ${getCssVariable( | ||||
|  |         '--palette-foreground-divider-alpha' | ||||
|  |       )})`,
 | ||||
|  |       data: { | ||||
|  |         applyData: 'value', | ||||
|  |         data: { | ||||
|  |           value: { | ||||
|  |             format: `{0} ${this.baseCurrency}` | ||||
|  |           } | ||||
|  |         }, | ||||
|  |         values: this.countries | ||||
|  |       }, | ||||
|  |       hideFlag: true, | ||||
|  |       minZoom: 1.06, | ||||
|  |       maxZoom: 1.06, | ||||
|  |       targetElementID: 'svgMap' | ||||
|  |     }); | ||||
|  | 
 | ||||
|  |     setTimeout(() => { | ||||
|  |       this.isLoading = false; | ||||
|  | 
 | ||||
|  |       this.changeDetectorRef.markForCheck(); | ||||
|  |     }, 500); | ||||
|  |   } | ||||
|  | 
 | ||||
|  |   private destroySvgMap() { | ||||
|  |     this.svgMapElement?.mapWrapper?.remove(); | ||||
|  |     this.svgMapElement?.tooltip?.remove(); | ||||
|  | 
 | ||||
|  |     this.svgMapElement = null; | ||||
|  |   } | ||||
|  | } | ||||
| @ -0,0 +1,13 @@ | |||||
|  | import { CommonModule } from '@angular/common'; | ||||
|  | import { NgModule } from '@angular/core'; | ||||
|  | import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; | ||||
|  | 
 | ||||
|  | import { WorldMapChartComponent } from './world-map-chart.component'; | ||||
|  | 
 | ||||
|  | @NgModule({ | ||||
|  |   declarations: [WorldMapChartComponent], | ||||
|  |   exports: [WorldMapChartComponent], | ||||
|  |   imports: [CommonModule, NgxSkeletonLoaderModule], | ||||
|  |   providers: [] | ||||
|  | }) | ||||
|  | export class GfWorldMapChartModule {} | ||||
					Loading…
					
					
				
		Reference in new issue