Merge branch 'master' into feature/update-hashrate-widget
This commit is contained in:
		
						commit
						b3847bcbcb
					
				
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @ -31,6 +31,7 @@ import { MiningDashboardComponent } from './components/mining-dashboard/mining-d | ||||
| import { HashrateChartComponent } from './components/hashrate-chart/hashrate-chart.component'; | ||||
| import { HashrateChartPoolsComponent } from './components/hashrates-chart-pools/hashrate-chart-pools.component'; | ||||
| import { MiningStartComponent } from './components/mining-start/mining-start.component'; | ||||
| import { GraphsComponent } from './components/graphs/graphs.component'; | ||||
| import { BlocksList } from './components/blocks-list/blocks-list.component'; | ||||
| 
 | ||||
| let routes: Routes = [ | ||||
| @ -80,18 +81,6 @@ let routes: Routes = [ | ||||
|             path: 'blocks', | ||||
|             component: BlocksList, | ||||
|           }, | ||||
|           { | ||||
|             path: 'hashrate', | ||||
|             component: HashrateChartComponent, | ||||
|           }, | ||||
|           { | ||||
|             path: 'hashrate/pools', | ||||
|             component: HashrateChartPoolsComponent, | ||||
|           }, | ||||
|           { | ||||
|             path: 'pools', | ||||
|             component: PoolRankingComponent, | ||||
|           }, | ||||
|           { | ||||
|             path: 'pool', | ||||
|             children: [ | ||||
| @ -105,8 +94,31 @@ let routes: Routes = [ | ||||
|       }, | ||||
|       { | ||||
|         path: 'graphs', | ||||
|         component: GraphsComponent, | ||||
|         children: [ | ||||
|           { | ||||
|             path: '', | ||||
|             pathMatch: 'full', | ||||
|             redirectTo: 'mempool', | ||||
|           }, | ||||
|           { | ||||
|             path: 'mempool', | ||||
|             component: StatisticsComponent, | ||||
|           }, | ||||
|           { | ||||
|             path: 'mining/hashrate-difficulty', | ||||
|             component: HashrateChartComponent, | ||||
|           }, | ||||
|           { | ||||
|             path: 'mining/pools-dominance', | ||||
|             component: HashrateChartPoolsComponent, | ||||
|           }, | ||||
|           { | ||||
|             path: 'mining/pools', | ||||
|             component: PoolRankingComponent, | ||||
|           }, | ||||
|         ], | ||||
|       }, | ||||
|       { | ||||
|         path: 'about', | ||||
|         component: AboutComponent, | ||||
| @ -224,8 +236,31 @@ let routes: Routes = [ | ||||
|           }, | ||||
|           { | ||||
|             path: 'graphs', | ||||
|             component: GraphsComponent, | ||||
|             children: [ | ||||
|               { | ||||
|                 path: '', | ||||
|                 pathMatch: 'full', | ||||
|                 redirectTo: 'mempool', | ||||
|               }, | ||||
|               { | ||||
|                 path: 'mempool', | ||||
|                 component: StatisticsComponent, | ||||
|               }, | ||||
|               { | ||||
|                 path: 'mining/hashrate-difficulty', | ||||
|                 component: HashrateChartComponent, | ||||
|               }, | ||||
|               { | ||||
|                 path: 'mining/pools-dominance', | ||||
|                 component: HashrateChartPoolsComponent, | ||||
|               }, | ||||
|               { | ||||
|                 path: 'mining/pools', | ||||
|                 component: PoolRankingComponent, | ||||
|               }, | ||||
|             ] | ||||
|           }, | ||||
|           { | ||||
|             path: 'address/:id', | ||||
|             children: [], | ||||
| @ -337,8 +372,31 @@ let routes: Routes = [ | ||||
|           }, | ||||
|           { | ||||
|             path: 'graphs', | ||||
|             component: GraphsComponent, | ||||
|             children: [ | ||||
|               { | ||||
|                 path: '', | ||||
|                 pathMatch: 'full', | ||||
|                 redirectTo: 'mempool', | ||||
|               }, | ||||
|               { | ||||
|                 path: 'mempool', | ||||
|                 component: StatisticsComponent, | ||||
|               }, | ||||
|               { | ||||
|                 path: 'mining/hashrate-difficulty', | ||||
|                 component: HashrateChartComponent, | ||||
|               }, | ||||
|               { | ||||
|                 path: 'mining/pools-dominance', | ||||
|                 component: HashrateChartPoolsComponent, | ||||
|               }, | ||||
|               { | ||||
|                 path: 'mining/pools', | ||||
|                 component: PoolRankingComponent, | ||||
|               }, | ||||
|             ] | ||||
|           }, | ||||
|           { | ||||
|             path: 'address/:id', | ||||
|             children: [], | ||||
| @ -439,8 +497,31 @@ if (browserWindowEnv && browserWindowEnv.BASE_MODULE === 'liquid') { | ||||
|       }, | ||||
|       { | ||||
|         path: 'graphs', | ||||
|         component: GraphsComponent, | ||||
|         children: [ | ||||
|           { | ||||
|             path: '', | ||||
|             pathMatch: 'full', | ||||
|             redirectTo: 'mempool', | ||||
|           }, | ||||
|           { | ||||
|             path: 'mempool', | ||||
|             component: StatisticsComponent, | ||||
|           }, | ||||
|           { | ||||
|             path: 'mining/hashrate-difficulty', | ||||
|             component: HashrateChartComponent, | ||||
|           }, | ||||
|           { | ||||
|             path: 'mining/pools-dominance', | ||||
|             component: HashrateChartPoolsComponent, | ||||
|           }, | ||||
|           { | ||||
|             path: 'mining/pools', | ||||
|             component: PoolRankingComponent, | ||||
|           }, | ||||
|         ] | ||||
|       }, | ||||
|       { | ||||
|         path: 'address/:id', | ||||
|         component: AddressComponent | ||||
| @ -548,8 +629,31 @@ if (browserWindowEnv && browserWindowEnv.BASE_MODULE === 'liquid') { | ||||
|           }, | ||||
|           { | ||||
|             path: 'graphs', | ||||
|             component: GraphsComponent, | ||||
|             children: [ | ||||
|               { | ||||
|                 path: '', | ||||
|                 pathMatch: 'full', | ||||
|                 redirectTo: 'mempool', | ||||
|               }, | ||||
|               { | ||||
|                 path: 'mempool', | ||||
|                 component: StatisticsComponent, | ||||
|               }, | ||||
|               { | ||||
|                 path: 'mining/hashrate-difficulty', | ||||
|                 component: HashrateChartComponent, | ||||
|               }, | ||||
|               { | ||||
|                 path: 'mining/pools-dominance', | ||||
|                 component: HashrateChartPoolsComponent, | ||||
|               }, | ||||
|               { | ||||
|                 path: 'mining/pools', | ||||
|                 component: PoolRankingComponent, | ||||
|               }, | ||||
|             ] | ||||
|           }, | ||||
|           { | ||||
|             path: 'address/:id', | ||||
|             component: AddressComponent | ||||
|  | ||||
| @ -75,6 +75,7 @@ import { HashrateChartPoolsComponent } from './components/hashrates-chart-pools/ | ||||
| import { MiningStartComponent } from './components/mining-start/mining-start.component'; | ||||
| import { AmountShortenerPipe } from './shared/pipes/amount-shortener.pipe'; | ||||
| import { ShortenStringPipe } from './shared/pipes/shorten-string-pipe/shorten-string.pipe'; | ||||
| import { GraphsComponent } from './components/graphs/graphs.component'; | ||||
| import { DifficultyAdjustmentsTable } from './components/difficulty-adjustments-table/difficulty-adjustments-table.components'; | ||||
| import { BlocksList } from './components/blocks-list/blocks-list.component'; | ||||
| 
 | ||||
| @ -133,6 +134,7 @@ import { BlocksList } from './components/blocks-list/blocks-list.component'; | ||||
|     HashrateChartPoolsComponent, | ||||
|     MiningStartComponent, | ||||
|     AmountShortenerPipe, | ||||
|     GraphsComponent, | ||||
|     DifficultyAdjustmentsTable, | ||||
|     BlocksList, | ||||
|   ], | ||||
|  | ||||
							
								
								
									
										25
									
								
								frontend/src/app/components/graphs/graphs.component.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								frontend/src/app/components/graphs/graphs.component.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | ||||
| <ul ngbNav #nav="ngbNav" class="nav-pills mb-3" style="padding: 0px 35px"> | ||||
|   <div class="d-inline-flex flex-wrap menu"> | ||||
|     <li ngbNavItem class="menu-li"> | ||||
|       <a routerLinkActive="active" [routerLink]="['/graphs/mempool' | relativeUrl]" ngbNavLink>Mempool</a> | ||||
|     </li> | ||||
|     <li ngbNavItem class="menu-li"> | ||||
|       <a routerLinkActive="active" [routerLink]="['/graphs/mining/pools' | relativeUrl]" ngbNavLink i18n="mining.pools"> | ||||
|         Pools ranking | ||||
|       </a> | ||||
|     </li> | ||||
|     <li ngbNavItem class="menu-li"> | ||||
|       <a routerLinkActive="active" [routerLink]="['/graphs/mining/pools-dominance' | relativeUrl]" ngbNavLink i18n="mining.pools-dominance"> | ||||
|         Pools dominance | ||||
|       </a> | ||||
|     </li> | ||||
|     <li ngbNavItem class="menu-li"> | ||||
|       <a routerLinkActive="active" [routerLink]="['/graphs/mining/hashrate-difficulty' | relativeUrl]" ngbNavLink | ||||
|         i18n="mining.hashrate-difficulty"> | ||||
|         Hashrate & Difficulty | ||||
|       </a> | ||||
|     </li> | ||||
|   </div> | ||||
| </ul> | ||||
| 
 | ||||
| <router-outlet></router-outlet> | ||||
							
								
								
									
										9
									
								
								frontend/src/app/components/graphs/graphs.component.scss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								frontend/src/app/components/graphs/graphs.component.scss
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | ||||
| .menu { | ||||
|   flex-grow: 1; | ||||
|   max-width: 600px; | ||||
| } | ||||
| 
 | ||||
| .menu-li { | ||||
|   flex-grow: 1; | ||||
|   text-align: center; | ||||
| } | ||||
							
								
								
									
										14
									
								
								frontend/src/app/components/graphs/graphs.component.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								frontend/src/app/components/graphs/graphs.component.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| import { Component, OnInit } from "@angular/core"; | ||||
| 
 | ||||
| @Component({ | ||||
|   selector: 'app-graphs', | ||||
|   templateUrl: './graphs.component.html', | ||||
|   styleUrls: ['./graphs.component.scss'], | ||||
| }) | ||||
| export class GraphsComponent implements OnInit { | ||||
|   constructor() { } | ||||
| 
 | ||||
|   ngOnInit(): void { | ||||
| 
 | ||||
|   } | ||||
| } | ||||
| @ -19,6 +19,7 @@ | ||||
|   </div> | ||||
| 
 | ||||
|   <div class="card-header mb-0 mb-md-4" [style]="widget ? 'display:none' : ''"> | ||||
|     <span i18n="mining.mining-pool-share">Hashrate & Difficulty</span> | ||||
|     <form [formGroup]="radioGroupForm" class="formRadioGroup" *ngIf="(hashrateObservable$ | async) as hashrates"> | ||||
|       <div class="btn-group btn-group-toggle" ngbRadioGroup name="radioBasic" formControlName="dateSpan"> | ||||
|         <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="hashrates.availableTimespanDay >= 90"> | ||||
|  | ||||
| @ -1,3 +1,11 @@ | ||||
| .card-header { | ||||
|   border-bottom: 0; | ||||
|   font-size: 18px; | ||||
|   @media (min-width: 465px) { | ||||
|     font-size: 20px; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| .main-title { | ||||
|   position: relative; | ||||
|   color: #ffffff91; | ||||
| @ -10,13 +18,14 @@ | ||||
| } | ||||
| 
 | ||||
| .full-container { | ||||
|   padding: 0px 15px; | ||||
|   width: 100%; | ||||
|   height: calc(100% - 100px); | ||||
|   height: calc(100% - 170px); | ||||
|   @media (max-width: 992px) { | ||||
|     height: calc(100% - 140px); | ||||
|     height: calc(100% - 220px); | ||||
|   }; | ||||
|   @media (max-width: 576px) { | ||||
|     height: calc(100% - 180px); | ||||
|   @media (max-width: 575px) { | ||||
|     height: calc(100% - 260px); | ||||
|   }; | ||||
| } | ||||
| 
 | ||||
| @ -24,7 +33,22 @@ | ||||
|   width: 100%; | ||||
|   height: 100%; | ||||
|   padding-bottom: 20px; | ||||
|   padding-right: 20px; | ||||
|   padding-right: 10px; | ||||
|   @media (max-width: 992px) { | ||||
|     padding-bottom: 25px; | ||||
|   } | ||||
|   @media (max-width: 829px) { | ||||
|     padding-bottom: 50px; | ||||
|   } | ||||
|   @media (max-width: 767px) { | ||||
|     padding-bottom: 25px; | ||||
|   } | ||||
|   @media (max-width: 629px) { | ||||
|     padding-bottom: 55px; | ||||
|   } | ||||
|   @media (max-width: 567px) { | ||||
|     padding-bottom: 55px; | ||||
|   } | ||||
| } | ||||
| .chart-widget { | ||||
|   width: 100%; | ||||
| @ -36,6 +60,14 @@ | ||||
|   margin-top: 6px; | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
|   @media (min-width: 1130px) { | ||||
|     position: relative; | ||||
|     top: -65px; | ||||
|   } | ||||
|   @media (min-width: 830px) and (max-width: 1130px) { | ||||
|     position: relative; | ||||
|     top: 0px; | ||||
|   } | ||||
|   @media (min-width: 830px) { | ||||
|     flex-direction: row; | ||||
|     float: right; | ||||
|  | ||||
| @ -61,6 +61,7 @@ export class HashrateChartComponent implements OnInit { | ||||
|       .pipe( | ||||
|         startWith('1y'), | ||||
|         switchMap((timespan) => { | ||||
|           this.isLoading = true; | ||||
|           return this.apiService.getHistoricalHashrate$(timespan) | ||||
|             .pipe( | ||||
|               tap((data: any) => { | ||||
| @ -144,6 +145,7 @@ export class HashrateChartComponent implements OnInit { | ||||
| 
 | ||||
|     this.chartOptions = { | ||||
|       title: title, | ||||
|       animation: false, | ||||
|       color: [ | ||||
|         new graphic.LinearGradient(0, 0, 0, 0.65, [ | ||||
|           { offset: 0, color: '#F4511E' }, | ||||
| @ -158,7 +160,7 @@ export class HashrateChartComponent implements OnInit { | ||||
|         top: 30, | ||||
|         right: this.right, | ||||
|         left: this.left, | ||||
|         bottom: this.widget ? 30 : 60, | ||||
|         bottom: this.widget ? 30 : this.isMobile() ? 90 : 60, | ||||
|       }, | ||||
|       tooltip: { | ||||
|         show: !this.isMobile() || !this.widget, | ||||
| @ -289,17 +291,18 @@ export class HashrateChartComponent implements OnInit { | ||||
|         type: 'inside', | ||||
|         realtime: true, | ||||
|         zoomLock: true, | ||||
|         zoomOnMouseWheel: true, | ||||
|         moveOnMouseMove: true, | ||||
|         maxSpan: 100, | ||||
|         minSpan: 10, | ||||
|         moveOnMouseMove: false, | ||||
|       }, { | ||||
|         showDetail: false, | ||||
|         show: true, | ||||
|         type: 'slider', | ||||
|         brushSelect: false, | ||||
|         realtime: true, | ||||
|         bottom: 0, | ||||
|         bottom: this.isMobile() ? 30 : 0, | ||||
|         left: 20, | ||||
|         right: 15, | ||||
|         selectedDataBackground: { | ||||
|           lineStyle: { | ||||
|             color: '#fff', | ||||
|  | ||||
| @ -1,6 +1,7 @@ | ||||
| <div [class]="widget === false ? 'full-container' : ''"> | ||||
| 
 | ||||
|   <div class="card-header mb-0 mb-md-4" [style]="widget ? 'display:none' : ''"> | ||||
|   <div class="card-header" [style]="widget ? 'display:none' : ''"> | ||||
|     <span *ngIf="!widget" i18n="mining.pools-dominance">Mining pools dominance</span> | ||||
|     <form [formGroup]="radioGroupForm" class="formRadioGroup" *ngIf="(hashrateObservable$ | async) as hashrates"> | ||||
|       <div class="btn-group btn-group-toggle" ngbRadioGroup name="radioBasic" formControlName="dateSpan"> | ||||
|         <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="hashrates.availableTimespanDay >= 90"> | ||||
|  | ||||
| @ -1,3 +1,11 @@ | ||||
| .card-header { | ||||
|   border-bottom: 0; | ||||
|   font-size: 18px; | ||||
|   @media (min-width: 465px) { | ||||
|     font-size: 20px; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| .main-title { | ||||
|   position: relative; | ||||
|   color: #ffffff91; | ||||
| @ -10,21 +18,37 @@ | ||||
| } | ||||
| 
 | ||||
| .full-container { | ||||
|   padding: 0px 15px; | ||||
|   width: 100%; | ||||
|   height: calc(100% - 100px); | ||||
|   @media (max-width: 992px) { | ||||
|   height: calc(100% - 140px); | ||||
|   @media (max-width: 991px) { | ||||
|     height: calc(100% - 190px); | ||||
|   }; | ||||
|   @media (max-width: 576px) { | ||||
|     height: calc(100% - 180px); | ||||
|   @media (max-width: 575px) { | ||||
|     height: calc(100% - 235px); | ||||
|   }; | ||||
| } | ||||
| 
 | ||||
| .chart { | ||||
|   width: 100%; | ||||
|   height: 100%; | ||||
|   padding-bottom: 20px; | ||||
|   padding-right: 20px; | ||||
|   padding-bottom: 25px; | ||||
|   padding-right: 10px; | ||||
|   @media (max-width: 992px) { | ||||
|     padding-bottom: 25px; | ||||
|   } | ||||
|   @media (max-width: 829px) { | ||||
|     padding-bottom: 50px; | ||||
|   } | ||||
|   @media (max-width: 767px) { | ||||
|     padding-bottom: 50px; | ||||
|   } | ||||
|   @media (max-width: 629px) { | ||||
|     padding-bottom: 85px; | ||||
|   } | ||||
|   @media (max-width: 567px) { | ||||
|     padding-bottom: 85px; | ||||
|   } | ||||
| } | ||||
| .chart-widget { | ||||
|   width: 100%; | ||||
| @ -36,6 +60,14 @@ | ||||
|   margin-top: 6px; | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
|   @media (min-width: 1130px) { | ||||
|     position: relative; | ||||
|     top: -65px; | ||||
|   } | ||||
|   @media (min-width: 830px) and (max-width: 1130px) { | ||||
|     position: relative; | ||||
|     top: 0px; | ||||
|   } | ||||
|   @media (min-width: 830px) { | ||||
|     flex-direction: row; | ||||
|     float: right; | ||||
|  | ||||
| @ -23,7 +23,7 @@ import { poolsColor } from 'src/app/app.constants'; | ||||
| }) | ||||
| export class HashrateChartPoolsComponent implements OnInit { | ||||
|   @Input() widget = false; | ||||
|   @Input() right: number | string = 40; | ||||
|   @Input() right: number | string = 45; | ||||
|   @Input() left: number | string = 25; | ||||
| 
 | ||||
|   radioGroupForm: FormGroup; | ||||
| @ -153,11 +153,12 @@ export class HashrateChartPoolsComponent implements OnInit { | ||||
| 
 | ||||
|     this.chartOptions = { | ||||
|       title: title, | ||||
|       animation: false, | ||||
|       grid: { | ||||
|         right: this.right, | ||||
|         left: this.left, | ||||
|         bottom: this.widget ? 30 : 20, | ||||
|         top: this.widget ? 10 : 40, | ||||
|         bottom: this.widget ? 30 : 60, | ||||
|         top: this.widget || this.isMobile() ? 10 : 50, | ||||
|       }, | ||||
|       tooltip: { | ||||
|         show: !this.isMobile() || !this.widget, | ||||
| @ -206,6 +207,32 @@ export class HashrateChartPoolsComponent implements OnInit { | ||||
|         min: 0, | ||||
|       }, | ||||
|       series: data.series, | ||||
|       dataZoom: this.widget ? null : [{ | ||||
|         type: 'inside', | ||||
|         realtime: true, | ||||
|         zoomLock: true, | ||||
|         maxSpan: 100, | ||||
|         minSpan: 10, | ||||
|         moveOnMouseMove: false, | ||||
|       }, { | ||||
|         showDetail: false, | ||||
|         show: true, | ||||
|         type: 'slider', | ||||
|         brushSelect: false, | ||||
|         realtime: true, | ||||
|         bottom: 0, | ||||
|         left: 20, | ||||
|         right: 15, | ||||
|         selectedDataBackground: { | ||||
|           lineStyle: { | ||||
|             color: '#fff', | ||||
|             opacity: 0.45, | ||||
|           }, | ||||
|           areaStyle: { | ||||
|             opacity: 0, | ||||
|           } | ||||
|         }, | ||||
|       }], | ||||
|     }; | ||||
|   } | ||||
| 
 | ||||
|  | ||||
| @ -38,7 +38,7 @@ | ||||
|         <a class="nav-link" [routerLink]="['/blocks' | relativeUrl]" (click)="collapse()"><fa-icon [icon]="['fas', 'cubes']" [fixedWidth]="true" i18n-title="master-page.blocks" title="Blocks"></fa-icon></a> | ||||
|       </li> | ||||
|       <li class="nav-item" routerLinkActive="active" id="btn-graphs"> | ||||
|         <a class="nav-link" [routerLink]="['/graphs' | relativeUrl]" (click)="collapse()"><fa-icon [icon]="['fas', 'chart-area']" [fixedWidth]="true" i18n-title="master-page.graphs" title="Graphs"></fa-icon></a> | ||||
|         <a class="nav-link" [routerLink]="['/graphs/mempool' | relativeUrl]" (click)="collapse()"><fa-icon [icon]="['fas', 'chart-area']" [fixedWidth]="true" i18n-title="master-page.graphs" title="Graphs"></fa-icon></a> | ||||
|       </li> | ||||
|       <li class="nav-item d-none d-lg-block" routerLinkActive="active" id="btn-tv"> | ||||
|         <a class="nav-link" [routerLink]="['/tv' | relativeUrl]" (click)="collapse()"><fa-icon [icon]="['fas', 'tv']" [fixedWidth]="true" i18n-title="master-page.tvview" title="TV view"></fa-icon></a> | ||||
|  | ||||
| @ -76,7 +76,7 @@ | ||||
|       <div class="card" style="height: 385px"> | ||||
|         <div class="card-body"> | ||||
|           <app-pool-ranking [widget]=true></app-pool-ranking> | ||||
|           <div class="mt-1"><a [routerLink]="['/mining/pools' | relativeUrl]" i18n="dashboard.view-more">View more | ||||
|           <div class="mt-1"><a [routerLink]="['/graphs/mining/pools' | relativeUrl]" i18n="dashboard.view-more">View more | ||||
|               »</a></div> | ||||
|         </div> | ||||
|       </div> | ||||
| @ -87,7 +87,7 @@ | ||||
|       <div class="card" style="height: 385px"> | ||||
|         <div class="card-body"> | ||||
|           <app-hashrate-chart [widget]=true></app-hashrate-chart> | ||||
|           <div class="mt-1"><a [routerLink]="['/mining/hashrate' | relativeUrl]" i18n="dashboard.view-more">View more | ||||
|           <div class="mt-1"><a [routerLink]="['/graphs/mining/hashrate-difficulty' | relativeUrl]" i18n="dashboard.view-more">View more | ||||
|               »</a></div> | ||||
|         </div> | ||||
|       </div> | ||||
| @ -107,6 +107,7 @@ | ||||
|       </div> | ||||
|     </div> | ||||
| 
 | ||||
|     <!-- Difficult adjustments --> | ||||
|     <div class="col"> | ||||
|       <div class="card" style="height: 385px"> | ||||
|         <div class="card-body"> | ||||
| @ -114,7 +115,7 @@ | ||||
|             Adjustments | ||||
|           </h5> | ||||
|           <app-difficulty-adjustments-table></app-difficulty-adjustments-table> | ||||
|           <div><a [routerLink]="['/mining/hashrate' | relativeUrl]" i18n="dashboard.view-more">View more | ||||
|           <div class="mt-1"><a [routerLink]="['/graphs/mining/hashrate-difficulty' | relativeUrl]" i18n="dashboard.view-more">View more | ||||
|               »</a></div> | ||||
|         </div> | ||||
|       </div> | ||||
|  | ||||
| @ -125,3 +125,7 @@ | ||||
|     max-width: 55px; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| .card-text { | ||||
|   font-size: 22px; | ||||
| } | ||||
|  | ||||
| @ -1,7 +1,8 @@ | ||||
| import { ChangeDetectionStrategy, Component, Inject, LOCALE_ID, OnDestroy, OnInit } from '@angular/core'; | ||||
| import { ChangeDetectionStrategy, Component, Inject, LOCALE_ID, OnInit } from '@angular/core'; | ||||
| import { map } from 'rxjs/operators'; | ||||
| import { SeoService } from 'src/app/services/seo.service'; | ||||
| import { StateService } from 'src/app/services/state.service'; | ||||
| import { formatNumber } from '@angular/common'; | ||||
| import { Observable } from 'rxjs'; | ||||
| 
 | ||||
| @Component({ | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| <div [class]="widget === false ? 'container-xl' : ''"> | ||||
| <div [class]="widget === false ? 'full-container' : ''"> | ||||
| 
 | ||||
|   <div *ngIf="widget"> | ||||
|     <div class="pool-distribution" *ngIf="(miningStatsObservable$ | async) as miningStats; else loadingReward"> | ||||
| @ -23,14 +23,10 @@ | ||||
|     </div> | ||||
|   </div> | ||||
| 
 | ||||
|   <div [class]="widget ? 'chart-widget' : 'chart'" | ||||
|     echarts [initOpts]="chartInitOptions" [options]="chartOptions" (chartInit)="onChartInit($event)"></div> | ||||
|   <div class="text-center loadingGraphs" *ngIf="isLoading"> | ||||
|     <div class="spinner-border text-light"></div> | ||||
|   </div> | ||||
| 
 | ||||
|   <div class="card-header mb-0 mb-lg-4 mt-md-3" [style]="widget ? 'display:none' : ''"> | ||||
|     <form [formGroup]="radioGroupForm" class="formRadioGroup" *ngIf="(miningStatsObservable$ | async) as miningStats"> | ||||
|   <div class="card-header" *ngIf="!widget"> | ||||
|     <span i18n="mining.mining-pool-share">Mining pools share</span> | ||||
|     <form [formGroup]="radioGroupForm" class="formRadioGroup" | ||||
|       *ngIf="!widget && (miningStatsObservable$ | async) as miningStats"> | ||||
|       <div class="btn-group btn-group-toggle" ngbRadioGroup name="radioBasic" formControlName="dateSpan"> | ||||
|         <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="miningStats.availableTimespanDay >= 1"> | ||||
|           <input ngbButton type="radio" [value]="'24h'" fragment="24h"> 24h | ||||
| @ -66,6 +62,13 @@ | ||||
|     </form> | ||||
|   </div> | ||||
| 
 | ||||
|   <div [class]="!widget ? 'bottom-padding' : 'pb-0'" class="container pb-lg-0"> | ||||
|     <div [class]="widget ? 'chart-widget' : 'chart'" echarts [initOpts]="chartInitOptions" [options]="chartOptions" | ||||
|       (chartInit)="onChartInit($event)"></div> | ||||
|     <div class="text-center loadingGraphs" *ngIf="isLoading"> | ||||
|       <div class="spinner-border text-light"></div> | ||||
|     </div> | ||||
| 
 | ||||
|     <table *ngIf="widget === false" class="table table-borderless text-center pools-table"> | ||||
|       <thead> | ||||
|         <tr> | ||||
| @ -80,9 +83,11 @@ | ||||
|       <tbody *ngIf="(miningStatsObservable$ | async) as miningStats"> | ||||
|         <tr *ngFor="let pool of miningStats.pools"> | ||||
|           <td class="d-none d-md-block">{{ pool.rank }}</td> | ||||
|         <td class="text-right"><img width="25" height="25" src="{{ pool.logo }}" onError="this.src = './resources/mining-pools/default.svg'"></td> | ||||
|           <td class="text-right"><img width="25" height="25" src="{{ pool.logo }}" | ||||
|               onError="this.src = './resources/mining-pools/default.svg'"></td> | ||||
|           <td class=""><a [routerLink]="[('/mining/pool/' + pool.poolId) | relativeUrl]">{{ pool.name }}</a></td> | ||||
|         <td class="" *ngIf="this.poolsWindowPreference === '24h' && !isLoading">{{ pool.lastEstimatedHashrate }} {{ miningStats.miningUnits.hashrateUnit }}</td> | ||||
|           <td class="" *ngIf="this.poolsWindowPreference === '24h' && !isLoading">{{ pool.lastEstimatedHashrate }} {{ | ||||
|             miningStats.miningUnits.hashrateUnit }}</td> | ||||
|           <td class="">{{ pool['blockText'] }}</td> | ||||
|           <td class="d-none d-md-block">{{ pool.emptyBlocks }} ({{ pool.emptyBlockRatio }}%)</td> | ||||
|         </tr> | ||||
| @ -90,12 +95,15 @@ | ||||
|           <td class="d-none d-md-block"></td> | ||||
|           <td class="text-right"></td> | ||||
|           <td class="" i18n="mining.all-miners"><b>All miners</b></td> | ||||
|         <td class="" *ngIf="this.poolsWindowPreference === '24h'"><b>{{ miningStats.lastEstimatedHashrate}} {{ miningStats.miningUnits.hashrateUnit }}</b></td> | ||||
|           <td class="" *ngIf="this.poolsWindowPreference === '24h'"><b>{{ miningStats.lastEstimatedHashrate}} {{ | ||||
|               miningStats.miningUnits.hashrateUnit }}</b></td> | ||||
|           <td class=""><b>{{ miningStats.blockCount }}</b></td> | ||||
|         <td class="d-none d-md-block"><b>{{ miningStats.totalEmptyBlock }} ({{ miningStats.totalEmptyBlockRatio }}%)</b></td> | ||||
|           <td class="d-none d-md-block"><b>{{ miningStats.totalEmptyBlock }} ({{ miningStats.totalEmptyBlockRatio | ||||
|               }}%)</b></td> | ||||
|         </tr> | ||||
|       </tbody> | ||||
|     </table> | ||||
|   </div> | ||||
| 
 | ||||
| </div> | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,27 @@ | ||||
| .card-header { | ||||
|   border-bottom: 0; | ||||
|   font-size: 18px; | ||||
|   @media (min-width: 465px) { | ||||
|     font-size: 20px; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| .full-container { | ||||
|   padding: 0px 15px; | ||||
|   width: 100%; | ||||
|   height: calc(100% - 140px); | ||||
|   @media (max-width: 992px) { | ||||
|     height: calc(100% - 190px); | ||||
|   }; | ||||
|   @media (max-width: 575px) { | ||||
|     height: calc(100% - 230px); | ||||
|   }; | ||||
| } | ||||
| 
 | ||||
| .chart { | ||||
|   max-height: 400px; | ||||
|   @media (max-width: 767.98px) { | ||||
|     max-height: 270px; | ||||
|     max-height: 230px; | ||||
|   } | ||||
| } | ||||
| .chart-widget { | ||||
| @ -17,10 +37,17 @@ | ||||
|   margin-top: 6px; | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
|   @media (min-width: 1130px) { | ||||
|     position: relative; | ||||
|     top: -65px; | ||||
|   } | ||||
|   @media (min-width: 830px) and (max-width: 1130px) { | ||||
|     position: relative; | ||||
|     top: 0px; | ||||
|   } | ||||
|   @media (min-width: 830px) { | ||||
|     margin-left: 2%; | ||||
|     flex-direction: row; | ||||
|     float: left; | ||||
|     float: right; | ||||
|     margin-top: 0px; | ||||
|   } | ||||
|   .btn-sm { | ||||
| @ -31,12 +58,21 @@ | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| .bottom-padding { | ||||
|   @media (max-width: 992px) { | ||||
|     padding-bottom: 65px | ||||
|   }; | ||||
|   @media (max-width: 576px) { | ||||
|     padding-bottom: 65px | ||||
|   }; | ||||
| } | ||||
| 
 | ||||
| @media (max-width: 767.98px) { | ||||
|   .pools-table th, | ||||
|   .pools-table td { | ||||
|     padding: .3em !important; | ||||
|   } | ||||
|  } | ||||
| } | ||||
| 
 | ||||
| .loadingGraphs { | ||||
|   position: absolute; | ||||
| @ -44,9 +80,6 @@ | ||||
|   left: calc(50% - 15px); | ||||
|   z-index: 100; | ||||
| } | ||||
| .loadingGraphs.widget { | ||||
|   top: 25%; | ||||
| } | ||||
| 
 | ||||
| .pool-distribution { | ||||
|   min-height: 56px; | ||||
|  | ||||
| @ -117,7 +117,7 @@ export class PoolRankingComponent implements OnInit { | ||||
|     if (this.isMobile() && this.widget) { | ||||
|       edgeDistance = 0; | ||||
|     } else if (this.isMobile() && !this.widget || this.widget) { | ||||
|       edgeDistance = 35; | ||||
|       edgeDistance = 10; | ||||
|     } | ||||
| 
 | ||||
|     miningStats.pools.forEach((pool) => { | ||||
| @ -209,13 +209,13 @@ export class PoolRankingComponent implements OnInit { | ||||
|     network = network.charAt(0).toUpperCase() + network.slice(1); | ||||
| 
 | ||||
|     let radius: any[] = ['20%', '80%']; | ||||
|     let top: any = undefined; let bottom = undefined; let height = undefined; | ||||
|     let top: number = 0; let height = undefined; | ||||
|     if (this.isMobile() && this.widget) { | ||||
|       top = -30; | ||||
|       height = 270; | ||||
|       radius = ['10%', '50%']; | ||||
|     } else if (this.isMobile() && !this.widget) { | ||||
|       top = 0; | ||||
|       top = -40; | ||||
|       height = 300; | ||||
|       radius = ['10%', '50%']; | ||||
|     } else if (this.widget) { | ||||
| @ -223,22 +223,12 @@ export class PoolRankingComponent implements OnInit { | ||||
|       top = -20; | ||||
|       height = 330; | ||||
|     } else { | ||||
|       top = 35; | ||||
|       top = 0; | ||||
|     } | ||||
| 
 | ||||
|     this.chartOptions = { | ||||
|       animation: false, | ||||
|       color: chartColors, | ||||
|       title: { | ||||
|         text: this.widget ? '' : $localize`:@@mining.pool-chart-title:${network}:NETWORK: mining pools share`, | ||||
|         left: 'center', | ||||
|         textStyle: { | ||||
|           color: '#FFF', | ||||
|         }, | ||||
|         subtextStyle: { | ||||
|           color: '#CCC', | ||||
|           fontStyle: 'italic', | ||||
|         } | ||||
|       }, | ||||
|       tooltip: { | ||||
|         trigger: 'item', | ||||
|         textStyle: { | ||||
| @ -249,7 +239,6 @@ export class PoolRankingComponent implements OnInit { | ||||
|         { | ||||
|           minShowLabelAngle: 3.6, | ||||
|           top: top, | ||||
|           bottom: bottom, | ||||
|           height: height, | ||||
|           name: 'Mining pool', | ||||
|           type: 'pie', | ||||
|  | ||||
| @ -1,5 +1,4 @@ | ||||
| import { Component, ElementRef, HostListener, OnInit, ViewChild } from '@angular/core'; | ||||
| import { WebsocketService } from 'src/app/services/websocket.service'; | ||||
| import { StateService } from 'src/app/services/state.service'; | ||||
| import { specialBlocks } from 'src/app/app.constants'; | ||||
| 
 | ||||
| @ -20,12 +19,10 @@ export class StartComponent implements OnInit { | ||||
|   @ViewChild('blockchainContainer') blockchainContainer: ElementRef; | ||||
| 
 | ||||
|   constructor( | ||||
|     private websocketService: WebsocketService, | ||||
|     private stateService: StateService, | ||||
|   ) { } | ||||
| 
 | ||||
|   ngOnInit() { | ||||
|     this.websocketService.want(['blocks', 'stats', 'mempool-blocks']); | ||||
|     this.stateService.blocks$ | ||||
|       .subscribe((blocks: any) => { | ||||
|         if (this.stateService.network !== '') { | ||||
|  | ||||
| @ -40,6 +40,14 @@ | ||||
|   margin-top: 6px; | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
|   @media (min-width: 1130px) { | ||||
|     position: relative; | ||||
|     top: -65px; | ||||
|   } | ||||
|   @media (min-width: 830px) and (max-width: 1130px) { | ||||
|     position: relative; | ||||
|     top: 0px; | ||||
|   } | ||||
|   @media (min-width: 830px) { | ||||
|     flex-direction: row; | ||||
|     float: right; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user