class AdminIt::Filter

Constants

ARGUMENT_REGEXP
BIN_REGEXP
DATE
DATETIME_REGEXP
DATE_REGEXP
FALSE_VALUES
FLOAT_REGEXP
HEX_REGEXP
INT_REGEXP
NULL_VALUES
OCT_REGEXP
REGEXP
TIME
TIME_REGEXP
TRUE_VALUES

Attributes

filter_name[R]
resource[R]

Public Class Methods

apply(str, filters, filter_classes) click to toggle source
# File lib/admin_it/filters/filter.rb, line 78
def self.apply(str, filters, filter_classes)
  list = str.scan(Filter::REGEXP)
  filters.clear if list.all? { |_, act, _, _| act.nil? || act.empty? }
  list.each do |full, action, name, params|
    name = name.to_sym
    if action == '-'
      filters.delete(name)
    elsif action == '!'
      filters[name].load(params) if filters.key?(name)
    else
      filters[name] = Filter.load(full, filter_classes)
    end
  end
end
create(name, _resource) click to toggle source
# File lib/admin_it/filters/filter.rb, line 63
def self.create(name, _resource)
  create_class(name, _resource)
end
load(str, filter_classes) click to toggle source
# File lib/admin_it/filters/filter.rb, line 67
def self.load(str, filter_classes)
  m = REGEXP.match(str)
  return nil if m.nil? || m[:action] == '-'
  name = m[:name].to_sym
  filter_class = filter_classes.find { |f| f.filter_name == name }
  return nil if filter_class.nil?
  filter = filter_class.new
  filter.load(m[:params])
  filter
end
new() click to toggle source
# File lib/admin_it/filters/filter.rb, line 95
def initialize
  run_callbacks :initialize
end

Protected Class Methods

create_class(name, _resource) click to toggle source
# File lib/admin_it/filters/filter.rb, line 48
def create_class(name, _resource)
  name = name.ensure_symbol!
  base = self
  Class.new(base) do
    @filter_name, @resource = name, _resource
    @entity_class = @resource.entity_class
    import_data_module(base)
  end
end
default_display_name() click to toggle source
# File lib/admin_it/filters/filter.rb, line 58
def default_display_name
  filter_name
end

Public Instance Methods

apply(collection) click to toggle source
# File lib/admin_it/filters/filter.rb, line 126
def apply(collection)
  collection
end
dump() click to toggle source
# File lib/admin_it/filters/filter.rb, line 103
def dump
  args = []
  opts = {}
  result = ''
  run_callbacks :save, arguments: { arguments: args, options: opts } do
    result = "#{name}"
    unless args.empty? && opts.empty?
      args.concat(opts.map { |k, v| "#{k}:#{v}" })
      result << "(#{args.join(',')})"
    end
  end
  result
end
load(str) click to toggle source
# File lib/admin_it/filters/filter.rb, line 117
def load(str)
  return if str.nil?
  args = parse_arguments(str)
  unless args.empty?
    opts = args.extract_options!
    run_callbacks :load, arguments: { arguments: args, options: opts }
  end
end
name() click to toggle source
# File lib/admin_it/filters/filter.rb, line 99
def name
  @name ||= self.class.filter_name
end

Protected Instance Methods

create_argument(arg) click to toggle source
# File lib/admin_it/filters/filter.rb, line 201
def create_argument(arg)
  case arg
  when String then "\"#{arg.gsub('"', '\\"')}\""
  else arg.to_s
  end
end
param_action(str) click to toggle source
# File lib/admin_it/filters/filter.rb, line 150
def param_action(str)
  case str
  when '+' then :add
  when '-' then :remove
  else nil
  end
end
parse_argument(arg) click to toggle source
# File lib/admin_it/filters/filter.rb, line 178
def parse_argument(arg)
  return arg unless arg.is_a?(String)
  arg.strip!
  sym = arg.downcase.to_sym
  return nil if NULL_VALUES.include?(sym)
  return true if TRUE_VALUES.include?(sym)
  return false if FALSE_VALUES.include?(sym)
  if (arg[0] == '\'' || arg[0] == '"') && arg[0] == arg[-1]
    return arg[1..-2]
  end
  case arg
  when OCT_REGEXP then arg.to_i(8)
  when BIN_REGEXP then arg.to_i(2)
  when HEX_REGEXP then arg.to_i(16)
  when INT_REGEXP then arg.to_i(10)
  when FLOAT_REGEXP then arg.to_f
  when DATE_REGEXP then Date.parse(arg)
  when TIME_REGEXP then Time.parse(arg)
  when DATETIME_REGEXP then DateTime.parse(arg)
  else JSON.parse(arg)
  end
end
parse_arguments(str) click to toggle source
# File lib/admin_it/filters/filter.rb, line 158
def parse_arguments(str)
  opts = {}
  args = []
  parent = self.class.parents.find do |p|
    p.const_defined?(:ARGUMENT_REGEXP)
  end
  unless parent.nil?
    str.scan(parent.const_get(:ARGUMENT_REGEXP)) do |a, o, v|
      if o.nil? || o.empty?
        action = param_action(a)
        action.nil? ? args << v : (opts[action] ||= []) << v
      else
        opts[o.to_sym] = v
      end
    end
  end
  args << opts unless opts.empty?
  args
end