Newer
Older
dmpopidor / app / controllers / phases_controller.rb
class PhasesController < ApplicationController
  require 'pp'

  after_action :verify_authorized


  # GET /plans/:plan_id/phases/:id/edit
  def edit
    plan = Plan.find(params[:plan_id])
    authorize plan
    
    plan, phase = Plan.load_for_phase(params[:plan_id], params[:id])
    
    readonly = !plan.editable_by?(current_user.id)
    
    guidance_groups_ids = plan.guidance_groups.collect(&:id)
    
    guidance_groups =  GuidanceGroup.where(published: true, id: guidance_groups_ids)
    # Since the answers have been pre-fetched through plan (see Plan.load_for_phase)
    # we create a hash whose keys are question id and value is the answer associated
    answers = plan.answers.reduce({}){ |m, a| m[a.question_id] = a; m }
    
    render('/phases/edit', locals: {
      plan: plan, phase: phase, readonly: readonly,
      question_guidance: plan.guidance_by_question_as_hash,
      guidance_groups: guidance_groups,
      answers: answers })
  end


    # GET /plans/PLANID/phases/PHASEID/status.json
  def status
    @plan = Plan.eager_load(params[:plan_id])
    authorize @plan
    if user_signed_in? && @plan.readable_by?(current_user.id) then
      respond_to do |format|
        format.json { render json: @plan.status }
      end
    else
      render(:file => File.join(Rails.root, 'public/403.html'), :status => 403, :layout => false)
    end
  end

  #show and edit a phase of the template
  def admin_show
    @phase = Phase.includes(:sections).order(:number).find(params[:id])
    authorize @phase

    @current = Template.current(@phase.template.dmptemplate_id)
    @edit = (@phase.template.org == current_user.org) && (@phase.template == @current)

    if params.has_key?(:question_id)
      @question_id = params[:question_id].to_i
    end
    if @phase.template.customization_of.present?
      @original_org = Template.where(dmptemplate_id: @phase.template.customization_of).first.org
    else
      @original_org = @phase.template.org
    end
    
    render('/org_admin/templates/container',
      locals: {
        partial_path: 'admin_show',
        phase: @phase,
        template: @phase.template,
        edit: @edit,
        current_section: params.has_key?(:section_id) ? params[:section_id].to_i : nil,
        current_tab: params[:r] || 'all-templates'
      })
  end


  #preview a phase
  def admin_preview
    @phase = Phase.find(params[:id])
    authorize @phase
    @template = @phase.template
    @current_tab = params[:r] || 'all-templates'
  end


  #add a new phase to a passed template
  def admin_add
    @template = Template.find(params[:id])
    @phase = Phase.new
    @phase.template = @template
    authorize @phase
    @phase.number = @template.phases.count + 1
    render('/org_admin/templates/container',
      locals: {
        partial_path: 'admin_add',
        template: @template,
        current_tab: params[:r] || 'all-templates'
      })
  end


  #create a phase
  def admin_create
    @phase = Phase.new(params[:phase])
    authorize @phase

    @phase.description = params["phase-desc"]
    @phase.modifiable = true
    @current_tab = params[:r] || 'all-templates'
    if @phase.save
      @phase.template.dirty = true
      @phase.template.save!

      redirect_to admin_show_phase_path(id: @phase.id, r: @current_tab), notice: success_message(_('phase'), _('created'))
    else
      flash[:alert] = failed_create_error(@phase, _('phase'))
      @template = @phase.template
      redirect_to edit_org_admin_template_path(id: @phase.template_id, r: @current_tab)
    end
  end


  #update a phase of a template
  def admin_update
    @phase = Phase.find(params[:id])
    authorize @phase
    
    @phase.description = params["phase-desc"]
    @current_tab = params[:r] || 'all-templates'
    if @phase.update_attributes(params[:phase])
      @phase.template.dirty = true
      @phase.template.save!

      redirect_to admin_show_phase_path(@phase, r: @current_tab), notice: success_message(_('phase'), _('saved'))
    else
      @sections = @phase.sections
      @template = @phase.template
      # These params may not be available in this context so they may need
      # to be set to true without the check
      @edit = true
      @open = !params[:section_id].nil?
      @section_id = (params[:section_id].nil? ? nil : params[:section_id].to_i)
      @question_id = (params[:question_id].nil? ? nil : params[:question_id].to_i)
      flash[:alert] = failed_update_error(@phase, _('phase'))
      if @phase.template.customization_of.present?
        @original_org = Template.where(dmptemplate_id: @phase.template.customization_of).first.org
      else
        @original_org = @phase.template.org
      end
      redirect_to admin_show_phase_path(@phase, r: @current_tab)
    end
  end

  #delete a phase
  def admin_destroy
    @phase = Phase.find(params[:phase_id])
    authorize @phase
    @template = @phase.template
    @current_tab = params[:r] || 'all-templates'
    if @phase.destroy
      @template.dirty = true
      @template.save!

      redirect_to edit_org_admin_template_path(@template, r: @current_tab), notice: success_message(_('phase'), _('deleted'))
    else
      @sections = @phase.sections

      # These params may not be available in this context so they may need
      # to be set to true without the check
      @edit = true
      @open = !params[:section_id].nil?
      @section_id = (params[:section_id].nil? ? nil : params[:section_id].to_i)
      @question_id = (params[:question_id].nil? ? nil : params[:question_id].to_i)
      flash[:alert] = failed_destroy_error(@phase, _('phase'))
      if @phase.template.customization_of.present?
        @original_org = Template.where(dmptemplate_id: @phase.template.customization_of).first.org
      else
        @original_org = @phase.template.org
      end
      redirect_to admin_show_phase_path(@phase, r: @current_tab)
    end
  end
end