Newer
Older
dmpopidor / app / controllers / org_admin / sections_controller.rb
@briley briley on 23 May 2018 4 KB Template Versioning
module OrgAdmin
  class SectionsController < ApplicationController
    include Versionable
    
    respond_to :html
    after_action :verify_authorized

    # GET /org_admin/templates/[:template_id]/phases/[:phase_id]/sections
    def index
      authorize Section.new
      phase = Phase.includes(:template, :sections).find(params[:phase_id])
      edit = phase.template.latest? && (current_user.can_modify_templates?  &&  (phase.template.org_id == current_user.org_id))
      render partial: 'index', 
        locals: { 
          template: phase.template, 
          phase: phase, 
          sections: phase.sections, 
          current_section: phase.sections.first,
          modifiable: edit,
          edit: edit 
        }
    end

    # GET /org_admin/templates/[:template_id]/phases/[:phase_id]/sections/[:id]
    def show
      section = Section.find(params[:id])
      authorize section
      section = Section.includes(questions: [:annotations, :question_options]).find(params[:id])
      render partial: 'show', locals: { 
        template: Template.find(params[:template_id]),
        section: section 
      }
    end

    # GET /org_admin/templates/[:template_id]/phases/[:phase_id]/sections/[:id]/edit
    def edit
      section = Section.includes({phase: :template}, questions: [:question_options, { annotations: :org }]).find(params[:id])
      authorize section
      render partial: 'edit', 
        locals: { 
          template: section.phase.template, 
          phase: section.phase, 
          section: section
        }
    end

    # POST /org_admin/templates/[:template_id]/phases/[:phase_id]/sections
    def create
      phase = Phase.find(params[:phase_id])
      if phase.present?
        section = Section.new(section_params.merge({ phase_id: phase.id }))
        authorize section
        begin
          section = get_new(section)
          if section.save
            flash[:notice] = success_message(_('section'), _('created'))
            redirect_to edit_org_admin_template_phase_path(template_id: section.phase.template.id, id: section.phase.id, section: section.id)
          else
            flash[:alert] = failed_create_error(section, _('section'))
            redirect_to edit_org_admin_template_phase_path(template_id: section.phase.template.id, id: section.phase.id)
          end
        rescue StandardError => e
          flash[:alert] = _('Unable to create a new version of this template.')
          redirect_to edit_org_admin_template_phase_path(template_id: section.phase.template.id, id: section.phase.id)
        end
      else
        flash[:alert] = _('Unable to create a new section because the phase you specified does not exist.')
        redirect_to edit_org_admin_template_path(template_id: params[:template_id])
      end
    end

    # PUT /org_admin/templates/[:template_id]/phases/[:phase_id]/sections/[:id]
    def update
      section = Section.includes(phase: :template).find(params[:id])
      authorize section
      begin
        section = get_modifiable(section)
        if section.update!(section_params)
          flash[:notice] = success_message(_('section'), _('saved'))
        else
          flash[:alert] = failed_update_error(section, _('section'))
        end
      rescue StandardError => e
        flash[:alert] = _('Unable to create a new version of this template.')
      end
      
      if flash[:alert].present?
        redirect_to edit_org_admin_template_phase_path(template_id: section.phase.template.id, id: section.phase.id, section: section.id)
      else
        redirect_to edit_org_admin_template_phase_path(template_id: section.phase.template.id, id: section.phase.id, section: section.id)
      end
    end

    # DELETE /org_admin/templates/[:template_id]/phases/[:phase_id]/sections/[:id]
    def destroy
      section = Section.includes(phase: :template).find(params[:id])
      authorize section
      begin
        section = get_modifiable(section)
        phase = section.phase
        if section.destroy!
          flash[:notice] = success_message(_('section'), _('deleted'))
        else
          flash[:alert] = failed_destroy_error(section, _('section'))
        end
      rescue StandardError => e
        flash[:alert] = _('Unable to create a new version of this template.')
      end
      
      if flash[:alert].present?
        redirect_to(edit_org_admin_template_phase_path(template_id: phase.template.id, id: phase.id))
      else
        redirect_to(edit_org_admin_template_phase_path(template_id: phase.template.id, id: phase.id))
      end
    end
    
    private
      def section_params
        params.require(:section).permit(:title, :description, :number)
      end
  end
end