| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- 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`
- })
- }
- }
- })
|