2011-03-31 00:31:39 +00:00
|
|
|
module Ransack
|
|
|
|
module Nodes
|
|
|
|
class Sort < Node
|
2011-04-10 00:55:28 +00:00
|
|
|
include Bindable
|
|
|
|
|
2011-04-11 16:04:31 +00:00
|
|
|
attr_reader :name, :dir
|
2011-03-31 00:31:39 +00:00
|
|
|
i18n_word :asc, :desc
|
|
|
|
|
|
|
|
class << self
|
|
|
|
def extract(context, str)
|
|
|
|
attr, direction = str.split(/\s+/,2)
|
2013-12-15 18:27:50 +00:00
|
|
|
self.new(context).build(name: attr, dir: direction)
|
2011-03-31 00:31:39 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def build(params)
|
|
|
|
params.with_indifferent_access.each do |key, value|
|
|
|
|
if key.match(/^(name|dir)$/)
|
|
|
|
self.send("#{key}=", value)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
self
|
|
|
|
end
|
|
|
|
|
|
|
|
def valid?
|
2013-12-07 00:51:55 +00:00
|
|
|
bound? && attr &&
|
2014-10-09 21:48:38 +00:00
|
|
|
context.klassify(parent).ransortable_attributes(context.auth_object)
|
|
|
|
.include?(attr_name)
|
2011-03-31 00:31:39 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def name=(name)
|
|
|
|
@name = name
|
2011-04-10 00:55:28 +00:00
|
|
|
context.bind(self, name) unless name.blank?
|
2011-03-31 00:31:39 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def dir=(dir)
|
2014-10-03 23:25:14 +00:00
|
|
|
dir = dir.downcase if dir
|
2014-10-09 21:48:38 +00:00
|
|
|
@dir =
|
|
|
|
if Ransack::Constants::ASC_DESC.include?(dir)
|
|
|
|
dir
|
|
|
|
else
|
|
|
|
Ransack::Constants::ASC
|
|
|
|
end
|
2011-03-31 00:31:39 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|
2013-10-24 15:56:45 +00:00
|
|
|
end
|