class Datagrid::Filters::BaseFilter

@!visibility private

Attributes

block[RW]
grid_class[RW]
name[RW]
options[RW]

Public Class Methods

form_builder_helper_name() click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 103
def self.form_builder_helper_name
  :"datagrid_#{self.to_s.demodulize.underscore}"
end
new(grid_class, name, options = {}, &block) click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 12
def initialize(grid_class, name, options = {}, &block)
  self.grid_class = grid_class
  self.name = name.to_sym
  self.options = options
  self.block = block || default_filter_block
end

Public Instance Methods

allow_blank?() click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 87
def allow_blank?
  options[:allow_blank]
end
allow_nil?() click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 83
def allow_nil?
  options.has_key?(:allow_nil) ? options[:allow_nil] : options[:allow_blank]
end
apply(grid_object, scope, value) click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 27
def apply(grid_object, scope, value)
  return scope if unapplicable_value?(value)

  result = execute(value, scope, grid_object)

  return scope unless result
  if result == Datagrid::Filters::DEFAULT_FILTER_BLOCK
    result = default_filter(value, scope, grid_object)
  end
  unless grid_object.driver.match?(result)
    raise Datagrid::FilteringError, "Can not apply #{name.inspect} filter: result #{result.inspect} no longer match #{grid_object.driver.class}."
  end

  result
end
default(object) click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 68
def default(object)
  default = self.options[:default]
  if default.is_a?(Symbol)
    object.send(default)
  elsif default.respond_to?(:call)
    Datagrid::Utils.apply_args(object, &default)
  else
    default
  end
end
default_filter_block() click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 107
def default_filter_block
  filter = self
  lambda do |value, scope, grid|
    filter.default_filter(value, scope, grid)
  end
end
dummy?() click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 122
def dummy?
  options[:dummy]
end
enabled?(grid) click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 135
def enabled?(grid)
  ::Datagrid::Utils.process_availability(grid, options[:if], options[:unless])
end
form_builder_helper_name() click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 99
def form_builder_helper_name
  self.class.form_builder_helper_name
end
format(value) click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 118
def format(value)
  value.nil? ? nil : value.to_s
end
header() click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 60
def header
  if header = options[:header]
    Datagrid::Utils.callable(header)
  else
    Datagrid::Utils.translate_from_namespace(:filters, grid_class, name)
  end
end
input_options() click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 91
def input_options
  options[:input_options] || {}
end
label_options() click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 95
def label_options
  options[:label_options] || {}
end
multiple?() click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 79
def multiple?
  self.options[:multiple]
end
parse(value) click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 19
def parse(value)
  raise NotImplementedError, "#parse(value) suppose to be overwritten"
end
parse_values(value) click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 43
def parse_values(value)
  if multiple?
    return nil if value.nil?
    normalize_multiple_value(value).map do |v|
      parse(v)
    end
  elsif value.is_a?(Array)
    raise Datagrid::ArgumentError, "#{grid_class}##{name} filter can not accept Array argument. Use :multiple option."
  else
    parse(value)
  end
end
separator() click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 56
def separator
  options[:multiple].is_a?(String) ? options[:multiple] : default_separator
end
supports_range?() click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 114
def supports_range?
  self.class.ancestors.include?(::Datagrid::Filters::RangedFilter)
end
type() click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 126
def type
  Datagrid::Filters::FILTER_TYPES.each do |type, klass|
    if is_a?(klass)
      return type
    end
  end
  raise "wtf is #{inspect}"
end
unapplicable_value?(value) click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 23
def unapplicable_value?(value)
  value.nil? ? !allow_nil? : value.blank? && !allow_blank?
end

Protected Instance Methods

default_filter(value, scope, grid) click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 174
def default_filter(value, scope, grid)
  return nil if dummy?
  if !driver.has_column?(scope, name) && scope.respond_to?(name, true)
    scope.public_send(name, value)
  else
    default_filter_where(scope, value)
  end
end
default_filter_where(scope, value) click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 141
def default_filter_where(scope, value)
  driver.where(scope, name, value)
end
default_separator() click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 166
def default_separator
  ','
end
driver() click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 170
def driver
  grid_class.driver
end
execute(value, scope, grid_object) click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 145
def execute(value, scope, grid_object)
  if block.arity == 1
    scope.instance_exec(value, &block)
  else
    Datagrid::Utils.apply_args(value, scope, grid_object, &block)
  end
end
normalize_multiple_value(value) click to toggle source
# File lib/datagrid/filters/base_filter.rb, line 153
def normalize_multiple_value(value)
  case value
  when String
    value.split(separator)
  when Range
    [value.begin, value.end]
  when Array
    value
  else
    Array.wrap(value)
  end
end