diff --git a/app/assets/javascripts/dashboard_graphs.js b/app/assets/javascripts/dashboard_graphs.js
index b2a1ea9ac..c5c9b6c04 100644
--- a/app/assets/javascripts/dashboard_graphs.js
+++ b/app/assets/javascripts/dashboard_graphs.js
@@ -5,7 +5,7 @@
(function(){
'use strict';
- var ProposalGraph = function(url) {
+ let ProposalGraph = function(url) {
this.url = url;
this.successfulProposalDataUrl = null;
this.proposalAchievementsUrl = null;
@@ -15,12 +15,11 @@
this.progressLabel = 'Progress';
this.supportsLabel = 'Supports';
this.successLabel = 'Success';
- this.chart = null;
this.goals = null;
this.achievements = null;
this.xColumnValues = null;
- this.succesfulColumnValues = null;
this.progressColumnValues = null;
+ this.resourcesUrl = null;
};
ProposalGraph.prototype.refresh = function() {
@@ -33,7 +32,7 @@
ProposalGraph.prototype.refreshGoals = function () {
return $.ajax({
- url: '/dashboard/resources.json',
+ url: this.resourcesUrl,
cache: false,
success: function(data) {
this.parseGoals(data);
@@ -42,7 +41,7 @@
};
ProposalGraph.prototype.parseGoals = function(data) {
- var i, l;
+ let i, l;
this.goals = [];
for (i = 0, l = data.length; i < l; i += 1) {
@@ -67,7 +66,7 @@
};
ProposalGraph.prototype.parseData = function(data) {
- var key;
+ let key;
this.xColumnValues = [ ];
this.progressColumnValues = [ this.progressLabel ];
@@ -94,7 +93,7 @@
};
ProposalGraph.prototype.parseSuccessfulProposalData = function(data) {
- var key;
+ let key;
this.successfulColumnValues = [ this.successLabel ];
@@ -120,7 +119,7 @@
};
ProposalGraph.prototype.parseAchievements = function(data) {
- var group;
+ let group;
this.achievements = [];
for (group in data) {
@@ -128,7 +127,7 @@
this.addXColumnValue(group);
this.achievements.push({
value: group,
- text: data[group][data[group].length - 1].title
+ text: data[group].title
});
}
}
@@ -138,12 +137,12 @@
if (this.xColumnValues.indexOf(value) === -1) {
this.xColumnValues.push(value);
}
- }
+ };
- ProposalGraph.prototype.draw = function(data) {
+ ProposalGraph.prototype.draw = function() {
this.formatXColumnValues();
- this.chart = c3.generate({
+ c3.generate({
bindto: '#' + this.targetId,
data: {
x: 'x',
@@ -176,9 +175,6 @@
y: {
lines: this.goals
}
- //x: {
- // lines: this.achievements
- //}
},
legend: {
position: 'right'
@@ -187,7 +183,7 @@
};
ProposalGraph.prototype.formatXColumnValues = function () {
- var i, l, parts;
+ let i, l, parts;
this.xColumnValues = this.xColumnValues.sort();
@@ -199,7 +195,7 @@
}
this.xColumnValues.unshift('x');
- }
+ };
ProposalGraph.prototype.isDailyGrouped = function() {
return this.groupBy === undefined || this.groupBy === '' || this.groupBy === null
@@ -207,7 +203,7 @@
$(document).ready(function () {
$('[data-proposal-graph-url]').each(function () {
- var graph = new ProposalGraph($(this).data('proposal-graph-url'));
+ let graph = new ProposalGraph($(this).data('proposal-graph-url'));
graph.successfulProposalDataUrl = $(this).data('successful-proposal-graph-url');
graph.proposalAchievementsUrl = $(this).data('proposal-achievements-url');
graph.targetId = $(this).attr('id');
@@ -216,6 +212,7 @@
graph.supportsLabel = $(this).data('proposal-graph-supports-label');
graph.successLabel = $(this).data('proposal-graph-success-label');
graph.proposalSuccess = parseInt($(this).data('proposal-success'), 10);
+ graph.resourcesUrl = $(this).data('proposal-resources-url');
graph.refresh();
});
diff --git a/app/controllers/concerns/dashboard/expects_date_range.rb b/app/controllers/concerns/dashboard/expects_date_range.rb
new file mode 100644
index 000000000..9c0cbb9b3
--- /dev/null
+++ b/app/controllers/concerns/dashboard/expects_date_range.rb
@@ -0,0 +1,15 @@
+module Dashboard::ExpectsDateRange
+ extend ActiveSupport::Concern
+
+ include Dashboard::HasProposal
+
+ def start_date
+ return Date.parse(params[:start_date]) unless params[:start_date].blank?
+ proposal.created_at.to_date
+ end
+
+ def end_date
+ return Date.parse(params[:end_date]) unless params[:end_date].blank?
+ Date.today
+ end
+end
diff --git a/app/controllers/concerns/dashboard/has_proposal.rb b/app/controllers/concerns/dashboard/has_proposal.rb
new file mode 100644
index 000000000..113a8849a
--- /dev/null
+++ b/app/controllers/concerns/dashboard/has_proposal.rb
@@ -0,0 +1,7 @@
+module Dashboard::HasProposal
+ extend ActiveSupport::Concern
+
+ def proposal
+ @proposal ||= Proposal.includes(:community).find(params[:proposal_id])
+ end
+end
diff --git a/app/controllers/dashboard/achievements_controller.rb b/app/controllers/dashboard/achievements_controller.rb
new file mode 100644
index 000000000..fb55f4efe
--- /dev/null
+++ b/app/controllers/dashboard/achievements_controller.rb
@@ -0,0 +1,44 @@
+class Dashboard::AchievementsController < Dashboard::BaseController
+ include Dashboard::ExpectsDateRange
+
+ def index
+ authorize! :dashboard, proposal
+ render json: processed_groups
+ end
+
+ private
+
+ def processed_groups
+ grouped_results = groups
+ grouped_results.each do |key, results|
+ grouped_results[key] = {
+ executed_at: results.last.executed_at,
+ title: results.last.action.title
+ }
+ end
+
+ grouped_results
+ end
+
+ def groups
+ if params[:group_by] == 'week'
+ return executed_proposed_actions.group_by { |v| "#{v.executed_at.to_date.cweek}/#{v.executed_at.to_date.year}"}
+ end
+
+ if params[:group_by] == 'month'
+ return executed_proposed_actions.group_by { |v| "#{v.executed_at.to_date.year}-#{v.executed_at.to_date.month}"}
+ end
+
+ executed_proposed_actions.group_by { |a| a.executed_at.to_date }
+ end
+
+ def executed_proposed_actions
+ @executed_proposed_actions ||= Dashboard::ExecutedAction
+ .joins(:action)
+ .includes(:action)
+ .where(proposal: proposal)
+ .where(executed_at: start_date.beginning_of_day..end_date.end_of_day)
+ .where(dashboard_actions: { action_type: 0 })
+ .order(executed_at: :asc)
+ end
+end
diff --git a/app/controllers/dashboard/base_controller.rb b/app/controllers/dashboard/base_controller.rb
index 260e06de5..2755e74c9 100644
--- a/app/controllers/dashboard/base_controller.rb
+++ b/app/controllers/dashboard/base_controller.rb
@@ -1,6 +1,8 @@
class Dashboard::BaseController < ApplicationController
before_action :authenticate_user!
+ include Dashboard::HasProposal
+
helper_method :proposal, :proposed_actions, :resource, :resources, :next_goal, :next_goal_supports, :next_goal_progress, :community_members_count
respond_to :html
@@ -8,10 +10,6 @@ class Dashboard::BaseController < ApplicationController
private
- def proposal
- @proposal ||= Proposal.includes(:community).find(params[:proposal_id])
- end
-
def proposed_actions
@proposed_actions ||= Dashboard::Action.proposed_actions.active_for(proposal).order(order: :asc)
end
diff --git a/app/controllers/dashboard/successful_supports_controller.rb b/app/controllers/dashboard/successful_supports_controller.rb
new file mode 100644
index 000000000..69740e548
--- /dev/null
+++ b/app/controllers/dashboard/successful_supports_controller.rb
@@ -0,0 +1,58 @@
+class Dashboard::SuccessfulSupportsController < Dashboard::BaseController
+ include Dashboard::ExpectsDateRange
+
+ def index
+ authorize! :dashboard, proposal
+ render json: accumulated_grouped_supports
+ end
+
+ private
+
+ def accumulated_grouped_supports
+ grouped_votes = grouped_supports
+ grouped_votes.each do |group, votes|
+ grouped_votes[group] = votes.inject(0) { |sum, vote| sum + vote.vote_weight }
+ end
+
+ accumulated = 0
+ grouped_votes.each do |k, v|
+ accumulated += v
+ grouped_votes[k] = accumulated
+ end
+
+ grouped_votes
+ end
+
+ def grouped_supports
+ if params[:group_by] == 'week'
+ return supports.group_by { |v| "#{v.voted_at.to_date.cweek}/#{v.voted_at.to_date.year}" }
+ end
+
+ if params[:group_by] == 'month'
+ return supports.group_by { |v| "#{v.voted_at.to_date.year}-#{v.voted_at.to_date.month}" }
+ end
+
+ supports.group_by { |v| v.voted_at.to_date }
+ end
+
+ def supports
+ return [] if successful_proposal.nil?
+
+ Vote
+ .select("created_at + interval '#{days_diff} day' voted_at, *")
+ .where(votable: successful_proposal)
+ .where("created_at + interval '#{days_diff} day' between ? and ?", start_date.beginning_of_day, end_date.end_of_day)
+ .order(created_at: :asc)
+ end
+
+ def successful_proposal
+ @successful_proposal ||= Proposal.find_by(id: Setting['proposals.successful_proposal_id'])
+ end
+
+ def days_diff
+ return 0 if successful_proposal.nil?
+ return 0 if proposal.published_at.nil?
+
+ (proposal.published_at.to_date - successful_proposal.published_at.to_date).to_i
+ end
+end
diff --git a/app/controllers/dashboard/supports_controller.rb b/app/controllers/dashboard/supports_controller.rb
new file mode 100644
index 000000000..b6f83f3ec
--- /dev/null
+++ b/app/controllers/dashboard/supports_controller.rb
@@ -0,0 +1,43 @@
+class Dashboard::SupportsController < Dashboard::BaseController
+ include Dashboard::ExpectsDateRange
+
+ def index
+ authorize! :dashboard, proposal
+ render json: accumulated_supports
+ end
+
+ private
+
+ def accumulated_supports
+ grouped_votes = grouped_supports
+ grouped_votes.each do |group, votes|
+ grouped_votes[group] = votes.inject(0) { |sum, vote| sum + vote.vote_weight }
+ end
+
+ accumulated = 0
+ grouped_votes.each do |k, v|
+ accumulated += v
+ grouped_votes[k] = accumulated
+ end
+
+ grouped_votes
+ end
+
+ def grouped_supports
+ if params[:group_by] == 'week'
+ return supports.group_by { |v| "#{v.created_at.to_date.cweek}/#{v.created_at.to_date.year}" }
+ end
+
+ if params[:group_by] == 'month'
+ return supports.group_by { |v| "#{v.created_at.to_date.year}-#{v.created_at.to_date.month}" }
+ end
+
+ supports.group_by { |v| v.created_at.to_date }
+ end
+
+ def supports
+ @supports ||= Vote
+ .where(votable: proposal, created_at: start_date.beginning_of_day..end_date.end_of_day)
+ .order(created_at: :asc)
+ end
+end
diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb
index e6e0de1fe..f9f6903b6 100644
--- a/app/controllers/dashboard_controller.rb
+++ b/app/controllers/dashboard_controller.rb
@@ -37,7 +37,7 @@ class DashboardController < Dashboard::BaseController
if @dashboard_executed_action.save
Dashboard::AdministratorTask.create(source: @dashboard_executed_action)
- redirect_to progress_proposal_dashboard_index_path(proposal.to_param), { flash: { info: t('.success') } }
+ redirect_to progress_proposal_dashboard_index_path(proposal.to_param), { flash: { info: t('dashboard.create_request.success') } }
else
flash.now[:alert] = @dashboard_executed_action.errors.full_messages.join('
')
render :new_request
@@ -52,21 +52,6 @@ class DashboardController < Dashboard::BaseController
authorize! :dashboard, proposal
end
- def supports
- authorize! :dashboard, proposal
- render json: ProposalSupportsQuery.for(params)
- end
-
- def successful_supports
- authorize! :dashboard, proposal
- render json: SuccessfulProposalSupportsQuery.for(params)
- end
-
- def achievements
- authorize! :dashboard, proposal
- render json: ProposalAchievementsQuery.for(params)
- end
-
private
def dashboard_action
diff --git a/app/models/poll/question.rb b/app/models/poll/question.rb
index c87b89c83..1e6cb8386 100644
--- a/app/models/poll/question.rb
+++ b/app/models/poll/question.rb
@@ -5,7 +5,7 @@ class Poll::Question < ActiveRecord::Base
acts_as_paranoid column: :hidden_at
include ActsAsParanoidAliases
- belongs_to :poll, inverse_of: :questions
+ belongs_to :poll
belongs_to :author, -> { with_hidden }, class_name: 'User', foreign_key: 'author_id'
has_many :comments, as: :commentable
diff --git a/app/services/proposal_achievements_query.rb b/app/services/proposal_achievements_query.rb
deleted file mode 100644
index ace1113e8..000000000
--- a/app/services/proposal_achievements_query.rb
+++ /dev/null
@@ -1,61 +0,0 @@
-class ProposalAchievementsQuery
- attr_reader :params
-
- def self.for(params)
- query = ProposalAchievementsQuery.new params
- query.results
- end
-
- def initialize(params)
- @params = params
- end
-
- def results
- grouped_results = groups
- grouped_results.each do |key, achievements|
- grouped_results[key] = []
-
- achievements.each do |achievement|
- grouped_results[key] << {
- executed_at: achievements.last.executed_at,
- title: achievements.last.action.title
- }
- end
- end
-
- grouped_results
- end
-
- private
-
- def groups
- return achievements.group_by { |v| v.executed_at.to_date.year } if params[:group_by] == 'year'
- return achievements.group_by { |v| "#{v.executed_at.to_date.cweek}/#{v.executed_at.to_date.year}" } if params[:group_by] == 'week'
- return achievements.group_by { |v| "#{v.executed_at.to_date.year}-#{v.executed_at.to_date.month}" } if params[:group_by] == 'month'
- achievements.group_by { |a| a.executed_at.to_date }
- end
-
- def achievements
- Dashboard::ExecutedAction
- .joins(:action)
- .includes(:action)
- .where(proposal: proposal, executed_at: start_date.beginning_of_day..end_date.end_of_day)
- .where(dashboard_actions: { action_type: 0 })
- .order(executed_at: :asc)
- end
-
- def proposal
- @proposal ||= Proposal.find(params[:proposal_id])
- end
-
- def start_date
- return Date.parse(params[:start_date]) unless params[:start_date].blank?
- proposal.created_at.to_date
- end
-
- def end_date
- return Date.parse(params[:end_date]) unless params[:end_date].blank?
- Date.today
- end
-end
-
diff --git a/app/services/proposal_supports_query.rb b/app/services/proposal_supports_query.rb
deleted file mode 100644
index fa00275e4..000000000
--- a/app/services/proposal_supports_query.rb
+++ /dev/null
@@ -1,54 +0,0 @@
-class ProposalSupportsQuery
- attr_reader :params
-
- def self.for(params)
- query = ProposalSupportsQuery.new params
- query.results
- end
-
- def initialize(params)
- @params = params
- end
-
- def results
- grouped_votes = groups
- grouped_votes.each do |group, votes|
- grouped_votes[group] = votes.inject(0) { |sum, vote| sum + vote.vote_weight }
- end
-
- accumulated = 0
- grouped_votes.each do |k, v|
- accumulated += v
- grouped_votes[k] = accumulated
- end
-
- grouped_votes
- end
-
- private
-
- def groups
- return votes.group_by { |v| v.created_at.to_date.year } if params[:group_by] == 'year'
- return votes.group_by { |v| "#{v.created_at.to_date.cweek}/#{v.created_at.to_date.year}" } if params[:group_by] == 'week'
- return votes.group_by { |v| "#{v.created_at.to_date.year}-#{v.created_at.to_date.month}" } if params[:group_by] == 'month'
- votes.group_by { |v| v.created_at.to_date }
- end
-
- def votes
- Vote.where(votable: proposal, created_at: start_date.beginning_of_day..end_date.end_of_day).order(created_at: :asc)
- end
-
- def proposal
- @proposal ||= Proposal.find(params[:proposal_id])
- end
-
- def start_date
- return Date.parse(params[:start_date]) unless params[:start_date].blank?
- proposal.created_at.to_date
- end
-
- def end_date
- return Date.parse(params[:end_date]) unless params[:end_date].blank?
- Date.today
- end
-end
diff --git a/app/services/successful_proposal_supports_query.rb b/app/services/successful_proposal_supports_query.rb
deleted file mode 100644
index 50cb6103f..000000000
--- a/app/services/successful_proposal_supports_query.rb
+++ /dev/null
@@ -1,72 +0,0 @@
-class SuccessfulProposalSupportsQuery
- attr_reader :params
-
- def self.for(params)
- query = SuccessfulProposalSupportsQuery.new params
- query.results
- end
-
- def initialize(params)
- @params = params
- end
-
- def results
- grouped_votes = groups
- grouped_votes.each do |group, votes|
- grouped_votes[group] = votes.inject(0) { |sum, vote| sum + vote.vote_weight }
- end
-
- accumulated = 0
- grouped_votes.each do |k, v|
- accumulated += v
- grouped_votes[k] = accumulated
- end
-
- grouped_votes
- end
-
- private
-
- def groups
- return votes.group_by { |v| v.voted_at.to_date.year } if params[:group_by] == 'year'
- return votes.group_by { |v| "#{v.voted_at.to_date.cweek}/#{v.voted_at.to_date.year}" } if params[:group_by] == 'week'
- return votes.group_by { |v| "#{v.voted_at.to_date.year}-#{v.voted_at.to_date.month}" } if params[:group_by] == 'month'
- votes.group_by { |v| v.voted_at.to_date }
- end
-
- def votes
- return [] if successful_proposal.nil?
-
- Vote
- .select("created_at + interval '#{days_diff} day' voted_at, *")
- .where(votable: successful_proposal)
- .where("created_at + interval '#{days_diff} day' between ? and ?", start_date.beginning_of_day, end_date.end_of_day)
- .order(created_at: :asc)
- end
-
- def proposal
- @proposal ||= Proposal.find(params[:proposal_id])
- end
-
- def successful_proposal
- @successful_proposal ||= Proposal.find_by(id: Setting['proposals.successful_proposal_id'])
- end
-
- def days_diff
- return 0 if successful_proposal.nil?
- return 0 if proposal.published_at.nil?
-
- (proposal.published_at.to_date - successful_proposal.published_at.to_date).to_i
- end
-
- def start_date
- return Date.parse(params[:start_date]) unless params[:start_date].blank?
- proposal.created_at.to_date
- end
-
- def end_date
- return Date.parse(params[:end_date]) unless params[:end_date].blank?
- Date.today
- end
-end
-
diff --git a/app/views/admin/_menu.html.erb b/app/views/admin/_menu.html.erb
index aae27ac38..229b7c866 100644
--- a/app/views/admin/_menu.html.erb
+++ b/app/views/admin/_menu.html.erb
@@ -251,4 +251,5 @@
+
diff --git a/app/views/dashboard/progress.html.erb b/app/views/dashboard/progress.html.erb
index 98865c5d6..f45016cc4 100644
--- a/app/views/dashboard/progress.html.erb
+++ b/app/views/dashboard/progress.html.erb
@@ -18,14 +18,15 @@