denkGroot/Spina

View on GitHub
app/controllers/spina/admin/navigations_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Spina
  module Admin
    class NavigationsController < AdminController
      layout 'spina/admin/pages'

      before_action :set_breadcrumb, except: [:show]
      before_action :set_navigation, only: [:show, :edit, :update]

      def show        
        add_breadcrumb t('spina.website.pages')
      end

      def edit        
        add_breadcrumb @navigation.label, spina.admin_navigation_path(@navigation)
        add_breadcrumb t('spina.edit')
        render layout: 'spina/admin/admin'
      end

      def update        
        if @navigation.update_attributes(navigation_params)
          redirect_to spina.admin_navigation_path(@navigation)
        else
          render :edit
        end
      end

      def sort
        params[:list].each_pair do |parent_pos, parent_node|
          update_child_pages_position(parent_node)
          update_navigation_item_position(parent_node[:id], parent_pos, nil)
        end
        head :ok
      end

      private

        def update_navigation_item_position(navigation_item_id, position, parent_id = nil)
          Spina::NavigationItem.update(navigation_item_id, position: position.to_i + 1, parent_id: parent_id )
        end

        def update_child_pages_position(node)
          if node[:children].present?
            node[:children].each_pair do |child_pos, child_node|
              update_child_pages_position(child_node) if child_node[:children].present?
              update_navigation_item_position(child_node[:id], child_pos, node[:id])
            end
          end
        end

        def set_breadcrumb
          add_breadcrumb t('spina.website.pages'), spina.admin_pages_path
        end

        def navigation_params
          params.require(:navigation).permit(:auto_add_pages, page_ids: [])
        end

        def set_navigation
          @navigation = Navigation.find(params[:id])
        end
    end
  end
end