Newer
Older
dmpopidor / app / controllers / questions_controller.rb
class QuestionsController < ApplicationController
  respond_to :html
  after_action :verify_authorized

  #create a question
  def admin_create
    begin
      @question = Question.new(question_params)
      authorize @question
      @question.modifiable = true
      current_tab = params[:r] || 'all-templates'
      if @question.question_format.textfield?
        @question.default_value = params["question-default-value-textfield"]
      elsif @question.question_format.textarea?
        @question.default_value = params["question-default-value-textarea"]
      end
      if @question.save
        @question.section.phase.template.dirty = true
        @question.section.phase.template.save!
        if params[:example_answer].present?
          example_answer = Annotation.new({question_id: @question.id, org_id: current_user.org_id, text: params[:example_answer], type: Annotation.types[:example_answer]})
          example_answer.save
        end
        if params[:guidance].present?
          guidance = Annotation.new({question_id: @question.id, org_id: current_user.org_id, text: params[:guidance], type: Annotation.types[:guidance]})
          guidance.save
        end
        redirect_to admin_show_phase_path(id: @question.section.phase_id, section_id: @question.section_id, question_id: @question.id, r: current_tab), notice: success_message(_('question'), _('created'))
      else
        @edit = (@question.section.phase.template.org == current_user.org)
        @open = true
        @phase = @question.section.phase
        @section = @question.section
        @sections = @phase.sections
        @section_id = @question.section.id
        @question_id = @question.id

        flash[:alert] = failed_create_error(@question, _('question'))
        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(id: @question.section.phase_id, section_id: @question.section_id, r: current_tab)
      end
    rescue ActionController::ParameterMissing => e
      flash[:alert] = e.message
    end
  end

  #update a question of a template
  def admin_update
    @question = Question.find(params[:id])
    authorize @question

    guidance = @question.get_guidance_annotation(current_user.org_id)
    current_tab = params[:r] || 'all-templates'
    if params["question-guidance-#{params[:id]}"].present?
      unless guidance.present?
        guidance = Annotation.new(type: :guidance, org_id: current_user.org_id, question_id: @question.id)
      end
      guidance.text = params["question-guidance-#{params[:id]}"]
      guidance.save
    else
      # The user cleared out the guidance value so delete the record
      guidance.destroy! if guidance.present?
    end
    example_answer = @question.get_example_answers(current_user.org_id).first
    if params["question"]["annotations_attributes"].present? && params["question"]["annotations_attributes"]["0"]["id"].present?
      unless example_answer.present?
        example_answer = Annotation.new(type: :example_answer, org_id: current_user.org_id, question_id: @question.id)
      end
      example_answer.text = params["question"]["annotations_attributes"]["0"]["text"]
      example_answer.save
    else
      # The user cleared out the example answer value so delete the record
      example_answer.destroy if example_answer.present?
    end    
    
    if @question.question_format.textfield?
      @question.default_value = params["question-default-value-textfield"]
    elsif @question.question_format.textarea?
      @question.default_value = params["question-default-value-textarea"]
    end
    @section = @question.section
    @phase = @section.phase
    template = @phase.template
    
    attrs = params[:question]
    attrs[:theme_ids] = [] unless attrs[:theme_ids]
    
    if @question.update_attributes(attrs)
      @phase.template.dirty = true
      @phase.template.save!

      redirect_to admin_show_phase_path(id: @phase.id, section_id: @section.id, question_id: @question.id, r: current_tab), notice: success_message(_('question'), _('saved'))
    else
      @edit = (@phase.template.org == current_user.org)
      @open = true
      @sections = @phase.sections
      @section_id = @section.id
      @question_id = @question.id

      flash[:alert] = failed_update_error(@question, _('question'))
      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(id: @phase.id, section_id: @section.id, question_id: @question.id, r: current_tab)
    end
  end

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

      redirect_to admin_show_phase_path(id: @phase.id, section_id: @section.id, r: current_tab), notice: success_message(_('question'), _('deleted'))
    else
      redirect_to admin_show_phase_path(id: @phase.id, section_id: @section.id, r: current_tab), alert: failed_destroy_error(@question, 'question')
    end
  end

  private
    # Filters the valid attributes for a question according to each type.
    # Note, that params[:question] and params[:question][:question_format_id] are required and their absence raises ActionController::ParameterMissing
    def question_params
      permitted = params.require(:question).except(:created_at, :updated_at).tap do |question_params|
        question_params.require(:question_format_id)
        q_format = QuestionFormat.find(question_params[:question_format_id])
        if !q_format.option_based?
          question_params.delete(':question_options_attributes')
        end
      end
    end
end