diff --git a/app/assets/stylesheets/dashboard.scss b/app/assets/stylesheets/dashboard.scss index 82c9804df..ac9102f3d 100644 --- a/app/assets/stylesheets/dashboard.scss +++ b/app/assets/stylesheets/dashboard.scss @@ -101,6 +101,18 @@ margin-left: $line-height / 4; max-width: 90%; + h4 { + display: inline-block; + } + + .label { + margin-left: $line-height / 2; + } + + a { + display: block; + } + h4, p { margin-bottom: 0; @@ -168,6 +180,15 @@ width: rem-calc(36); } + .label { + position: absolute; + top: 20px; + left: 0; + } + + h4 { + margin-top: $line-height; + } .resource-description { min-height: $line-height * 4; } diff --git a/app/controllers/dashboard/base_controller.rb b/app/controllers/dashboard/base_controller.rb index 2755e74c9..14a4f7ff6 100644 --- a/app/controllers/dashboard/base_controller.rb +++ b/app/controllers/dashboard/base_controller.rb @@ -1,5 +1,5 @@ class Dashboard::BaseController < ApplicationController - before_action :authenticate_user! + before_action :authenticate_user!, :detect_new_actions_after_last_login include Dashboard::HasProposal @@ -35,4 +35,9 @@ class Dashboard::BaseController < ApplicationController def next_goal @next_goal ||= Dashboard::Action.next_goal_for(proposal) end + + def detect_new_actions_after_last_login + author_last_login = proposal.author.last_sign_in_at.to_date + @new_actions_since_last_login = Dashboard::Action.detect_new_actions_since(author_last_login, proposal) + end end diff --git a/app/helpers/proposals_dashboard_helper.rb b/app/helpers/proposals_dashboard_helper.rb index 58d468e1b..a96a09d84 100644 --- a/app/helpers/proposals_dashboard_helper.rb +++ b/app/helpers/proposals_dashboard_helper.rb @@ -83,4 +83,22 @@ module ProposalsDashboardHelper return t("dashboard.resource.resource_requested") if resource.requested_for?(proposal) t("dashboard.resource.request_resource") end + + def is_new_action_since_last_login?(proposed_action, new_actions_since_last_login) + new_actions_since_last_login.include?(proposed_action.id) if new_actions_since_last_login.present? + end + + def new_resources_since_last_login?(resources, new_actions_since_last_login) + resources.pluck(:id).any? {|id| new_actions_since_last_login.include?(id) } if resources.present? + end + + def active_resources_for(proposal) + default_resources_count = 3 #resources: mail, poster, poll + Dashboard::Action.active.resources.active_for(proposal).count + default_resources_count + end + + def active_resources_count(proposal) + default_resources_count = 3 #resources: mail, poster, poll + Dashboard::Action.active.resources.by_proposal(proposal).count + default_resources_count + end end diff --git a/app/mailers/dashboard/mailer.rb b/app/mailers/dashboard/mailer.rb index e246fb914..f60119a50 100644 --- a/app/mailers/dashboard/mailer.rb +++ b/app/mailers/dashboard/mailer.rb @@ -5,4 +5,32 @@ class Dashboard::Mailer < ApplicationMailer @proposal = proposal mail to: proposal.author.email, subject: proposal.title end + + def new_actions_notification_rake_published(proposal, new_actions_ids) + @proposal = proposal + @new_actions = get_new_actions(new_actions_ids) + mail to: proposal.author.email, subject: I18n.t("mailers.new_actions_notification_rake_published.subject") + end + + def new_actions_notification_rake_created(proposal, new_actions_ids) + @proposal = proposal + @new_actions = get_new_actions(new_actions_ids) + mail to: proposal.author.email, subject: I18n.t("mailers.new_actions_notification_rake_created.subject") + end + + def new_actions_notification_on_create(proposal) + @proposal = proposal + mail to: proposal.author.email, subject: I18n.t("mailers.new_actions_notification_on_create.subject") + end + + def new_actions_notification_on_published(proposal, new_actions_ids) + @proposal = proposal + @new_actions = get_new_actions(new_actions_ids) + mail to: proposal.author.email, subject: I18n.t("mailers.new_actions_notification_on_published.subject") + end + + private + def get_new_actions(new_actions_ids) + Dashboard::Action.where(id: new_actions_ids) + end end diff --git a/app/models/dashboard/action.rb b/app/models/dashboard/action.rb index 357bb1412..b4a450b8f 100644 --- a/app/models/dashboard/action.rb +++ b/app/models/dashboard/action.rb @@ -46,6 +46,9 @@ class Dashboard::Action < ActiveRecord::Base scope :by_proposal, lambda { |proposal| return where(published_proposal: false) if proposal.draft? } + scope :by_published_proposal, lambda { |published| + return where(published_proposal: published) + } def self.active_for(proposal) published_at = proposal.published_at&.to_date || Date.today @@ -85,4 +88,44 @@ class Dashboard::Action < ActiveRecord::Base def self.next_goal_for(proposal) course_for(proposal).first end + + def self.detect_new_actions_since(date, proposal) + actions_for_today = get_actions_for_today(proposal) + actions_for_date = get_actions_for_date(proposal, date) + + actions_for_today_ids = actions_for_today.pluck(:id) + actions_for_date_ids = actions_for_date.pluck(:id) + + actions_for_today_ids - actions_for_date_ids + end + + private + def self.get_actions_for_today(proposal) + proposal_votes = proposal.cached_votes_up + day_offset = calculate_day_offset(proposal, Date.today) + + calculate_actions(proposal_votes, day_offset, proposal) + end + + def self.get_actions_for_date(proposal, date) + proposal_votes = calculate_votes(proposal, date) + day_offset = calculate_day_offset(proposal, date) + + calculate_actions(proposal_votes, day_offset, proposal) + end + + def self.calculate_day_offset(proposal, date) + start_date = proposal.published? ? proposal.published_at : proposal.created_at + (date - start_date.to_date).to_i + end + + def self.calculate_actions(proposal_votes, day_offset, proposal) + Dashboard::Action.active.where("required_supports <= ?", proposal_votes) + .where("day_offset <= ?", day_offset) + .by_published_proposal(proposal.published?) + end + + def self.calculate_votes(proposal, date) + Vote.where(votable: proposal).where("created_at <= ?", date).count + end end diff --git a/app/models/proposal.rb b/app/models/proposal.rb index e96e49592..95473ed15 100644 --- a/app/models/proposal.rb +++ b/app/models/proposal.rb @@ -55,6 +55,8 @@ class Proposal < ActiveRecord::Base before_save :calculate_hot_score, :calculate_confidence_score + after_create :send_new_actions_notification_on_create + scope :for_render, -> { includes(:tags) } scope :sort_by_hot_score, -> { reorder(hot_score: :desc) } scope :sort_by_confidence_score, -> { reorder(confidence_score: :desc) } @@ -84,6 +86,7 @@ class Proposal < ActiveRecord::Base def publish update(published_at: Time.now) + send_new_actions_notification_on_published end def published? @@ -236,6 +239,22 @@ class Proposal < ActiveRecord::Base Setting["feature.user.skip_verification"].present? end + def send_new_actions_notification_on_create + new_actions = Dashboard::Action.detect_new_actions_since(Date.yesterday, self) + + if new_actions.present? + Dashboard::Mailer.new_actions_notification_on_create(self).deliver_later + end + end + + def send_new_actions_notification_on_published + new_actions_ids = Dashboard::Action.detect_new_actions_since(Date.yesterday, self) + + if new_actions_ids.present? + Dashboard::Mailer.new_actions_notification_on_published(self, new_actions_ids).deliver_later + end + end + protected def set_responsible_name diff --git a/app/views/dashboard/_menu.html.erb b/app/views/dashboard/_menu.html.erb index 463ad470c..c6d633e79 100644 --- a/app/views/dashboard/_menu.html.erb +++ b/app/views/dashboard/_menu.html.erb @@ -18,12 +18,18 @@ <%= link_to recommended_actions_proposal_dashboard_path(proposal.to_param) do %> <%= t("dashboard.menu.recommended_actions") %> <% end %> + <% if new_resources_since_last_login?(proposed_actions, @new_actions_since_last_login) %> + <%= t("dashboard.progress.new_action" ) %> + <% end %> <% if resources_menu_visible?(proposal, resources) %>
  • <%= t("dashboard.menu.resources") %> + <% if new_resources_since_last_login?(resources, @new_actions_since_last_login) %> + <%= t("dashboard.progress.new_action" ) %> + <% end %>