const _ = require('lodash') const app = require('../app') function trim (str) { return str.replace(/^\s+|\s+$/gm,''); } function rgbaToHex (rgba) { const parts = rgba.substring(rgba.indexOf("(")).split(","), r = parseInt(trim(parts[0].substring(1)), 10), g = parseInt(trim(parts[1]), 10), b = parseInt(trim(parts[2]), 10), a = parseFloat(trim(parts[3].substring(0, parts[3].length - 1))).toFixed(2) return ('#' + r.toString(16).padStart(2, 0) + g.toString(16).padStart(2, 0) + b.toString(16).padStart(2, 0)) } app.service('statistics', function(api, $mdColors) { window.$mdColors = $mdColors const colors = [ rgbaToHex($mdColors.getThemeColor('blue')), rgbaToHex($mdColors.getThemeColor('red')), rgbaToHex($mdColors.getThemeColor('amber')), rgbaToHex($mdColors.getThemeColor('teal')), rgbaToHex($mdColors.getThemeColor('deep-orange')), rgbaToHex($mdColors.getThemeColor('cyan')), rgbaToHex($mdColors.getThemeColor('purple')), rgbaToHex($mdColors.getThemeColor('lime')), rgbaToHex($mdColors.getThemeColor('indigo')), rgbaToHex($mdColors.getThemeColor('pink')) ] const chart = ({ rows, seriesField, dataField, labelsField, format }) => { const labels = _.chain(rows).map(x => x[labelsField]).uniq().value() const series = _.chain(rows).map(x => x[seriesField]).uniq().value() const seriesData = _.chain(rows) .groupBy(x => x[seriesField]) .toPairs() .map(([key, rows]) => [ key, _.chain(rows) .map(row => [row[labelsField], row[dataField]]) .fromPairs() .value() ]) .fromPairs() .value() const data = series.map(s => { const sdata = seriesData[s] return labels.map(l => sdata[l]) }) return { labels, series, data, colors: colors.slice(0, series.length), options: { tooltips: { callbacks: { label: (tooltipItem, data) => { const label = data.datasets[tooltipItem.datasetIndex].label || '' const value = tooltipItem.yLabel return format ? format(label, value) : `${label}: ${value}` } } } } } } this.charts = (rows) => { return { delivery: chart({ rows, seriesField: 'key', dataField: 'delivered', labelsField: 'date', format: (label, value) => `${label}: ${value.toLocaleString()} cartons` }), costPerCarton: chart({ rows, seriesField: 'key', dataField: 'costPerCarton', labelsField: 'date', format: (label, value) => `${label}: $${value.toFixed(2)} per carton` }), laborCost: chart({ rows, seriesField: 'key', dataField: 'laborCost', labelsField: 'date', format: (label, value) => `${label}: $${value.toFixed(2)} labor cost` }) } } this.chart = chart })