agile-alliance-brazil/submissions

View on GitHub
app/helpers/actions_helper.rb

Summary

Maintainability
A
1 hr
Test Coverage
A
100%
# frozen_string_literal: true

# Methods added to this helper will be available to all templates in the application.
module ActionsHelper
  class Section
    attr_reader :title, :actions

    def initialize(title)
      @title = title
      @actions = []
    end

    def add(name, link, options = nil)
      @actions << { name: name, link: link, options: options }
      self
    end
  end

  def sections_for(user, conference, safe_filter_params)
    sections = []

    sections << session_section_for(user, conference) if user_signed_in?
    sections << reviewer_section_for(user, conference, safe_filter_params) if user.reviewer? || user.admin?
    sections << organizer_section_for(user, conference) if user.organizer? || user.admin?
    sections << user_section_for(user) if user_signed_in?

    sections
  end

  def user_section_for(user)
    section = Section.new t('actions.section.user')

    section.add t('actions.profile'), user_path(user) if can? :read, User
    if can? :update, user
      section.add t('actions.edit_profile'), edit_user_registration_path
      section.add t('actions.change_password'), edit_user_registration_path(update_password: true)
    end
    section.add 'Logout', destroy_user_session_path, method: :delete

    section
  end

  def session_section_for(user, conference)
    section = Section.new t('actions.section.session')

    section.add t('actions.submit_session'), new_session_path(conference) if can? :create, Session
    if can? :read, Session
      sessions_count = Session.for_conference(conference).without_state(:cancelled).count
      section.add t('actions.browse_sessions', count: sessions_count), sessions_path(conference)
      section.add t('actions.my_sessions'), user_sessions_path(conference, user) if user.sessions_for_conference(conference).count.positive?
    end
    section.add t('actions.my_votes'), votes_path(conference) if can? :read, Vote

    section
  end

  def reviewer_section_for(user, conference, safe_params)
    section = Section.new t('actions.section.review')
    if (conference.in_early_review_phase? ||
          conference.in_final_review_phase?) &&
       can?(:read, 'reviewer_sessions')
      sessions_to_review_count = SessionFilter.new(safe_params.merge(conference: conference), params[:user_id]).apply(Session.for_reviewer(current_user, conference)).to_a.size
      section.add t('actions.reviewer_sessions', count: sessions_to_review_count), reviewer_sessions_path(conference)
    end
    if can? :reviewer, 'reviews_listing'
      reviews_count = user.reviews.for_conference(conference).count
      section.add t('actions.reviewer_reviews', count: reviews_count), reviewer_reviews_path(conference)
    end
    section.add t('actions.review_session'), new_session_review_path(conference, @session) if @session.present? && (can?(:create, EarlyReview, @session) || can?(:create, FinalReview, @session))

    section
  end

  def filter_params
    params.permit(:session_filter)
          .permit(:track_id, :session_type_id, :audience_level_id)[:session_filter] || {}
  end

  def organizer_section_for(_user, _conference)
    section = Section.new t('actions.section.organize')

    section.add t('actions.manage_conferences'), conferences_path if can? :read, Conference
    section.add t('actions.manage_organizers'), organizers_path(@conference) if can? :read, Organizer
    section.add t('actions.manage_reviewers'), reviewers_path(@conference) if can? :read, Reviewer
    section.add t('actions.organizer_sessions'), organizer_sessions_path(@conference) if can? :read, 'organizer_sessions'
    section.add t('actions.organizer_reports'), organizer_reports_path(@conference, format: :xls) if can? :read, 'organizer_reports'
    section.add t('actions.accepted_sessions'), accepted_sessions_path(@conference, format: :csv) if can? :read, 'accepted_sessions'

    section
  end
end