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 @@
" data-proposal-graph-supports-label="<%= t("dashboard.progress.supports") %>" data-proposal-graph-success-label="<%= t("dashboard.progress.success") %>" data-proposal-success="<%= Setting["votes_for_proposal_success"] %>" + data-proposal-resources-url="<%= proposal_dashboard_resources_path(proposal, format: :json) %>" class="c3 proposal-graph" style="max-height: 320px; position: relative;">
diff --git a/app/views/polls/_poll_subnav.html.erb b/app/views/polls/_poll_subnav.html.erb index 47c0878b0..a97f5e530 100644 --- a/app/views/polls/_poll_subnav.html.erb +++ b/app/views/polls/_poll_subnav.html.erb @@ -2,7 +2,6 @@