Skip to content

Instantly share code, notes, and snippets.

@llucasshenrique
Created February 16, 2018 00:16
Show Gist options
  • Save llucasshenrique/dcc83791a9f4fbe91d5d0db29e9ead3e to your computer and use it in GitHub Desktop.
Save llucasshenrique/dcc83791a9f4fbe91d5d0db29e9ead3e to your computer and use it in GitHub Desktop.
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