module ActiveScaffold::Actions::Sortable

Public Class Methods

included(base) click to toggle source
# File lib/active_scaffold/actions/sortable.rb, line 3
def self.included(base)
  base.helper ActiveScaffold::Helpers::SortableHelpers
  base.before_action :sortable_authorized?, :only => :reorder
  base.active_scaffold_config.configure do |config|
    config.list.pagination = false if config.actions.include? :list
  
    # turn sorting off
    sortable_column = config.sortable.column.name
    config.columns.each {|c| c.sort = false unless c.name == sortable_column }
    config.list.sorting = { sortable_column => "asc" } if config.actions.include? :list
  
    config.actions.each do |action_name|
      next if action_name == :subform
      action = config.send(action_name)
      action.columns.exclude(sortable_column) if action.respond_to? :columns
    end

    base.add_active_scaffold_path File.join(ActiveScaffold::Config::Sortable.plugin_directory, 'frontends', 'default')
  end
end

Public Instance Methods

reorder() click to toggle source
# File lib/active_scaffold/actions/sortable.rb, line 24
def reorder
  model = active_scaffold_config.model
  
  unless (model.instance_methods & [:nested_set_scope, 'nested_set_scope']).empty?
    reorder_children_in_tree(model)
  else
    if model.respond_to? :ancestry_column
      reorder_ancestry_tree(model) 
    else
      reorder_simple_list(model)
    end
  end
  do_refresh_list if active_scaffold_config.sortable.refresh_list
end

Protected Instance Methods

move_child(child, old_position, new_position) click to toggle source
# File lib/active_scaffold/actions/sortable.rb, line 75
def move_child(child, old_position, new_position)
  method = (old_position - new_position) > 0 ? :move_left : :move_right
  (old_position - new_position).abs.times { |_| child.send(method) }
  child.self_and_siblings
end
ordered_ids() click to toggle source
# File lib/active_scaffold/actions/sortable.rb, line 81
def ordered_ids
  @ordered_ids ||= params.delete active_scaffold_tbody_id
end
reorder_ancestry_tree(model) click to toggle source
# File lib/active_scaffold/actions/sortable.rb, line 44
def reorder_ancestry_tree(model)
  first_record = model.find(ordered_ids.first)
  unless first_record.nil?
    records = first_record.is_root? ? model.roots: first_record.parent.children
    reorder_simple_list(records)
  else
    Rails.logger.info("Failed to find first record to reorder")
  end
end
reorder_children_in_tree(model) click to toggle source
# File lib/active_scaffold/actions/sortable.rb, line 61
def reorder_children_in_tree(model)
  full_order = model.find(ordered_ids.first).try(:self_and_siblings)
  new_order = ordered_ids.collect {|item_id| item_id.to_i}
  current_order = full_order.length == new_order.length ? full_order : full_order.select{ |r| new_order.include? r.id }

  new_order.each_with_index do |record_id, new_position|
    child = full_order.find {|child| child.id == record_id}
    while record_id != current_order[new_position].id do
      full_order = move_child(child, current_order.index(child), new_position)
      current_order = full_order.length == new_order.length ? full_order : full_order.select{ |r| new_order.include? r.id }
    end
  end if new_order.length == current_order.length
end
reorder_simple_list(model) click to toggle source
# File lib/active_scaffold/actions/sortable.rb, line 54
def reorder_simple_list(model)
  column_name = active_scaffold_config.sortable.column.name
  ordered_ids.each.with_index do |id, index|
    model.where(model.primary_key => id).update_all(column_name => index + 1)
  end
end
sortable_authorized?() click to toggle source
# File lib/active_scaffold/actions/sortable.rb, line 40
def sortable_authorized?
  authorized_for?(:action => :update)
end