filterrific 0.0.0 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,32 @@
1
+ # Filterrific Documentation
2
+
3
+ ## Word list
4
+
5
+ * Filterrific - the gem
6
+ * Filterrific::Param - individual element of a *FilterrificParamSet*.
7
+ Defines how the AR list should be filtered. Managed via instance of *FilterrificParamSet* class.
8
+ * Filterrific::ScopeNames - List of *Scope* names that are available to *Filterrific*.
9
+ * Filterrific::ParamSet - Container for *FilterrificParams*
10
+ * Filterrific::Form - a HTML form used to define *FilterrificParams*
11
+ * Scope - An ActiveRecord scope (formerly known as named_scope)
12
+
13
+ ## Brain dump
14
+
15
+ * Scenarios
16
+ * Saved search (persist FilterrificParamSet in DB)
17
+ * Will paginate integration
18
+ * Session persistence
19
+ * Defining Scopes
20
+ * Belongs_to
21
+ * Has_many
22
+ * Sorting
23
+ * Full text search (Postgres, Like, regex, Sphinx?)
24
+ * Filterrific form inputs
25
+ * checkboxes
26
+ * multi selects
27
+
28
+ ## Requirements
29
+
30
+ * Rails3
31
+
32
+
@@ -99,4 +99,8 @@ Filterrific relies heavily on scopes. Each filter dimension has its own scope. F
99
99
  easy to shuttle user settings to your controllers and models for queries, and back to the views.
100
100
 
101
101
 
102
+ Related projects
103
+ ================
104
+
105
+ * http://github.com/plataformatec/has_scope
102
106
 
data/doc/todo.md ADDED
@@ -0,0 +1,8 @@
1
+ # Implementation Plan for Filterrific
2
+
3
+ ## Version 0.1.0: Rebuild current Rails2 functionality
4
+
5
+ ## Add DSL and scope generator
6
+
7
+ ## Add Filterrific form builder
8
+
data/doc/workflow.md ADDED
@@ -0,0 +1,17 @@
1
+ # Workflow to Maintain This Gem
2
+
3
+ 1. Update code and commit it.
4
+ 2. Bump the version with one of the rake tasks:
5
+ * `rake version:bump:patch` 1.5.3 -> 1.5.4
6
+ * `rake version:bump:minor` 1.5.3 -> 1.6.0
7
+ * `rake version:bump:major` 1.5.3 -> 2.0.0
8
+ * `rake version:write MAJOR=2 MINOR=3 PATCH=6` 1.5.3 -> 2.3.6
9
+ 3. Add entry to CHANGELOG:
10
+ * h1 for major release
11
+ * h2 for minor release
12
+ * h3 for patch release
13
+ 4. Release it.
14
+ * `rake release`
15
+ * Optionally release it to Rubyforge: `rake rubyforge:release`
16
+ * Optionally release it to Gemcutter: `rake gemcutter:release`
17
+ 5. Rinse and repeat
@@ -0,0 +1,78 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{filterrific}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Jo Hund"]
12
+ s.date = %q{2010-08-01}
13
+ s.description = %q{
14
+ The Rails User Interface solution for filtering your ActiveRecord lists:
15
+
16
+ * Built from the ground up for Rails3
17
+ * Build filter forms with ease
18
+ * Filter ActiveRecord lists using AR scopes
19
+ * Shuttle filter parameters from view to controller to model in a RESTful way
20
+ * Auto-generate scopes for AR associations (Planned)
21
+ * Form builder for filter UI forms (Planned)
22
+ }
23
+ s.email = %q{jhund@clearcove.ca}
24
+ s.extra_rdoc_files = [
25
+ "LICENSE",
26
+ "README.rdoc"
27
+ ]
28
+ s.files = [
29
+ ".gitignore",
30
+ "CHANGELOG.md",
31
+ "LICENSE",
32
+ "README.rdoc",
33
+ "Rakefile",
34
+ "VERSION",
35
+ "doc/Overview diagram.graffle/QuickLook/Preview.pdf",
36
+ "doc/Overview diagram.graffle/QuickLook/Thumbnail.tiff",
37
+ "doc/Overview diagram.graffle/data.plist",
38
+ "doc/Overview diagram.graffle/image1.tiff",
39
+ "doc/documentation.md",
40
+ "doc/ideas.txt",
41
+ "doc/todo.md",
42
+ "doc/workflow.md",
43
+ "filterrific.gemspec",
44
+ "lib/filterrific.rb",
45
+ "lib/filterrific/model_mixin.rb",
46
+ "lib/filterrific/param_set.rb",
47
+ "lib/filterrific/railtie.rb",
48
+ "lib/filterrific/view_helpers.rb",
49
+ "test/helper.rb",
50
+ "test/test_filterrific.rb"
51
+ ]
52
+ s.homepage = %q{http://github.com/jhund/filterrific}
53
+ s.rdoc_options = ["--charset=UTF-8"]
54
+ s.require_paths = ["lib"]
55
+ s.rubygems_version = %q{1.3.6}
56
+ s.summary = %q{The Rails User Interface solution for filtering your ActiveRecord lists.}
57
+ s.test_files = [
58
+ "test/helper.rb",
59
+ "test/test_filterrific.rb"
60
+ ]
61
+
62
+ if s.respond_to? :specification_version then
63
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
64
+ s.specification_version = 3
65
+
66
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
67
+ s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
68
+ s.add_development_dependency(%q<yard>, [">= 0"])
69
+ else
70
+ s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
71
+ s.add_dependency(%q<yard>, [">= 0"])
72
+ end
73
+ else
74
+ s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
75
+ s.add_dependency(%q<yard>, [">= 0"])
76
+ end
77
+ end
78
+
data/lib/filterrific.rb CHANGED
@@ -0,0 +1,11 @@
1
+ # = The Rails User Interface Solution for Filtering Your ActiveRecord Lists
2
+ #
3
+ module Filterrific
4
+
5
+ if defined?(Rails) && Rails::VERSION::MAJOR == 3
6
+ require 'filterrific/railtie'
7
+ else
8
+ raise "Filterrific requires Rails 3"
9
+ end
10
+
11
+ end
@@ -0,0 +1,48 @@
1
+ module Filterrific::ModelMixin
2
+
3
+ def self.included(base)
4
+ base.send :extend, ClassMethods
5
+ end
6
+
7
+ module ClassMethods
8
+
9
+ # Adds filterrific behavior to class when called like so:
10
+ #
11
+ # filterrific, :defaults => { :sorted_by => "created_at_asc" }
12
+ #
13
+ def filterrific(options = {})
14
+ # send :include, InstanceMethods
15
+ cattr_accessor :default_filterrific_params
16
+ self.default_filterrific_params = (options[:defaults] || {}).stringify_keys
17
+ end
18
+
19
+ # Returns AR relation based on given filterrific_param_set.
20
+ #
21
+ # ModelClass.filterrific_find(@filterrific_param_set)
22
+ #
23
+ def filterrific_find(filterrific_param_set)
24
+ unless filterrific_param_set.is_a?(Filterrific::ParamSet)
25
+ raise(ArgumentError, "Invalid Filterrific::ParamSet: #{ filterrific_param_set.inspect }")
26
+ end
27
+
28
+ # set initial ar_proxy to including class
29
+ ar_proxy = self
30
+
31
+ # apply filterrific params
32
+ self.filterrific_scope_names.each do |scope_name|
33
+ scope_param = filterrific_param_set.send(scope_name)
34
+ next if scope_param.blank? # skip blank scope_params
35
+ ar_proxy = ar_proxy.send(scope_name, scope_param)
36
+ end
37
+
38
+ ar_proxy
39
+ end
40
+
41
+ # Returns Array all filter scope names
42
+ def filterrific_scope_names
43
+ scopes.map{ |s| s.first.to_s }
44
+ end
45
+
46
+ end
47
+
48
+ end
@@ -0,0 +1,73 @@
1
+ module Filterrific
2
+
3
+ # FilterParamSet is a container to store FilterParams for a resource class that is filterrific
4
+ class ParamSet
5
+
6
+ attr_accessor :resource_class
7
+
8
+ def initialize(resource_class, filterrific_params = {})
9
+
10
+ self.resource_class = resource_class
11
+
12
+ # use either passed in options or resource class' default list_options
13
+ # don't merge them. This causes trouble if an option is set to nil
14
+ # by the user, then it will be overriden by default list_options
15
+ # You might wonder "what if I want to change only one thing from the defaults?"
16
+ # Persistence, baby. By the time you submit changes to one dimension, all the others
17
+ # will be already initialized with the defaults.
18
+ filterrific_params = resource_class.default_filterrific_params if filterrific_params.blank?
19
+
20
+ # force all keys to strings
21
+ filterrific_params.stringify_keys!
22
+
23
+ # condition filterrific_params
24
+ filterrific_params.each do |key, val|
25
+ case
26
+ when val.is_a?(Proc)
27
+ # evaulate Procs
28
+ filterrific_params[key] = val.call
29
+ when val.is_a?(Array)
30
+ # type cast integers
31
+ filterrific_params[key] = filterrific_params[key].map { |e| e =~ /^\d+$/ ? e.to_i : e }
32
+ when val =~ /^\d+$/
33
+ # type cast integers
34
+ filterrific_params[key] = filterrific_params[key].to_i
35
+ end
36
+ end
37
+
38
+ # Define attr_accessor for each FilterrificScope
39
+ # on Filterrific::ParamSet instance and assign values from options
40
+ resource_class.filterrific_scope_names.each do |scope_name|
41
+ self.class.send(:attr_accessor, scope_name)
42
+ v = filterrific_params[scope_name.to_s]
43
+ self.send("#{ scope_name }=", v) if v.present?
44
+ end
45
+
46
+ end
47
+
48
+ # Returns FilterrificParams as hash (used for URL params and serialization)
49
+ def to_hash
50
+ {}.tap { |h|
51
+ resource_class.filterrific_scope_names.each do |scope_name|
52
+ param_value = self.send(scope_name)
53
+ case
54
+ when param_value.blank?
55
+ # do nothing
56
+ when param_value.is_a?(Proc)
57
+ # evaluate Proc so it can be serialized
58
+ h[scope_name.to_s] = param_value.call
59
+ else
60
+ h[scope_name.to_s] = param_value
61
+ end
62
+ end
63
+ }
64
+ end
65
+
66
+ # Returns true if this Filterrific::ParamSet is not the model's default.
67
+ def customized?
68
+ resource_class.default_filterrific_params != to_hash
69
+ end
70
+
71
+ end
72
+
73
+ end
@@ -0,0 +1,25 @@
1
+ require 'filterrific'
2
+ require 'rails'
3
+
4
+ module Filterrific
5
+
6
+ class Railtie < Rails::Railtie
7
+
8
+ initializer "filterrific.model_mixin" do |app|
9
+ require 'filterrific/model_mixin'
10
+ ActiveRecord::Base.send(:include, Filterrific::ModelMixin)
11
+ require 'filterrific/param_set'
12
+ end
13
+
14
+ initializer "filterrific.view_helpers" do |app|
15
+ require 'filterrific/view_helpers'
16
+ ActionView::Base.send(:include, Filterrific::ViewHelpers)
17
+ end
18
+
19
+ # to_prepare block is executed once in production and before each request in development
20
+ # config.to_prepare do
21
+ # end
22
+
23
+ end
24
+
25
+ end
@@ -0,0 +1,35 @@
1
+ module Filterrific::ViewHelpers
2
+
3
+ # renders javascript to observe filter form
4
+ def observe_list_options_filter(options = {})
5
+ # default options
6
+ options = {
7
+ :form_id => 'list_options_filter',
8
+ :method => :get,
9
+ :live_field_ids => [],
10
+ :url => url_for(:controller => controller.controller_path, :action => controller.action_name)
11
+ }.merge(options)
12
+ # observe the entire form regularly (triggers e.g. when a select option is clicked)
13
+ # observe_form(
14
+ # options[:form_id],
15
+ # :function => observer_ajax_javascript(options, 'value'),
16
+ # :frequency => 0.5
17
+ # )
18
+ end
19
+
20
+ def render_list_options_spinner
21
+ %(<span id="list_options_spinner" class="spinner" style="display:none;"> </span>)
22
+ end
23
+
24
+ private
25
+
26
+ def observer_ajax_javascript(options, parameters_to_be_submitted)
27
+ # options = {
28
+ # :with => parameters_to_be_submitted,
29
+ # :loading => "$('#list_options_spinner').show()",
30
+ # :complete => "$('#list_options_spinner').hide()"
31
+ # }.merge(options)
32
+ # remote_function(options)
33
+ end
34
+
35
+ end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
+ - 1
7
8
  - 0
8
- - 0
9
- version: 0.0.0
9
+ version: 0.1.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Jo Hund
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-07-30 00:00:00 -07:00
17
+ date: 2010-08-01 00:00:00 -07:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -41,7 +41,7 @@ dependencies:
41
41
  version: "0"
42
42
  type: :development
43
43
  version_requirements: *id002
44
- description: Add filter controls to your ActiveRecord lists and persist filter settings via session or DB
44
+ description: "\n The Rails User Interface solution for filtering your ActiveRecord lists:\n\n * Built from the ground up for Rails3\n * Build filter forms with ease\n * Filter ActiveRecord lists using AR scopes\n * Shuttle filter parameters from view to controller to model in a RESTful way\n * Auto-generate scopes for AR associations (Planned)\n * Form builder for filter UI forms (Planned)\n "
45
45
  email: jhund@clearcove.ca
46
46
  executables: []
47
47
 
@@ -51,12 +51,26 @@ extra_rdoc_files:
51
51
  - LICENSE
52
52
  - README.rdoc
53
53
  files:
54
+ - .gitignore
55
+ - CHANGELOG.md
54
56
  - LICENSE
55
57
  - README.rdoc
56
58
  - Rakefile
57
59
  - VERSION
58
- - design/ideas.txt
60
+ - doc/Overview diagram.graffle/QuickLook/Preview.pdf
61
+ - doc/Overview diagram.graffle/QuickLook/Thumbnail.tiff
62
+ - doc/Overview diagram.graffle/data.plist
63
+ - doc/Overview diagram.graffle/image1.tiff
64
+ - doc/documentation.md
65
+ - doc/ideas.txt
66
+ - doc/todo.md
67
+ - doc/workflow.md
68
+ - filterrific.gemspec
59
69
  - lib/filterrific.rb
70
+ - lib/filterrific/model_mixin.rb
71
+ - lib/filterrific/param_set.rb
72
+ - lib/filterrific/railtie.rb
73
+ - lib/filterrific/view_helpers.rb
60
74
  - test/helper.rb
61
75
  - test/test_filterrific.rb
62
76
  has_rdoc: true
@@ -88,7 +102,7 @@ rubyforge_project:
88
102
  rubygems_version: 1.3.6
89
103
  signing_key:
90
104
  specification_version: 3
91
- summary: Add filter controls to your ActiveRecord lists and persist filter settings via session or DB
105
+ summary: The Rails User Interface solution for filtering your ActiveRecord lists.
92
106
  test_files:
93
107
  - test/helper.rb
94
108
  - test/test_filterrific.rb