diff --git a/app/assets/javascripts/rfc_activity_history.js b/app/assets/javascripts/rfc_activity_history.js new file mode 100644 index 00000000..e3b6e7b5 --- /dev/null +++ b/app/assets/javascripts/rfc_activity_history.js @@ -0,0 +1,77 @@ +$(document).ready(function () { + var containerId = 'rfc-activity-history'; + + if ($.isController('statistics') && $('.graph#' + containerId).isPresent()) { + + var chartData; + var dataset; + var graph; + var groups; + + var params = new URLSearchParams(window.location.search.slice(1)); + + var buildChartGroups = function() { + return _.map(chartData, function(element) { + return { + content: element.name, + id: element.key, + visible: true, + options: { + interpolation: false + } + }; + }); + }; + + var initializeChart = function() { + dataset = new vis.DataSet(); + groups = new vis.DataSet(buildChartGroups()); + graph = new vis.Graph2d(document.getElementById(containerId), dataset, groups, { + dataAxis: { + customRange: { + left: { + min: 0 + } + }, + showMinorLabels: true + }, + drawPoints: { + style: 'circle' + }, + legend: true, + start: params.get('from'), + end: params.get('to') + }); + }; + + var refreshData = function(callback) { + var jqxhr = $.ajax('rfc-activity-history.json', { + dataType: 'json', + data: {from: params.get('from'), to: params.get('to'), interval: params.get('interval')}, + method: 'GET' + }); + jqxhr.done(function(response) { + (callback || _.noop)(response); + updateChartData(response); + }); + }; + + var updateChartData = function(response) { + _.each(response, function(group) { + _.each(group.data, function(data) { + dataset.add({ + group: group.key, + x: data.key, + y: data.value + }); + }); + }); + }; + + refreshData(function (data) { + chartData = data; + $('#' + containerId).parent().find('.spinner').hide(); + initializeChart(); + }); + } +}); diff --git a/app/controllers/statistics_controller.rb b/app/controllers/statistics_controller.rb index aafa6cd8..0c60b697 100644 --- a/app/controllers/statistics_controller.rb +++ b/app/controllers/statistics_controller.rb @@ -37,10 +37,10 @@ class StatisticsController < ApplicationController respond_to do |format| format.html { render 'rfc_activity_history' } format.json do - range = params[:range] || 'year' + interval = params[:interval] || 'year' from = DateTime.strptime(params[:from], '%Y') rescue DateTime.new(0) to = DateTime.strptime(params[:to], '%Y') rescue DateTime.now - render(json: ranged_rfc_data(range, from, to)) + render(json: ranged_rfc_data(interval, from, to)) end end end diff --git a/app/helpers/statistics_helper.rb b/app/helpers/statistics_helper.rb index cca3896e..a8bb2ef2 100644 --- a/app/helpers/statistics_helper.rb +++ b/app/helpers/statistics_helper.rb @@ -152,37 +152,37 @@ module StatisticsHelper ] end - def ranged_rfc_data(range='year', from=DateTime.new(0), to=DateTime.now) + def ranged_rfc_data(interval='year', from=DateTime.new(0), to=DateTime.now) [ { key: 'rfcs', name: t('activerecord.models.request_for_comment.other'), data: RequestForComment.in_range(from, to) - .select("date_trunc('#{range}', created_at) AS \"range\", count(id)") - .group('range').order('range') + .select("date_trunc('#{interval}', created_at) AS \"key\", count(id) AS \"value\"") + .group('key').order('key') }, { key: 'rfcs_solved', name: t('statistics.entries.request_for_comments.percent_solved'), data: RequestForComment.in_range(from, to) .where(solved: true) - .select("date_trunc('#{range}', created_at) AS \"range\", count(id)") - .group('range').order('range') + .select("date_trunc('#{interval}', created_at) AS \"key\", count(id) AS \"value\"") + .group('key').order('key') }, { key: 'rfcs_soft_solved', name: t('statistics.entries.request_for_comments.percent_soft_solved'), data: RequestForComment.in_range(from, to).unsolved .where(full_score_reached: true) - .select("date_trunc('#{range}', created_at) AS \"range\", count(id)") - .group('range').order('range') + .select("date_trunc('#{interval}', created_at) AS \"key\", count(id) AS \"value\"") + .group('key').order('key') }, { key: 'rfcs_unsolved', name: t('statistics.entries.request_for_comments.percent_unsolved'), data: RequestForComment.in_range(from, to).unsolved - .select("date_trunc('#{range}', created_at) AS \"range\", count(id)") - .group('range').order('range') + .select("date_trunc('#{interval}', created_at) AS \"key\", count(id) AS \"value\"") + .group('key').order('key') } ] end diff --git a/app/views/statistics/rfc_activity_history.html.slim b/app/views/statistics/rfc_activity_history.html.slim index 914e605b..cda46de2 100644 --- a/app/views/statistics/rfc_activity_history.html.slim +++ b/app/views/statistics/rfc_activity_history.html.slim @@ -6,7 +6,7 @@ .title h1 = t('statistics.graphs.rfc_activity') .spinner - .graph#rfc-activity + .graph#rfc-activity-history form .form-group label for="from-date" = t('.from') @@ -15,8 +15,8 @@ label for="to-date" = t('.to') input type="date" class="form-control" id="to-date" name="to" value=DateTime.now.to_date .form-group - label for="range" = t('.interval') - select class="form-control" id="range" name="range" + label for="interval" = t('.interval') + select class="form-control" id="interval" name="interval" = [:decade, :year, :month, :day, :hour, :minute, :second].each do | key | option selected=(key==:year) = key button type="submit" class="btn btn-primary" = t('.update')