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