13 changed files with 228 additions and 15 deletions
			
			
		| @ -1,2 +1,3 @@ | |||||
| <p>dashboard works!</p> |  | ||||
| {{day}} |  | ||||
|  | <div class="dashboard-container"> | ||||
|  |   <app-graph [data]="data"></app-graph> | ||||
|  | </div> | ||||
|  | |||||
| @ -1,18 +1,37 @@ | |||||
| import { Component, OnInit, Input } from '@angular/core' |  | ||||
|  | import { Component, OnInit, Input, ViewEncapsulation } from '@angular/core' | ||||
|  | import { StationService } from '../station.service' | ||||
|  | import { environment } from '../../environments/environment' | ||||
| 
 | 
 | ||||
| @Component({ | @Component({ | ||||
|   selector: 'app-dashboard', |   selector: 'app-dashboard', | ||||
|   templateUrl: './dashboard.component.html', |   templateUrl: './dashboard.component.html', | ||||
|   styleUrls: ['./dashboard.component.scss'] |  | ||||
|  |   styleUrls: ['./dashboard.component.scss'], | ||||
|  |   encapsulation: ViewEncapsulation.None | ||||
| }) | }) | ||||
| 
 | 
 | ||||
| export class DashboardComponent implements OnInit { | export class DashboardComponent implements OnInit { | ||||
| 
 | 
 | ||||
|   @Input() day: string = '' |   @Input() day: string = '' | ||||
|  |   public data: any = [] | ||||
| 
 | 
 | ||||
|   constructor() { } |  | ||||
|  |   constructor( | ||||
|  |     private stationService: StationService | ||||
|  |   ) { } | ||||
| 
 | 
 | ||||
|   ngOnInit(): void { |   ngOnInit(): void { | ||||
|  |     if(this.day) this.getData() | ||||
|   } |   } | ||||
| 
 | 
 | ||||
|  |   getData(): void { | ||||
|  |     this.stationService.getData(this.day).toPromise().then( (data) => { | ||||
|  |       console.log(data) | ||||
|  |       this.data = data.items | ||||
|  |     },(error) => { | ||||
|  |       console.error(error) | ||||
|  |     }).catch((e) => { | ||||
|  |       console.error(e) | ||||
|  |     }) | ||||
|  |   } | ||||
|  | 
 | ||||
|  | 
 | ||||
| } | } | ||||
|  | |||||
| @ -1 +1,6 @@ | |||||
| <p>graph works!</p> |  | ||||
|  | <div class="graph"> | ||||
|  |   <div class="canvas-container"> | ||||
|  |     <div echarts class="canvas" [options]="graph.options" (chartInit)="onChartInit($event, graph)"></div> | ||||
|  |     <div class="canvas-loader" *ngIf="graph.loading"><div class="spinner"></div></div> | ||||
|  |   </div> | ||||
|  | </div> | ||||
|  | |||||
| @ -0,0 +1,76 @@ | |||||
|  | @import "../../assets/scss/variables"; | ||||
|  | 
 | ||||
|  | .graph { | ||||
|  |   position: relative; | ||||
|  |   display: block; | ||||
|  |   background: $white; | ||||
|  |   border-radius: 3px; | ||||
|  |   padding: 0px; | ||||
|  |   width: 100%; | ||||
|  |   height: calc(100vh - $header-height-mobile); | ||||
|  |   @media (min-width: map-get($grid-breakpoints, 'md')) { | ||||
|  |     height: calc(100vh - $header-height-mobile); | ||||
|  |   } | ||||
|  | 
 | ||||
|  |   .canvas-container { | ||||
|  |     position: relative; | ||||
|  |     display: block; | ||||
|  |     border-radius: 3px; | ||||
|  |     padding: 0px; | ||||
|  |     height: calc(100vh - $header-height-mobile); | ||||
|  |     @media (min-width: map-get($grid-breakpoints, 'md')) { | ||||
|  |       height: calc(100vh - $header-height-mobile); | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     .canvas-loader { | ||||
|  |       position: absolute; | ||||
|  |       top: 0; | ||||
|  |       left: 0; | ||||
|  |       border-radius: 3px; | ||||
|  |       background: $white; | ||||
|  |       margin-top: 0; | ||||
|  |       width: 100%; | ||||
|  |       height: 630px; | ||||
|  |       z-index: 1; | ||||
|  | 
 | ||||
|  |       >.spinner { | ||||
|  |         position: absolute; | ||||
|  |         top: calc(50% - 30px); | ||||
|  |         left: calc(50% - 30px); | ||||
|  |         border-radius: 50%; | ||||
|  |         width: 100px; | ||||
|  |         height: 100px; | ||||
|  |         border-top: 15px solid $black-alpha; | ||||
|  |         border-right: 15px solid $black-alpha; | ||||
|  |         border-bottom: 15px solid $black-alpha; | ||||
|  |         border-left: 15px solid $white; | ||||
|  |         animation: graphLoader 1s infinite linear; | ||||
|  |         &:after { | ||||
|  |           border-radius: 50%; | ||||
|  |           width: 100px; | ||||
|  |           height: 100px; | ||||
|  |         } | ||||
|  |       } | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     .canvas { | ||||
|  |       position: relative; | ||||
|  |       display: block; | ||||
|  |       border-radius: 3px; | ||||
|  |       padding: 0px; | ||||
|  |       height: calc(100vh - $header-height-mobile); | ||||
|  |       @media (min-width: map-get($grid-breakpoints, 'md')) { | ||||
|  |         height: calc(100vh - $header-height-mobile); | ||||
|  |       } | ||||
|  | 
 | ||||
|  |     } | ||||
|  |   } | ||||
|  | } | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | @keyframes graphLoader { | ||||
|  |   0% { transform: rotate(0deg); } | ||||
|  |   100% { transform: rotate(360deg); } | ||||
|  | } | ||||
| @ -1,15 +1,95 @@ | |||||
| import { Component, OnInit } from '@angular/core'; |  | ||||
|  | import { Component, OnInit, Input, SimpleChanges } from '@angular/core' | ||||
|  | import { StationService } from '../station.service' | ||||
|  | import { environment } from '../../environments/environment' | ||||
|  | 
 | ||||
|  | import { EChartsOption, graphic } from 'echarts' | ||||
| 
 | 
 | ||||
| @Component({ | @Component({ | ||||
|   selector: 'app-graph', |   selector: 'app-graph', | ||||
|   templateUrl: './graph.component.html', |   templateUrl: './graph.component.html', | ||||
|   styleUrls: ['./graph.component.scss'] |   styleUrls: ['./graph.component.scss'] | ||||
| }) | }) | ||||
|  | 
 | ||||
| export class GraphComponent implements OnInit { | export class GraphComponent implements OnInit { | ||||
| 
 | 
 | ||||
|   constructor() { } |  | ||||
|  |   @Input() data: any = [] | ||||
|  | 
 | ||||
|  |   public graph: any = {} | ||||
|  |   public directions: any = ['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW'] | ||||
|  |   public dirArrows: any = ['\u2B07', '\u2B0B', '\u2B05', '\u2B09', '\u2B06', '\u2B08', '\u27A1', '\u2B0A'] | ||||
|  | 
 | ||||
|  |   constructor( | ||||
|  |     private stationService: StationService | ||||
|  |   ) { } | ||||
| 
 | 
 | ||||
|   ngOnInit(): void { |   ngOnInit(): void { | ||||
|  |     //this.loadGraphs()
 | ||||
|  |   } | ||||
|  | 
 | ||||
|  |   ngOnChanges(changes: SimpleChanges): void { | ||||
|  |     if(changes['data'] && changes['data'].currentValue) { | ||||
|  |       this.data = changes['data'].currentValue | ||||
|  |       this.loadGraphs() | ||||
|  |     } | ||||
|  |   } | ||||
|  | 
 | ||||
|  | 
 | ||||
|  |   loadGraphs():void { | ||||
|  |     this.graph.loading = true | ||||
|  | 
 | ||||
|  |     let xAxis:any = [] | ||||
|  |     let yAxis:any = [] | ||||
|  |     let yAxis2:any = [] | ||||
|  |     this.data.forEach( (item:any) => { | ||||
|  |       xAxis.push(item.date.substring(11,16)) | ||||
|  |       yAxis.push(item.speed) | ||||
|  |       yAxis2.push(item.temperature) | ||||
|  |     }) | ||||
|  | 
 | ||||
|  |     this.graph.options = { | ||||
|  |       color: ['#FFBF00', '#00DDFF', '#FFBF00', '#37A2FF', '#FF0087'], | ||||
|  |       tooltip: { | ||||
|  |         trigger: 'item', | ||||
|  |         //axisPointer: { type: 'cross', axis:'y', label: false},
 | ||||
|  |         formatter: (params: any) => { | ||||
|  |           const data = this.data[params.dataIndex] | ||||
|  |           return `<div class="tooltip">
 | ||||
|  |                   <span class="title">${data.date.substring(11)}</span> | ||||
|  |                   <span class="item"><b>Vento:</b> ${data.speed} Km/h ${this.dirArrows[data.direction]} ${this.directions[data.direction]}</span> | ||||
|  |                   <span class="item"><b>Temperatura:</b> ${data.temperature} °C</span> | ||||
|  |                   <span class="item"><b>Pressione:</b> ${data.pressure} hpa</span> | ||||
|  |                   <span class="item"><b>Umidità:</b> ${data.humidity} %</span>`/* : null*/
 | ||||
|  |         } | ||||
|  |       }, | ||||
|  |       grid: {left: 0, right: 0, containLabel: true }, | ||||
|  |       legend: { data: ['Speed', 'Dir', 'Temp', 'Press', 'Umid'] }, | ||||
|  |       xAxis: { type: 'category', boundaryGap: true, axisTick: true, data: xAxis }, | ||||
|  |       yAxis: [{ type: 'value', show: false }], | ||||
|  |       series: [ | ||||
|  |         { name: 'temp', type: 'line', data: yAxis2, yAxisIndex: 0, smooth: true, stack: 'Total', | ||||
|  |           areaStyle: {}, lineStyle: { width: 0 }, | ||||
|  |           label: { show: false, position: 'top', formatter: (d: any) => { | ||||
|  |             const temp = this.data[d.dataIndex].temperature | ||||
|  |             return `${temp} °C` | ||||
|  |           }} | ||||
|  | 
 | ||||
|  |         }, | ||||
|  |         { name: 'speed', type: 'line', data: yAxis, yAxisIndex: 0, smooth: true, stack: 'Total', | ||||
|  |           areaStyle: {}, | ||||
|  |           label: { show: true, position: 'top', formatter: (d: any) => { | ||||
|  |             const speed = this.data[d.dataIndex].speed | ||||
|  |             const dir = this.data[d.dataIndex].direction | ||||
|  |             return `${this.dirArrows[dir]} ${speed} km/h` | ||||
|  |           }} | ||||
|  |         } | ||||
|  |       ] | ||||
|  |     } | ||||
|  | 
 | ||||
|  | 
 | ||||
|  |   } | ||||
|  | 
 | ||||
|  |   onChartInit(event: any, graph: any): void { | ||||
|  |     graph.loading = false | ||||
|   } |   } | ||||
| 
 | 
 | ||||
| } | } | ||||
|  | |||||
| @ -1,4 +1,4 @@ | |||||
| export const environment = { | export const environment = { | ||||
|   production: true, |   production: true, | ||||
|   REST_API: 'http://2.233.91.82/weather/api/' |  | ||||
|  |   API_URL: 'http://2.233.91.82/weather/api/' | ||||
| } | } | ||||
|  | |||||
| @ -1,4 +1,4 @@ | |||||
| export const environment = { | export const environment = { | ||||
|   production: false, |   production: false, | ||||
|   REST_API: 'http://weatherapi.local' |  | ||||
|  |   API_URL: 'http://weatherapi.local' | ||||
| } | } | ||||
|  | |||||
					Loading…
					
					
				
		Reference in new issue