maximalink/jquery_sortable_tree

View on GitHub
app/controllers/jquery_sortable_tree_controller.rb

Summary

Maintainability
A
25 mins
Test Coverage
module JquerySortableTreeController
  module DefineVariablesMethod
    def sortable_model
      @sortable_model ||= self.class.to_s.split(':').last.sub(/Controller/, '').singularize.constantize
    end

    def sortable_collection
      @sortable_collection ||= self.class.to_s.split(':').last.sub(/Controller/,'').underscore.downcase
    end

    def the_define_common_variables
      ["@#{sortable_collection.singularize}", sortable_collection, sortable_model]
    end

    def id
      @id ||= params[:id].to_i
    end

    def parent_id
      @parent_id ||= params[:parent_id].to_i
    end

    def sort
      @sort ||= params[:tree_sort] == 'reversed' ? 'reversed_nested_set' : 'nested_set'
    end

    def prev_id
      @prev_id ||= params[:prev_id].to_i
    end

    def next_id
      @next_id ||= params[:next_id].to_i
    end

    def move_to_prev
      @move_to_prev ||= params[:tree_sort] == 'reversed' ? :move_to_left_of : :move_to_right_of
    end

    def move_to_next
      @move_to_next ||= params[:tree_sort] == 'reversed' ? :move_to_right_of : :move_to_left_of
    end

    def move_to_parent
      :move_to_child_of
    end

    def object_to_rebuild
      self.sortable_model.find(id)
    end

    def move_to_nowhere?
      parent_id.zero? && prev_id.zero? && next_id.zero?
    end

    def prev_next_parent
      return 'prev' unless prev_id.zero?
      return 'next' unless next_id.zero?
      return 'parent' unless parent_id.zero?
    end

    def move_to
      send("move_to_#{prev_next_parent}")
    end

    def node_id
      send("#{prev_next_parent}_id")
    end

    def node
      sortable_model.find(node_id)
    end
  end

  module ExpandNode
    include DefineVariablesMethod

    def expand_node
      @children = object_to_rebuild.children.send(sort) if id && sort
      return render(plain: '', status: :no_content) if !@children || @children.count.zero?
      render layout: false, template: "#{sortable_collection}/expand_node"
    end
  end

  module Rebuild
    include DefineVariablesMethod

    def rebuild
      return render(plain: '', status: :no_content) if move_to_nowhere?
      object_to_rebuild.send(move_to, node)
      render(plain: '', status: :ok)
    end
  end
end