SampleFilter

SampleFilter is a Rails Engine plugin that makes to filter and sort ActiveRecord lists.

Installation

Add this line to your application's Gemfile:

gem 'sample_filter'

And then execute:

$ bundle

Or install it yourself as:

$ gem install sample_filter

Install javascripts air-datepicker dependency:

$ yarn add air-datepicker

Require SampleFilter javascripts with air-datepicker dependency in your app/assets/javascripts/application.js:

//= require jquery
//= require air-datepicker/dist/js/datepicker.min
//= require sample_filter/script

And then require styles in your app/assets/stylesheets/application.css:

/*
 *= require air-datepicker/dist/css/datepicker.min
 *= require sample_filter/style
 */

Usage

Configuring Models

The SampleFilter method in your models accepts options to configure its modules. For example:

class Entity < ApplicationRecord
  sample_filter(
    {
      title: { type: :string },
      amount: { type: :number },
      created_at: { type: :date, default_value: { from: '09.10.2016', to: '17.12.2023' } },
      kind: {
        type: :list,
        values: { red: 1, green: 2 },
        default_value: 2
      },
      status: {
        type: :list,
        values: [:active, :inactive],
        default_value: :inactive
      },
      confirmed: { type: :boolean, default_value: true },
      sort: {
        type: :sorting,
        values: [:id, :amount, :created_at],
        default_value: 'amount_desc',
        hidden_input: true # this option transform select to hidden input in form
      }
    }
  )
end

for update values on demand in list or sorting fields, call method

Entity.filter_update_value(:kind, [:black, :white])
# or hash
Entity.filter_update_value(:kind, { black: 3, white: 4 })

Form helpers

<%= form_for_filter(Entity, as: :sample_filter, block: :after, html: { method: :get, id: :sample_filter}) do %>
  <%= label_tag 'custom_input' %>
  <%= text_field_tag 'custom_input' %>
<% end %>

also form_for_filter include form action options:

options[:url] ||= url_for(
  :controller => controller.controller_name,
  :action => controller.action_name
)

Table sorting link

<%= sort_link(Entity, :sorting_field) %>

Controller

In your index method:

@entites = Entity.filtered(params[:sample_filter])

I18n

SampleFilter uses labels with I18n:

en:
  sample_filter:
    entity:
      fields:
        title: Title
        amount: Amount
        created_at: Created At
        kind: Type
        status: Status
        confirmed: Confirmed status
        sort: Sorting
      list:
        kind:
          all_item: All colors
          red: Red color
          green: Green color
        status:
          all_item: All statuses
          active: Active status
          inactive: Inactive status
        confirmed:
          all_item: All
          'true': Confirmed
          'false': Unconfirmed
        sort:
          id:
            asc: id ↓
            desc: id ↑
          created_at:
            asc: created_at ↓
            desc: created_at ↑
          amount:
            asc: amount ↓
            desc: amount ↑
      buttons:
        submit: Submit
        clear_form: Clear Form

License

The gem is available as open source under the terms of the MIT License.