// License: LGPL-3.0-or-later const request = require('../common/client') const R = require('ramda') const Chart = require('chart.js') const moment = require('moment') const dateRange = require('../components/date-range') const chartOptions = require('../components/chart-options') var url = `/nonprofits/${app.nonprofit_id}/campaigns/${ENV.campaignID}/timeline` function query() { appl.def('loading_chart', true) request.get(url) .end(function(err, resp) { appl.def('loading_chart', false) var ctx = document.getElementById('js-timeline').getContext('2d') new Chart(ctx, { type: 'line' , data: formatData(cumulative(resp.body)) , options: chartOptions.dollars }) }) } function cumulative(data) { var moments = dateRange(R.head(data).date, R.last(data).date, 'days') var dateStrings = R.map((m) => m.format('YYYY-MM-DD'), moments) var proto = { offsite_cents: 0 , onetime_cents: 0 , recurring_cents: 0 , total_cents: 0 } var dateDictionary = R.reduce((a,b) => { a[b] = R.merge(proto, {date: b}) return a }, {}, dateStrings) R.reduce((a, b) => { a[b.date] = b return a }, dateDictionary, data) return R.tail(R.reduce((a, b) => { var last = R.last(a) b.offsite_cents += last.offsite_cents b.onetime_cents += last.onetime_cents b.recurring_cents += last.recurring_cents b.total_cents += last.total_cents return R.append(b, a) }, [proto], R.values(dateDictionary))) } function formatData(data) { return { labels: R.map((st) => moment(st).format('M/D/YYYY'), R.pluck('date', data)) , datasets: [ dataset('Total' , 'total_cents' , '190, 190, 190' , data) , dataset('One time' , 'onetime_cents' , '66, 179, 223' , data) , dataset('Recurring' , 'recurring_cents' , '240, 205, 108' , data) , dataset('Offsite' , 'offsite_cents' , '95, 184, 141' , data) ] } } function dataset(label, key, rgb, data) { return { label: label , data: R.pluck(key, data) , borderColor: `rgb(${rgb})` , backgroundColor: `rgba(${rgb},0.2)` , fill: false , pointRadius: 0 , pointHitRadius: 2 } } query()