Sha256: 412334e800f2076077b781f401c08b7638088154f3ba3756a037623e5c9cf06e

Contents?: true

Size: 1.33 KB

Versions: 5

Compression:

Stored size: 1.33 KB

Contents

module AdminIt
  class ValueFilter < FieldFilter
    attr_reader :values

    def initialize(*values, **opts)
      @values = values.map { |v| parse_argument(v) }.uniq
    end

    before_save do |arguments: [], options: {}|
      arguments.concat(@values.map { |v| create_argument(v) })
    end

    def change(str)
      return if str.nil? || !str.is_a?(String) || str.empty?
      @values = [] unless /[+\-]/ =~ str
      str.split(',').each do |param|
        param.strip!
        if param[0] == '-'
          @values.delete_if { |v| v == parse_argument(param[1..-1]) }
        else
          param = param[1..-1] if param[0] == '+'
          @values << parse_argument(param)
        end
      end
      @values.uniq!
    end

    def all_values(collection = nil, &block)
      collection ||= []
      enum = Enumerator.new do |yielder|
        values = collection.map { |e| self.class.field.read(e) }
        values.uniq.each do |value|
          yileder << {
            value: value, count: values.count { |v| v == value }
          }
        end
      end
      block_given? ? enum.each(&block) : enum
    end

    def value(val)
      create_argument(val)
    end

    def apply(collection)
      return collection if @values.empty?
      collection.select do |entity|
        @values.include?(self.class.field.read(entity))
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
admin_it-1.0.5 lib/admin_it/filters/value_filter.rb
admin_it-1.0.4 lib/admin_it/filters/value_filter.rb
admin_it-1.0.3 lib/admin_it/filters/value_filter.rb
admin_it-1.0.2 lib/admin_it/filters/value_filter.rb
admin_it-1.0.1 lib/admin_it/filters/value_filter.rb