module Repor
module Serializers
class HighchartsSerializer < TableSerializer
def color_for(dimension, value)
# override this if the values of a particular dimension can take on
# meaningful colors
end
def series
case report.groupers.count
when 3
dim1, dim2, dim3 = report.groupers
report.data.flat_map.with_index do |d3, i|
d3[:values].map { |d2| {
stack: human_dimension_value_label(dim3, d3[:key]),
name: human_dimension_value_label(dim2, d2[:key]),
(i == 0 ? :id : :linkedTo) => human_dimension_value_label(dim2, d2[:key]),
color: color_for(dim2, d2[:key]),
data: d2[:values].map { |d1| {
y: d1[:value].to_f,
tooltip: tooltip_for(dim1 => d1, dim2 => d2, dim3 => d3),
filters: filters_for(dim1 => d1, dim2 => d2, dim3 => d3)
}}
}}
end
when 2
dim1, dim2 = report.groupers
report.data.map { |d2| {
name: human_dimension_value_label(dim2, d2[:key]),
color: color_for(dim2, d2[:key]),
data: d2[:values].map { |d1| {
y: d1[:value].to_f,
tooltip: tooltip_for(dim1 => d1, dim2 => d2),
filters: filters_for(dim1 => d1, dim2 => d2)
}}
}}
when 1
dim1 = report.groupers.first
[{
name: human_aggregator_label(report.aggregator),
data: report.data.map { |d1| {
y: d1[:value].to_f,
tooltip: tooltip_for(dim1 => d1),
filters: filters_for(dim1 => d1)
}}
}]
else
raise Repor::InvalidParamsError, "report must have <= 3 groupers"
end
end
def tooltip_for(xes)
lines = []
xes.each do |dim, d|
lines << [
human_dimension_label(dim),
human_dimension_value_label(dim, d[:key])
]
end
lines << [
human_aggregator_label(report.aggregator),
human_aggregator_value_label(report.aggregator, xes[report.groupers.first][:value])
]
lines.map { |k, v| "#{k}: #{v}" }.join('
')
end
def filters_for(xes)
xes.each_with_object({}) do |(dim, d), h|
h[dim.name] = d[:key]
end
end
def categories
dimension = report.groupers.first
dimension.group_values.map do |value|
human_dimension_value_label(dimension, value)
end
end
def chart_title
axis_summary
end
def chart_subtitle
filter_summary
end
def x_axis_title
human_dimension_label(report.groupers.first)
end
def y_axis_title
human_aggregator_label(report.aggregator)
end
def highcharts_options
{
chart: {
type: 'column'
},
title: {
text: chart_title
},
subtitle: {
text: chart_subtitle
},
series: series,
xAxis: {
categories: categories,
title: {
text: x_axis_title
}
},
yAxis: {
allowDecimals: true,
title: {
text: y_axis_title
},
stackLabels: {
enabled: report.groupers.length >= 3,
format: '{stack}',
rotation: -45,
textAlign: 'left'
}
},
legend: {
enabled: report.groupers.length >= 2
},
tooltip: {},
plotOptions: {
series: {
events: {}
},
column: {
stacking: ('normal' if report.groupers.length >= 2)
}
}
}
end
end
end
end