Created
February 16, 2018 00:16
-
-
Save llucasshenrique/dcc83791a9f4fbe91d5d0db29e9ead3e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import * as moment from 'moment'; | |
import { Injectable } from '@angular/core'; | |
import { isArray } from 'ionic-angular/util/util'; | |
import { ReplaySubject, Observable } from 'rxjs'; | |
import { ChartData, ChartDataSets } from 'chart.js'; | |
import { Profile } from './../../models/profile/profile'; | |
import { Report } from './../../models/report/report'; | |
import { ReportProvider } from './../report/report'; | |
import { ProfileProvider } from './../profile/profile'; | |
@Injectable() | |
export class ChartsProvider { | |
private activeProfile: Profile | |
private _chartData: ReplaySubject<any> = new ReplaySubject<any>(1) | |
private _profileResume: ReplaySubject<any> = new ReplaySubject<any>(1) | |
constructor( | |
private profileProvider: ProfileProvider, | |
private reportProvider: ReportProvider | |
) { | |
let data = profileProvider.activeProfile() | |
.do(next => this.activeProfile = next ) | |
.switchMap(_data => this.reportProvider.allFor(_data)) | |
data.map(_data => this.linePerDay(_data)) | |
.subscribe(_data => { | |
this._chartData.next(_data) | |
}) | |
} | |
private linePerDay(reports: Report[]) { | |
const complete: any = {} | |
let indexator = (x: Report) => x.values.date | |
let selectedItem = (x: Report) => x.values.triggers.map(x => x.name) | |
let _label: any[] = reports.map( x => indexator(x)) | |
.filter((item, index, array) => array.indexOf(item) == index) | |
.map(x => moment(x).format("DD/MM YY") ) | |
let _dataset: any[] = this.prepareDataset(reports) | |
complete.labels = _label | |
complete.datasets = _dataset | |
return complete | |
} | |
private prepareDataset(reports: Report[]) { | |
const sortedReports = reports.sort((left, right) => { | |
return moment.utc(left.values.date).diff(moment.utc(right.values.date)) | |
}) | |
let dataset: ChartDataSets[] = [] | |
let perDay: Object = this.reportsPerDay(sortedReports) | |
let newData: any[] = Array() | |
for (const key in perDay) { | |
if (perDay.hasOwnProperty(key)) { | |
const element = perDay[key]; | |
newData.push(element) | |
} | |
} | |
dataset.push({ | |
data: newData, | |
label: 'Casos diários', | |
borderColor: `rgba(${this.rgbaCode()},${this.rgbaCode()},${this.rgbaCode()},${this.rgbaCode()})`, | |
fill: false | |
}) | |
return dataset | |
} | |
private reportsPerDay(reports: Report[]): Object { | |
let _data = reports.map(report => report.values.date) | |
.reduce((count, cur) => { | |
count[cur] = ++count[cur] || 1 | |
return count | |
}, {}) | |
return _data | |
} | |
public lineChart(): Observable<any> { | |
return new Observable((subject) => { | |
this._chartData.subscribe((next) => { | |
subject.next(next) | |
}, (err) => { | |
subject.error(err) | |
}, () => { | |
subject.complete() | |
}) | |
}) | |
} | |
public profileResume(): Observable<any[]> { | |
return new Observable((subject) => { | |
this._profileResume.subscribe((next: any[]) => { | |
subject.next(next) | |
}, (err) => { | |
subject.error(err) | |
}, () => { | |
subject.complete() | |
}) | |
}) | |
} | |
private rgbaCode() { | |
return Math.floor(Math.random() * (1 - 255 + 1)) + 255; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment